유니티로 만드는 게임개발 종합반

유니티 게임 개발 2주차

도도9999 2023. 7. 21. 20:22

오늘 배울 것

- 1주차 복습

- Rise Up과 비슷한 게임

- 풍선을 지켜라!

-> 네모가 풍선에 닿으면 끝나는 게임

--> 마우스 제어, 베스트 스코어 기록, 애니메이션 전환

 

- 사용한 주요 코드 및 프로그램 사용법

 

- 오브젝트는 myshield -> 우클릭 -> 2D object (or 알맞은것)

   텍스트는  UI -> text (좌우정렬 해주기)

 

- 중력 효과 / 충돌 효과 : 오브젝트 클릭 - 우측아래 - Add Component - physics 2D - 알맞은것 추가

 

- gameManager : 전체적인 게임을 관장하는 역할

 

- prefab : 복제를 위해 미리 만들어두는 아이템

  하나의 오브젝트(squre..) 생성 후 세팅 완료되면 Project 폴더에 [Prefabs] 폴더를 만들고 넣기

  이후 기존 오브젝트 (square)는 삭제

 

- pannel : 판넬 (하나의 큰 UI 만들기..?)

  판넬 안에 점수, 시간 등 여러가지가 들어가니, endPannel이라는 오브젝트를 만들고 그 안에 객체들 만들기

 

- 싱글톤 : 너는 딱 하나야! 라고 설정하는 것 -> 다른 cs에서 부를 수 있게 만듬

public static gameManager I;

void Awake()
{
    I = this;
}

 

 

  

- 마우스 포인터를 따라가는 코드

void Update()
{
    Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    transform.position = new Vector3(mousePos.x, mousePos.y, 0);
}

 

- 랜덤 위치에서 생성하기 / 랜덤 사이즈로 생성하기

void Start()  // 시작하면
{
    float x = Random.Range(-3.0f, 3.0f);  // x 위치 설정
    float y = Random.Range(3.0f, 5.0f);  // y 위치 설정

    transform.position = new Vector3(x, y, 0);

    float size = Random.Range(0.5f, 1.5f);  // 0.5에서 1.5사이 랜덤
    transform.localScale = new Vector3(size, size, 1);  // vector3 (x, y좌표 중 size 랜덤)
}

 

- prefab 을 반복 생성하게 하기

void Start()   // 시작하면
{
    InvokeRepeating("makeSquare", 0.0f, 0.5f);   // makesquare함수 반복. 0.05f 마다
}

 

public GameObject square;   
void makeSquare()
{
  Instantiate(square);}  /// square 생성하기

}

 

- 시간 올라가게 하기

float alive = 0f;   // 0초부터

void Update()
{
    alive += Time.deltaTime;   // 1초씩 늘리기
    timeTxt.text = alive.ToString("N2");   // timeTxt에 표현해라
}

 

- 게임 종료하기

~ 종료함수 만들기

public GameObject endPanel;  

public void gameOver()   // 게임오버되는 함수 만들거야
{
    Time.timeScale = 0.0f;   // 0.0f가 되면
    endPanel.SetActive(true);   // endpanel을 활성화시켜.
}

~ 종료 조건 만들기

void OnCollisionEnter2D(Collision2D coll)
{
    if (coll.gameObject.tag == "balloon")   // 만약 게임오브젝트가 balloon과 만나면
    {
        gameManager.I.gameOver();   // 게임오버 시켜
    }
}

 

- 점수 보여주기

public Text thisScoreTxt;   /// thisScoreTxt 설정하고

 

public void gameOver()   /// 게임오버되는 함수
{
    Time.timeScale = 0.0f;  // 0초 되면
thisScoreTxt.text = alive.ToString("N2");   // 지금 스코어 보여줘
    endPanel.SetActive(true);   // 엔드판넬 활성화시켜
}

 

- Update()함수 멈추게하기 (게임종료 시 바로 점수가 멈추게하기)

bool isRunning = true;    // (bool 함수는 기본값이 True)

void Update()
{
    if (isRunning)    // isRunning(현재 실행되고 있는 게 참이면)
    {
        alive += Time.deltaTime;   //  + 시키고
        timeTxt.text = alive.ToString("N2");   // 보여줘
    }
}

public void gameOver()
{
    isRunning = false;     //  현재 실행되고있다는게 거짓이되면
    Time.timeScale = 0.0f;  // 0초면
    thisScoreTxt.text = alive.ToString("N2"); // 점수 보여줘
    endPanel.SetActive(true); // 엔드판넬 보여줘
}

 

- 다시하기 만들기

~ 다시하기 함수 설정

using UnityEngine.SceneManagement;   // SceneManagemet라는것을 써야함.

public void retry()
{
    SceneManager.LoadScene("MainScene");  // retry함수 설정 (메인씬 다시 로드해줘)
}

 

~시간 다시 켜주기 (다시 시작되었는데 시간이 0이면 안되니깐)

void Start()   // 스타트 코드에서
{
    Time.timeScale = 1.0f;   // 타임 1로 다시 설정해줘
    InvokeRepeating("makeSquare", 0.0f, 0.5f);  // 이거는 네모 만드는거 (게임 기본 설정)
}

 

****** 그리고 다시하기 UI 버튼에 방금 만든 retry()함수 설정해줘야 함 (코딩말고 unity에서)

 

- 최고점수 나타내기 (앱을 껏다 켜도 유지되도록 데이터 보관 / 불러오기)

public void gameOver()
{
    isRunning = false;
    Time.timeScale = 0.0f;
    thisScoreTxt.text = alive.ToString("N2");
    endPanel.SetActive(true);

    if (PlayerPrefs.HasKey("bestScore") == false)   // 최고 점수가 없으면
    {
        PlayerPrefs.SetFloat("bestScore", alive);   // 지금점수가 최고점수
    }
    else
    {
        if (PlayerPrefs.GetFloat("bestScore") < alive)   // 만약 최고점수보다 지금점수가 높으면
        {
            PlayerPrefs.SetFloat("bestScore", alive);   // 지금점수가 최고점수
        }
    }
}