Unity BootCamp

네번째 글, Unity 미니프로젝트 정리

anvil925 2025. 1. 25. 15:27
728x90
반응형

미니프로젝트에서 어떤 코드를 공부하고, 사용하여 어떤방식으로 Unity에서 구현되고 사용되었는지에 대해 정리를 해보려고 한다.

 

이번 프로젝트에서 내가 맡은 것은 결과화면 도출과 씬 전환 로딩 애니메이션을 만드는 것이였다.

이렇게 게임의 성공과 실패여부에 따라 띄워지는 화면을 달리하여 선택의 폭을 달리하였다.

if (cardCount == 0)
{
Invoke("TimeStop", 2f);
//Time.timeScale = 0.0f;
level += 1;

Scene scene = GetCurrentScene();
if (scene.name == "Main1Scene")
{
PlayerPrefs.SetString("Main1Scene", scene.name);
PlayerPrefs.SetString("ContinueBtn", "ContinueBtn");
}
else if (scene.name == "Main2Scene")
{
PlayerPrefs.SetString("Main2Scene", scene.name);
Debug.Log("main2Clear");
Debug.Log(PlayerPrefs.HasKey("Main2Scene"));
}
else if (scene.name == "Main3Scene")
{
PlayerPrefs.SetString("Main3Scene", scene.name);
Achievements.SetActive(true);
Animator achAnim = Achievements.GetComponent<Animator>();
achAnim.SetTrigger("isActivate");
audioSource.PlayOneShot(matchClip);
}

elapsedTime = Time.time - startTime;

if (level > 3)
{
level = 3;
}
if (elapsedTime < bestTime)
{
bestTime = elapsedTime;
PlayerPrefs.SetFloat("BestTime", bestTime);
PlayerPrefs.Save();
}
CrealMSg.SetActive(true);
CurrentTimeTxt.text = $"{elapsedTime:F1}";
BestTimeTxt.text = $"{bestTime:F1}";

audioSource.ignoreListenerPause = true;
audioSource.PlayOneShot(successClip, 0.7f);
Result.SetActive(true);
retry.SetActive(true);
if(nextLv != null)
nextLv.SetActive(true);
Invoke("TimeStop", 2f);

코드를 살펴보면 if문을 사용해 카드카운트가 0(모든 카드를 맞췄을 시)단계가 총 3단계로 나누어져 있기에 2단계까지는 클리어시 다음단계버튼을 활성화 시킬수 있도록 하고 elapsedTime을 활용해 현재기록과 최고기록을 저장하기위해 PlayerPrefs에 저장할 수 있게 하였다.

게임진행 방식이 라운드별 설정해둔 타이머가 줄어드는 방식이여서 어떤식으로 최고기록과 현재기록을 측정해야 할지를 고민했다.

그래서 나온 코드가 elapsedTime=Time.time-startTime; 을 활용하였다. 

elapsedTime은 private로 선언해두고 게임시작 후 흘러간 시간이 낮을수록 (카드를 빠르게 맞췄을 수록)bestTime이 될 수 있게 또는 CurrentTimeTxt에 표시될 수 있게 PlayerPrefs에 저장해놓고 다시플레이를 하더라도 베스트기록은 유지되거나 갱신될 수 있게 코드를 짜고 결과화면에 도출될 수 있도록 코드를 짰다.

여기서 주의하고 기억해 둬야 할 것은

 Time.time

 **Time.timeScale**의 영향을 받습니다.

 게임 속도 조정에 따른 경과 시간을 계산할 때 유용.

 Time.realtimeSinceStartup

 **Time.timeScale**의 영향을 받지 않습니다.

 실제 경과 시간을 측정할 때 유용.

 

실패시에도 이와 비슷하게 

if (time <= endtime)
{
Time.timeScale = 0f;
Result.SetActive(true);
retry.SetActive(true);
if (cardCount > 0)
{
audioSource.PlayOneShot(failClip, 0.02f);
FailMsg.SetActive(true);
}

이런식으로 사용이 되었다.

다음으로는 씬을 전환할때 로딩화면같은 것을 만들었다.

위에 짤을 보면 페이드 인, 아웃 느낌으로 씬 전환마다 로딩화면 같이 추가해 주었다 간단하게 만들수 있을 줄 알았는데 처음 만들다 보니 생각보다 까다로운게 많았다.

저렇게 우선 빈오브트안에 캔버스와 원하는 이미지를 넣고 프리팹화 시켜 애니메이션을 두개를 연결해주고 트리거를 만들어 연결해준다. 

using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI; // 버튼 컴포넌트를 사용하기 위해 필요

public class SceneLoader : MonoBehaviour
{
public Animator transition;
public float transitionTime = 1f;
public Button loadSceneButton;
public void LoadNextLevel()
{
StartCoroutine(LoadLevel(SceneManager.GetActiveScene().buildIndex + 1));
}

IEnumerator LoadLevel(int levelIndex)
{
// Play animation
transition.SetTrigger("Start");
// Wait
yield return new WaitForSeconds(transitionTime);
// Load scene
SceneManager.LoadScene(levelIndex);
}
}

나는 위같이 씬로더라는 스크립트를 만들어 관리해주었다 스크립트를 만들어 두고 프리팹화 시켜놓으면 다른 씬에 프리팹해놓은걸 넣어놓기만해도 활용이 가능하고 스크립트를 수정한다면 더 넓은 방향으로 활용이 가능할거 같아 씬로더는 조금 더 공부해서 애니메이션을 적절히 사용할 수 있도록 만드는게 목표이다. 내가 참고한 유튜브 동영상 출처 

https://www.youtube.com/watch?v=CE9VOZivb3I

 

이 외에도 너무 많은 코드가 사용되었고 정리가 너무 부족지만 다음 주부터는 C#에 집중을 해야해서 개인적인 공부가 아닌이상 당분간 Unity관련 포스팅보다는 C#관련 정리글 TIL위주로 작성될 예정이다.

728x90
반응형