점수관리는 정글 동기가 알려준 PlayerPrefs를 사용해보자. 점수가 로컬에 저장되고 불러와서 사용할 수 있다고 함.
싱글톤패턴으로 구현할건데(사실 싱글톤 패턴으로밖에 할줄 모른다..;;ㅎㅎ), 싱글톤으로 구현했을 때의 장점은 다음과 같다.
// gameManager.cs
using UnityEngine;
using UnityEngine.SocialPlatforms.Impl;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private int currentScore = 0;
private int bestScore = 0;
void Awake()
{
if (Instance == null) Instance = this;
else Destroy(gameObject);
// 저장된 BestScore가 있다면 로드
bestScore = PlayerPrefs.GetInt("BestScore", 0);
}
public void AddScore(int amount)
{
currentScore += amount;
if (currentScore > bestScore)
{
bestScore = currentScore;
PlayerPrefs.SetInt("BestScore", bestScore);
}
// 점수 변경되었으니 UI 갱신
ScoreUI.Instance.UpdateScoreUI(currentScore, bestScore);
}
public void ResetScore()
{
currentScore = 0;
ScoreUI.Instance.UpdateScoreUI(currentScore, bestScore);
}
}
쓰레기통 내부에 쓰레기가 잘 골인되었나 검사할 콜라이더를 추가했다. 쓰레기가 들어오면, 올바른 태그를 가진 쓰레기인지 검사하고 맞다면 점수를 증가시키고, 아니면 삐삐 효과음을 넣을거임.
들어온 쓰레기를 어떻게 검사할까 고민해봤는데, 각 쓰레기에는 종류에 해당하는 태그가 달려 있으므로, 쓰레기통 별로 받아들일 쓰레기를 인스펙터에서 입력하면 될듯?
// bin.cs
using UnityEngine;
public class Bin : MonoBehaviour
{
// 이 쓰레기통이 받아들일 쓰레기 태그를 Inspector에서 지정할 수 있게 함.
public string acceptableTag;
void OnTriggerEnter(Collider other)
{
// 충돌한 객체의 태그를 확인
if (other.CompareTag(acceptableTag))
{
// 태그가 맞으면 점수 증가
GameManager.Instance.AddScore(1);
}
else
{
// 태그가 안 맞으면 삐삐 효과음을 넣으면 됨.
}
// 쓰레기 제거 -> 꽉 찰 수도 있으니.
Destroy(other.gameObject);
}
}
일단은 간단하게 현재 점수, 최고 점수를 표시하는 UI를 구현해보자.
CurrentScore, BestScore TMP 생성후 위치를 조절해주기.
// ScoreUI.cs
using UnityEngine;
using TMPro;
public class ScoreUI : MonoBehaviour
{
public static ScoreUI Instance;
[SerializeField] private TextMeshProUGUI currentScoreText;
[SerializeField] private TextMeshProUGUI bestScoreText;
void Awake()
{
if (Instance == null) Instance = this;
else Destroy(gameObject);
}
public void UpdateScoreUI(int currentScore, int bestScore)
{
currentScoreText.text = "Score: " + currentScore.ToString();
bestScoreText.text = "Best: " + bestScore.ToString();
}
}
private로 설정된 변수를 Inspector 상에서만 접근 가능하게 해주는 문법이다.
즉 스크립트 외부에서는 private과 같은 역할을 하지만, Inspector 에서는 접근이 가능하다.