타이머 만들기
타이머가 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();
}
위 코드를 작성하며 문제가 있었다.
씬 불러오기
이름을 씬 매니저로 하니, 이거 메소드랑 이름이 같아서 사용을 할 수가 없어서 다른 이름으로 하는 것이 좋다..
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를 넘어준다.