본문 바로가기
게임 개발 일지/내일배움캠프 TIL

게임 스테이지(난이도) 구현 / git 기초 학습

by 빛하_ 2023. 10. 31.

 

오늘의 학습 키워드

 

1. dog 에서 food 가 발사되도록 하기

<Logic>

1) dog의 위치 찾기

2) food 를 instantiate 하기

 

// gameManager.cs

public GameObject food;
public GameObject dog;

void Start()
{
    InvokeRepeating("makeFood", 0.0f, 0.2f);
}

void makeFood()
{
    float x = dog.transform.position.x;
    float y = dog.transform.position.y + 2.0f;
    Instantiate(food, new Vector3(x,y,0), Quaternion.identity);
}

* Quaternion.identity : 회전 없음

* float y 에 + 2.0f 를 하는 이유 : dog 의 위치보다 조금 위쪽에서 food를 발생시키기 위함

 

 

 

2. dog 를 움직일 때, fishshop 밖으로 나가지 않게 하기 (범위를 제한)

 

<Logic>

dog의 x축 좌우 최댓값을 고정시킨다.

float 함수를 이용해 x값을 지정하고, x값으로 dog의 위치를 변환시킨다.

// dog.cs

void Update()
{
    Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    float x = mousePos.x;
    if (x > 8.5f)
    {
        x = 8.5f;
    }
    if (x < -8.5f)
    {
        x = -8.5f;
    }
    transform.position = new Vector3(x, transform.position.y, 0);
}

 

 

3. HP바 구현하기

<Logic>

HP바 이미지 두 개를 생성해 하나를 back으로 깔고 하나를 front에서 변화를 줌으로써 점점 사라지거나 차게 만들 수 있다.

이 때 pivot 을 사용한다.

 

* pivot : 해당 요소가 늘어나거나 줄어들 때 어디를 기준으로 하는가 결정

  만약 pivot의 x값을 0으로 맞추면 왼쪽부터 채워지는 HP바를 만들 수 있다.

  만약 pivot에 x값 양수이면 좌우 모두에서 HP바가 줄어들게 된다.

 

 

4. 올라가는 요소에 충돌 부여하기

중력의 영향을 받아 떨어지는 요소에 충돌을 부여하려면 Rigidbody + Collider 를 활용하면 된다.

하지만 위로 올라가는 요소라면?

이 때는 해당 요소의 Rigidbody - Body Type - Kinematic 으로 설정하면 된다.

올라가는 요소를 확실하게 감지하기 위해서는 Collider 의 Is Trigger 를 체크하는 것도 잊지 말자.

 

 

5. food에 맞은 cat의 HP가 1 오르고, food 삭제시키기
// cat.cs

    void OnTriggerEnter2D(Collider2D coll)
    {
        if (coll.gameObject.tag == "food")
        {
            energy += 1.0f;
            Destroy(coll.gameObject);
        }
    }

 

6. 게임 난이도 올리기

level이 증가함에 따라 게임 난이도를 올리는 방법은 여러가지가 있다.

그 중 두 가지를 구현해보자.

 

1) normalCat 의 출현 횟수를 늘린다

// gameManager.cs

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);
    }
}

여기서 p는 Range 안의 랜덤한 값이고
if 조건문을 활용해 p의 값에 따라 normalCat을 추가적으로 만들어낸다.
이처럼 else if 를 계속 붙여넣어 레벨이 올라갈수록 출현하는 normalCat의 양을 늘릴 수 있다.

 

2) level 3 이 되면 fatCat 출현시키기

// gameManager.cs

// void makeCat ()

        else if (level >= 3)
        {
            float p = Random.Range(0, 10);
            if (p < 6) Instantiate(normalCat);
            Instantiate(fatCat);
        }

void makeCat 항목에 else if (level >=3)을 넣어 fatCat을 출현시킬 수 있다.

fatCat는 normalCat과 다르게 food를 10번 먹어야 사라진다.

 

 

** 주의사항

normalCat과 fatCat 모두 cat.cs 라는 하나의 스크립트를 공유하고 있다.

같은 스크립트를 공유하는 요소들의 경우 해당 스크립트에 public int type; 을 선언하고  

Unity의 prefabs 에 있는 Type 기능을 활용한다.

 

 

7. 버그 수정

1) Retry 했을 때 cat과 food 모두 나오지 않는 현상

 원인) timeScale 설정이 되지 않아서 발생

 해결법) gameManager - void Start 에서 Time.timeScale =1.0f;  로 설정

 

2) level 10 이상부터 level이 제대로 표시되지 않는 현상

 원인) Canvas - level 의 설정 문제

 해결법) Canvas - level - 폰트 사이즈, Width, Height 등을 조절함으로써 제대로 표시할 수 있다. 

 

Idea Note
비슷한 게임인 [Bloons Tower Defense 6] 을 레퍼런스 삼아 [dogvscat] 게임을 디벨롭할 수 있다.
 (난이도 조절)
 * 레벨 10이 되면 fatCat에게 갑옷을 입힌다 : food를 두 번 먹어야 HP가 1 회복된다.
 * 레벨 20이 되면 대왕 고양이 풍선이 등장한다 : 20번 맞은 풍선은 터지면서 normalCat 5마리를 생성한다.
 * 매 10레벨마다 보스 스테이지를 설정한다 : 통과하면 dog에게 랜덤 아이템을 부여한다 
 (아이템)
 * hamburger : 햄버거는 cat의 HP를 3 회복시킨다. (장착형, 지속시간 10초)
 * sunshine : 화면의 모든 cat의 HP가 full이 된다. (일회용, 버튼으로 누르면 발동)
 * food party : dog에서 한 번에 발사되는 food 가 3개로 늘어난다. (장착형, 지속시간 15초)

 

