2주차 실습의 주제는 "풍선을 지켜라" 이다.
void Update()
{
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.position = new Vector3(mousePos.x, mousePos.y, 0);
}
void Start()
{
float x = Random.Range(-3f, 3f);
float y = Random.Range(3f, 5f);
transform.position = new Vector3(x, y, 0);
}
void Start()
{
float size = Random.Range(0.03f, 0.1f);
transform.localScale = new Vector3(size, size, 0);
}
square 오브젝트 prefab으로 만들기
GameManager script로 가져오기
public GameObject square;
void Start()
{
InvokeRepeating("makeSquare", 0.0f, 0.3f); // ("함수 이름", 몇 초 후에 실행시켜라, 몇초마다)
}
void makeSquare()
{
Instantiate(square);
}
GameManager로 UI Text 받아와서 갱신하기
using UnityEngine.UI;
public Text timeText;
float alive = 0f;
void Update()
{
alive += Time.deltaTime;
timeText.text = alive.ToString("N2");
}
GameManager Singleton 처리
public static GameManager I;
private void Awake()
{
I = this; // 싱글톤 처리
}
GameManager에 게임 종료 함수 만들기
public GameObject endPanel;
public void gameOver()
{
Time.timeScale = 0.0f;
endPanel.SetActive(true);
}
balloon과 square 충돌 시 종료하게 만들기
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "geguri")
{
GameManager.I.gameOver();
}
}
GameManager에서 thisScoreText 갱신
public Text thisScoreText;
public void gameOver()
{
...
thisScoreText.text = alive.ToString("N2");
...
}
경과한 시간과 기록이 다른 이유
balloon과 square가 만나는 순간, square는 GameManager를 호출
GameManager는 그 순간의 시간을 보고 thisScoreText에 적음 -> 이 순간에도 Update는 계속 실행되고 있다!
해결 방법 : bool 변수로 게임 종료 시 update도 실행되지 않도록 한다
bool isRunning = true;
void Update()
{
if (isRunning)
{
alive += Time.deltaTime;
timeText.text = alive.ToString("N2");
}
}
public void gameOver()
{
isRunning = false;
...
}
GameManager script에 retry() 추가
using UnityEngine.SceneManagement;
public void retry()
{
SceneManager.LoadScene("MainScene");
}
void Start()
{
Time.timeScale = 1f;
...
}
PlayerPrefs.SetFloat("bestScore", 숫자값);
PlayerPrefs.SetString("bestScore", 문자열);
숫자값 = PlayerPrefs.GetFloat("bestScore";
문자열 = PlayerPrefs.GetString("bestScore");
PlayerPrefs.HasKey("bestScore");
PlayerPrefs.DeleteAll();
GameManager script
public Text maxScoreText;
public void gameOver()
{
...
if (PlayerPrefs.HasKey("bestScore") == false)
{
PlayerPrefs.SetFloat("bestScore", alive);
} else
{
if (alive > PlayerPrefs.GetFloat("bestScore"))
{
PlayerPrefs.SetFloat("bestScore", alive);
}
}
float maxScore = PlayerPrefs.GetFloat("bestScore");
maxScoreText.text = maxScore.ToString("N2");
}
GameManager에서 isDie 값 갱신해주기
public Animator anim;
public void gameOver()
{
...
anim.SetBool("isDie", true);
...
}
애니메이션이 실행할 시간을 줄 수 있도록 timeScale 값 변경 전에 지연 주기
public void gameOver()
{
...
Invoke("timeStop", 0.5f); // 0.5초 후에 timeStop 함수를 실행시켜라
}
void timeStop()
{
Time.timeScale = 0f;
}