카테고리 없음

[Unity 2D]장애물 피하기 게임 (3)

tangent0426 2024. 10. 16. 18:00
728x90
반응형

 


저번 시간에 적 개체를 생성 및 랜덤 하게 위치를 생성하게 만들어 보았습니다.

이번 시간에는 싱글톤과 UGUI & 스코어 제작을 해보도록 하겠습니다.


싱글톤, UGUI & 스코어 제작

싱글톤 코드

싱글톤 제작을 위해 GameManger에 싱글톤을 적용하여

최소 한번만 메모리에 할당하고 인스턴스를 만들어 사용하는 패턴과

싱글톤 패턴을 이용하여 다른 오브젝트에서 매니저로의 접근이 쉽게 만들수가 있습니다.

public class GameManager : MonoBehaviour
{

    private static GameManager _instance;
    public static GameManager Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType<GameManager>();
            }
            return _instance;
        }
    }
}
//GameManager 코드
//객체를 피할 때 점수를 1점씩 흭득하게 코드 제작
    [SerializeField]
    private GameObject Enemy;

    private int score; //int형 변수를 생성

     void Start()
    {
        Screen.SetResolution(768, 1024, false);
    }
    void Update()
    {
    }
//Scroe()함수를 호출 할 때마다 score변수에 1을 더하게 됨
    public void Score()
    {
        score++; //Scroe()함수를 만든 뒤 Scroe++;을 삽입
        Debug.Log("Score" + score); 
    }
//Enemy코드
 void Update()
    {
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Ground")
        {
            //Ground와 충돌할 때 If문안에 GameManger.Instance.Scroe();를 호출
            GameManager.Instance.Score();
            animator.SetTrigger("EnemyTrigger");
            
        }
        if (collision.gameObject.tag == "Player")
        {
            Destroy.(this.gameObject);
        }
    }​

 

UGUI & 스코어

0

위 영상처럼 score의 값을 로그로 나타내개 만들어 보겠습니다.

 

 

Hierachy – 우클릭 – UI – Canvas를 생성합니다.

 

 

Hierachy – Canvas – 우클릭 – UI – Text 생성합니다.

 

Text – Inspector 창에서 텍스트의 위치와 글자의 크기 색깔 등을 조절합니다.

 

 //Enemy코드
 void Update()
    {
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Ground")
        {
            //Ground와 충돌할 때 If문안에 GameManger.Instance.Scroe();를 호출
            GameManager.Instance.Score();
            animator.SetTrigger("EnemyTrigger");
            
        }
        if (collision.gameObject.tag == "Player")
        {
            Destroy.(this.gameObject);
        }
    }

 

 public void Score()
    {
            score++;
        scoreTxt.text = "Score : " + score; // 텍스트 변수에 스코어 변수를 표시
    }

 

 

GameManager 오브젝트를 선택하면 인스펙터창에서 Score Text에 Canvas – Text를 드래그합니다.

 

0

 

이번엔 게임을 실행하면 스코어가 올라가게 만들어 보겠습니다.

 

 

버튼을 누르면 게임이 시작되고 최고 점수를 표시되는 창을 생성 합니다.

Canvas에 Panel을 만들고 Button과 Text를 생성하여

Panel, Buton, Text들의 크기와 위치를 알맞게 맞춥니다.

 

 //GameManager코드
 //bestScore라는 텍스트와 panel 게임 오브젝트 변수를 생성
[SerializeField]
private Text bestScore;
[SerializeField]
private GameObject panel;
    void Start(){
    }
    void Update(){
    }

    public bool stopTrigger = true;
//GameManager Class에 GameOver함수를 만들고 bool 변수를 만들어 
//CreatepoopRoutine()의 반복문의 조건으로 넣어 줌
    public void GameOver()
    {
//gameover함수가 호출되면 stopTrigger에 false를 삽입하고 적 코루틴을 정지
        stopTrigger = false; 
        StopCoroutine(CreateEnemy1Routine());
        panel.SetActive(true);
    }

    public void GameStart()
    {
        stopTrigger = true;
        StartCoroutine(CreateEnemy1Routine());
    }
//Enemy 코드
//적 오브젝트가 Player 태그를 가진 오브젝트와 충돌할면 GameOver()함수를 호출
private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Ground")
        {
            GameManager.Instance.Score();
            animator.SetTrigger("EnemyTrigger");
            
        }
        if (collision.gameObject.tag == "Player")
        {
            GameManager.Instance.GameOver();
            Destroy(this.gameObject);
            
        }
    }
 //GameManager코드
 //Panel게임 오브젝트가 시작되면 사라지고 종료되면 나타내게 만듬
 public void GameOver()
    {
        stopTrigger = false;
        StopCoroutine(CreateEnemy1Routine());
        panel.SetActive(true);
    }
//Panel.SetActive(false); 비활성 – GameStart
//Panel.SetActive(true); 활성 – GameOver 함수에 각각 삽입
//GameStart에 StopTrigger = true;를 삽입
    public void GameStart()
    {
        stopTrigger = true;
        StartCoroutine(CreateEnemy1Routine());
        panel.SetActive(false);
    }
 //GameManager코드
 //GameOver가 되면 PlayerPrefs를 이용하여 현재의 스코어가 이전의 스코어보다 높으면 저장
 public void GameOver()
    {
        stopTrigger = false;

        StopCoroutine(CreateEnemy1Routine());
//PlayerPrefs.GetInt(“score”, 0); score라는 key의 값을 얻음
//PlayerPrefs.SetInt(“score”, 100); score라는 key에 100을 저장
        if (score >= PlayerPrefs.GetInt("BestScore", 0))
            PlayerPrefs.SetInt("BestScore", score);
        bestScore.text = PlayerPrefs.GetInt("BestScore", 0).ToString();

        panel.SetActive(true);
    }

 

이제 GameManager 코드에서 텍스트와 패널을 연결합니다.

 

 

버튼에서 OnClick의 +를 눌러서 추가합니다. 그 다음에 GameManager 오브젝트를 끌어서 연 다음,

function을 GameManager – GameStart()를 선택합니다.

 

0

 

게임을 실행하면 스코어 버튼이 정상적으로 작동하는 것을 볼 수 있습니다.

 

읽어주셔서 감사합니다.^^

반응형