Unity 기능 복습

 

1. Canvas 설정할 때 render mode를  world space로 바꿔주는 이유

    : UI 세상을 게임 세상으로 보내주기 위함

2. 상위 요소가 하위 요소에게 명령하기

   : transform.Find 함수를 활용하면 하위 폴더에 있는 요소를 가져와서 명령을 내릴 수 있다

 예시) gameObject.transform.Find("hungry/Canvas/front").transform.localScale = new Vector3(energy / full, 1.0f, 1.0f);

 

3. 다채로운 게임 만들기

   : 같은 기능을 사용하더라도 UI가 잘 다듬어지고, 디자인이 좋은 요소를 사용하면 게임의 퀄리티가 높아진다.

     난이도 설정 (요소의 양, 속도 등)과 같은 요소 수정 및 추가로 게임성을 개선하고 확장시킬 수 있다. 

 

 

C# 기능 복습

 

1. 마우스 포지션 잡는 법
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

 

2. int / int

C#에서는 정수와 정수를 나누면 무조건 정수로 표시된다.

정확한 값, 또는 근사치의 소숫값이 필요하다면 float 변환 함수를 적용시키자.

 

 

 

git / GitHub 이해하기

git은 VCS 중에 하나이다. 

VCS : Version Control System (형상관리)

 

Github는 git을 활용하기 위한 사이트를 의미한다.

git이 등장한 이유는 팀 프로젝트에서 코드 관리를 효율적으로 하기 위함이다

크게 두 가지 장점이 있는데,

1) 정해진 장소에 여러 사람이 문서를 올리고 수정할 수 있다 : 협업할 때 유리함

2) 원하는 시점으로 돌아가서 작업할 수 있다 : 수정과 복원의 유리함

 

정리하자면, git은 형상관리를 하는 곳으로, 협업에 유리한 원격 저장소이다.

 

GitHub는 개발자의 명함과 같다. 잘 가꾸어서 깃허브로 어떤 개발자인지 나타낼 수 있도록 하자!

 

GitHub 용어 이해하기

1. commit

데이터 저장소를 크게 로컬/원격 두 가지로 나눌 수 있다.

로컬 저장소는 내 컴퓨터, 원격 저장소는 다른 사람과 공유하는 공간이다.

commit은 내가 선택한 데이터를 캡쳐해서 로컬로 올린다고 이해하면 쉽다.

 

2. undo

commit을 잘못 누른 경우 이를 완전히 되돌리는 기능이다

 

3. amend

commit을 누른 상태에서 문서의 정보를 수정할 때 amend를 사용한다.

 

4. discard

문서 하나 하나를 되돌리거나 수정할 때 사용한다. 이 때 history로 넘어간 것도 롤백되어 돌아올 수 있다.

 

5. stash

선택한 문서를 잠시 휴지통에 옮겨 놓는 기능이다.

 

6. pull

원격 저장소에서 파일을 당겨올 때 사용한다.

 

7. push

로컬 저장소에서 원격 저장소로 파일을 밀어줄 때 사용한다.

 

* 문서를 안전하게 동기화 및 전달하는 방법

 fetch origin - pull - push 순으로 누르는 것이 제일 안전하다.

 

8. main / branch

Github Desktop 에는 모든 문서의 시간 상 토대가 되는 main이 존재하고,

특정 시점에서 변화가 생긴다면 main에서 branch가 생겨난다.

branch의 유연성 : 다른 시점의 branch 또는 main과 연결하거나 삭제할 수 있다.

 

 

오늘의 회고

 

어제 계획한 4주차 강의까지 모두 마쳤다. 

여러 번 등장한 함수와 키워드들이 익숙해지기 시작했다. 

로직에 대한 이해도는 생겼는데, 정확히 어떤 요소를 건드려야 하는지, 어떤 cs에 붙여야 작동하는지가 헷갈린다.

4주차까지 모든 게임을 Unity 22.3.11버전으로 완성했는데, 

5주차로 넘어가 게임을 디벨롭하기 위해서는 20.3.18 버전으로 다시 만들어야 한다는 것을 알게되었다. 

스크립트 복습한다는 생각으로 내일 오전에 다시 만들 것이다. 

 

GitHub 특강을 들을 때는 처음 듣는 용어가 많아서 헷갈리고 어려웠다. 녹화본을 보면서 다시 정리해야겠다.

 

단 기간에 머릿속에 집어넣는 내용이 많다보니 혼란스럽고 더 어렵게 느껴진다.

스트레칭, 물 마시기, 환기 등으로 쾌적한 환경을 만들어서 몸과 정신이 모두 건강할 수 있도록 관리해야겠다.

내일도 힘내자 !!

 

 

내일 계획

오전 ) 20.3.18버전으로 findRtan 다시 만들기

오후 17시 45분 ) 튜터님과 개인 면담

오후 ) 5주차 강의 듣기

 

 

 

 

 

 

 

 

 

 

댓글