Unity_개발일지_12

홍신영·2024년 10월 15일
0

Unity

목록 보기
14/62

타이머 만들기

타이머가 0이되면 게임이 멈추게 구현해보자.

[SerializeField][Range(1,120)] private int maxTime;
private float currentTime;

public TMP_Text TimerTxt;

//게임 시간 타이머
public void Timer()
{
    currentTime -= Time.deltaTime; //deltaTime을 정수형으로 형변환하면, 타이머 작동안함.
    TimerTxt.text = currentTime.ToString("F2"); //소숫점 2자리까지 표시.

    if(currentTime <= 0)
    {
        GameManager.Instance.PauseGame();
    }
}

private void Start()
{
    currentTime = maxTime;
}

private void FixedUpdate()
{
    Timer();
}

위 코드를 작성하며 문제가 있었다.

  • 나는 초 단위를 즉 int를 사용하려 했지만, deltaTime은 float였다.

    여기서 강제로 (int)를 붙혀 형변환을 해보았는데 시간이 아에 멈추게 되어서 그냥 float으로 하기로 하고 ToString("F2")로 소숫점 2자리까지만 나오도록 구현하였다. F0 하면 아에 사라지니 이렇게 해도 좋을 듯하다.

씬 불러오기

이름을 씬 매니저로 하니, 이거 메소드랑 이름이 같아서 사용을 할 수가 없어서 다른 이름으로 하는 것이 좋다..

public enum SceneName
{
    Lobby,
    SelectMode,
    InGame
}

//씬 불러오기
public void ChangeScene(int sceneIndex)
{
    SceneName scene = (SceneName)sceneIndex; //정수받고 -> enum으로
    string sceneName = scene.ToString(); //enum -> string
    SceneManager.LoadScene(sceneName);
}

//enum은 유니티 UI버튼 onclick에 안보임. int,string,float만 매개변수로 받을수 있음.
public void ChangeScene2(SceneName sceneName)
{
    SceneManager.LoadScene(sceneName.ToString());
}

어쨋든 코드를 보면 enum으로 각 씬의 이름을 받고, enum을 string으로 바꾸어 씬로드에 전달하여 씬 전환을 하려했지만,,,,

문제가 유니티 UI 버튼에 Onclick은 매개변수로 int, float, string의 값만 사용할 수 있었다.
public으로 해도 안보인다.

그래서 enum은 아무 설정 안하면 0부터 올라가니(0,1,2,3), 매개변수로 정수를 받아 enum에 넣어주고, enum을 string으로 바꾸어 주어 씬로드를 하게 구현하였다. 사실 (1)이런식으로 하는거나 똑같긴 하다..하 ㅋㅋ나중에 더 좋은 방법을 찾아봐야겠다.

Event로 점수, 목숨(생명) 뿌려주기

게임에서 점수가 올라가면, 혹은 목숨이 3개인데 죽는다면 이러한 다양한 이벤트가 일어날 때, 변수값을 전달해주기 위해 이벤트를 사용했다.

 private int score; //점수
 private int life = 3; //임의로 목숨 3개

 public event Action<int> OnScoreChanged;
 public event Action<int> OnLifeChanged;

 public int Life
 {
     get => life;
     set
     {
         //라이프 값이 변하면
         if(life != value)
         {
             life = value;
             OnLifeChanged?.Invoke(life);
         }
     }
 }

 public int Score
 {
     get => score;
     set
     {
         if(score != value)
         {
             score = value;
             OnScoreChanged?.Invoke(score);
         }
     }
 }

내가 뿌려줄 자료형은 int이기에 Action해주어 이벤트 만들고,
호출을 프로퍼티에 넣어주었다.
Life프로퍼티 처럼 get으로 private에 있는 life를 넣어주고, set에서 life값이 바뀌었다면, 바뀐 값으로 life를 바꾸어주고 이벤트 발생으로 life를 넘어준다.

profile
게임 클라이언트 개발자

0개의 댓글