본문 바로가기

개발자_뉴비일지

내일배움캠프 Unity 3일차 TIL - 고양이의 난

 

string keyword="고양이의 난"

3주차 강의 시작! 고양이 밥주기 게임.

게임을 만들며 새로 배운 개념들을 정리해본다.

 

요약

scene두개 활용

image와 UI를 동시에 메인화면에 띄우기

하위폴더를 찾아주는 find함수

레벨 시스템 구축

타입에 따라 다른 고양이들 불러오기

 

1. 복수의 scene

 

그동안은 mainScene이라는 하나의 씬 안에서 게임이 진행됐다.

오늘은 게임을 시작하는 startScene을 따로 만들어본다.

>>게임진행을 위한 startScene

>>일단 폴더를 하나 더 추가해 준다.

 

중요한건 플레이 버튼을 누르면 메인씬으로 넘어가는 기능!

버튼은 꼭 UI Image에 넣어 놓아야 작동을 한다.

 

public void Gamestart()
{
    SceneManager.LoadScene("MainScene");
}

>>메인씬을 불러오는 함수.

 

2. 고양이들

 

몰려드는 배고픈 고양이들에게 밥을 주면 포만감 게이지가 차게 되는데,

고양이 이미지(object)와 게이지(UI)를 한번에 표현해야 한다. 

>>UI를 게임세상으로 불러들인다!

 

게이지를 표현하는 방법 중 하나는 UI끼리 겹치게 만드는 것이다.

>>기본 바탕에 hp를 의미하는 UI추가!

참고로 hp게이지의 pivot의 x를 0으로 설정해야 게이지가 왼쪽으로 줄어드는 것처럼 보이게 할 수 있다.

 

>>고양이 움직임 애니메이션 설정

원하는 시간을 누르고 원하는 폴더의 원하는 이미지로 바꿔넣어주면 그대로 레코딩이 된다.

레코딩 하는 중에는 각 폴더의 이미지를 바꾸어도 실제로 바뀌지는 않는다.

 

3.밥주기

 

고양이에게 밥을 주려면 둘이 충돌하게 해야한다.

충돌조건은 둘다 collider적용, 한쪽에 rigidbody적용!

 

여기서, 밥은 위로 올라가도록 설정해 놨는데 중력의 영향을 받으면 밥이 내려와야한다

??

 

>>고양이밥 rigidbody에 body type을 kinematic으로 바꿔주면 중력의 영향을 안받겠다는 뜻이다.

추가로 충돌을 감지 못할 때가 있기 때문에 collider의 is trigger에 체크를 해준다.

 

 

이제 고양이의 배를 채울차례!

 

void OnTriggerEnter2D(Collider2D coll)
{
    if (coll.gameObject.tag == "food")

>>food와 충돌할 때
    {
        if(energy < full)

>>에너지가 full 미만이면
        {
            energy += 1f;

>>에너지를 1씩 채워주고
            Destroy(coll.gameObject);

>>충돌한 밥은 먹었으니 삭제.
            gameObject.transform.Find("hungry/Canvas/front").transform.localScale = new Vector3(energy / full, 1.0f, 1.0f);

>>하위폴더의 만들어 놓았던 hp바를 찾아주는 함수
        }
        else
        {
            gameObject.transform.Find("hungry").gameObject.SetActive(false);
            gameObject.transform.Find("full").gameObject.SetActive(true);

>>배고픈고양이를 배부른 고양이의 이미지로 전환
        }
    }
}

 

4. 레벨시스템

 

개인적으로 살짝 헷갈렸던 것이 레벨시스템 구축하기다.

 

게임매니저에 addcat이라는 함수를 만들어준다.

 

int level = 0;
int cat = 0;

 

public void addcat()
{
    cat += 1;
    level = cat / 5;

>>고양이를 한마리 먹일때마다 레벨은 1/5씩 올라간다.

    levelText.text=level.ToString();
    levelFront.transform.localScale = new Vector3((cat - level * 5) / 5.0f, 1.0f, 1.0f);
}

>>레벨 게이지에 표시해주도록 설정.

 

cat스크립트로 가서 추가 작업을 해준다.

bool isfull=false;

>>중복 적용되지 않게 bool값을 지정해주고

 else
 {
     if (isfull == false)
     {
         gameManager.I.addcat();
         gameObject.transform.Find("hungry").gameObject.SetActive(false);
         gameObject.transform.Find("full").gameObject.SetActive(true);
         isfull = true;

>>실행되면 bool값이 true로 바뀌며 addcat함수는 한번만 실행된다.
     }
  }    

 

5. 뚱냥이 등장시키기

 

일반냥이와 뚱냥이는 같은 cat스크립트를 공유하기 때문에 타입을 지정해준다.

public int type;

그러면 이렇게 유니티에서 타입을 지정할 수 있는데 뚱냥이는 1로 지정한다.

 

게임매니저에서 함수들을 레벨업함에 따라 난이도 조절과 뚱냥이 출몰시기를 정해준다.

void makeCat()
{
    Instantiate(normalCat);
>>기본적으로는 일반냥이 소환.
    if (level == 1)
    {
        float p = Random.Range(0, 10);
        if (p < 2) Instantiate(normalCat);
    }
    else if (level ==2)
    {
        float p = Random.Range(0, 10);
        if (p < 5) Instantiate(normalCat);
    }
    else if (level >= 3)
    {
        float p = Random.Range(0, 10);
        if (p < 6)Instantiate(normalCat);
        Instantiate(fatcat);

>>레벨 3이상일때 뚱냥이 소환.
    }
}

 

cat스크립트에도 뚱냥이의 체력과 속도를 설정한다.

 void Start()
 {
     float x = Random.Range(-8.5f, 8.5f);
     float y = 30f;

     if(type == 1)
     {
         full = 10f;
     }   
>>뚱냥이의 체력 설정.
     transform.position=new Vector3(x,y,0);
 }

 

 if(energy < full)
 {
     if(type == 0)
     {
         transform.position += new Vector3(0, -0.05f, 0);
     }
     else if(type == 1)
     {
         transform.position += new Vector3(0, -0.03f, 0);
     }

>>뚱냥이의 속도 설정.

 

오늘의 마무리

오늘도 목표했던 3주차를 마무리 하게 되어 뿌듯하다.

점점 유니티에 익숙해져 가기도 하고 새로운 기능 및 함수들을 배우는 것이 내가 점점 더 성장하고 있다는 느낌이 든다.

레벨구축시스템 및 여러 고양이의 등장은 생각보다 복잡해서 다시 복습해봐야 할 것 같다.

 

.

.

.

with 용이