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

[내일배움단] Unity TIL 3. 고양이 밥주기 게임

by 석시 2023. 8. 3.



이번에는 미리 만들어놓은 리소스를 다루고 본격적으로 스크립팅에 대해 다루는 파트이다.

가장 중요한 파트는 인게임 UI가 아닐까 싶다.

이번에 만들 게임은 다음과 같다.

UI가 어떻게 화면에 고정된 것이 아닌 특정 오브젝트를 따라가게 만들 수 있을까에 대한 이야기다.

실제로 구현하게 되면 너무 간단하겠지만 자주 나오는 상황이라 꼭 알고 넘어 가는 것이 좋아보인다.

1. Camera Inspector

위에 보이는 게임이 사실 배경 오브젝트를 따로 지정한 것 같지만, 아니다.

CameraBackground를 조정한 것이다.

Camera의 Background 조정

(Camera의 Inspector에서) Background → hex FFF0B2

아무 오브젝트가 존재하지 않는 구간을 지정한 배경색으로 표시해주는 것 같다.

특정 이미지를 삽입할 수도 있을 것 같다만…. 나중에 알아보도록 하자.

Camera의 Size 조정

(Camera의 Inspector에서) Size → 25

Size를 늘이면 뭐가 바뀌느냐?

Scene에서 보여줄 부분의 범위가 넓어진다고 생각하면 좋다.

3D에선 시야가 넓어지는 효과도 있다.

이번 게임을 만들 때 쓸 애셋들이 고화질이기 때문에, 애셋들의 크기를 줄이기보단 카메라의 크기를 키우는 방식을 택한 것이다.

2. Scene 넘어다니기

게임에서 여러 가지 씬이 필요할 것 아닌가.

스타트 화면도 있고, 전투 화면도 있을 것이다.

따라서 시작 화면 씬을 따로 만들어 씬을 넘어다녀보자.

Scene 만들기

(Project 탭에서) 우클릭 → create → Scene

만든 씬을 더블클릭하면 해당 씬으로 넘어간다.

Scene 넘어가기

씬을 넘어가는건 스크립트의 SceneManager를 이용해 제어 가능하다.

  • startBtn.cs 코드
    using UnityEngine.SceneManagement;
    
    public void GameStart()
    {
        SceneManager.LoadScene("MainScene");
    }

비주얼 스튜디오 잡기술 중 하나인데, 위 코드에서 using UnityEngine.SceneManagement;를 빼먹었다고 해보자.

당연히 SceneManager.LoadScene("MainScene");에서 오류가 날 것이다.

이 때 오류난 부분에서 Alt+Enter를 하면 수정사항을 제안해주고, 그 수정사항을 클릭하면 고쳐주기까지 한다.

참고) Button Component에 대해

button component는 UI에다 달아줄 경우에만 작동한다.

다른 오브젝트는 안되니까 참고.

3. 오브젝트에 종속적인 UI 만들기

이번 파트에서 가장 중요한 부분.

일단 Hierarchy에서 오브젝트 하위에 Canvas를 넣어주자.

이 때 Canvas의 Transform Component는 수정 불가능한 상태다.

고양이에 붙어 있는 체력바를 만들건데, 별다른 건 없고 그냥 Render Mode를 바꿔주면 된다.

Canver의 Render Mode 바꾸기

(Canvas의 Inspector에서) Render Mode를 World Space에 변경

이 때부터 Rect Transform의 수정이 가능해진다.

Pivot 바꾸기

체력바를 만들어야 하는데, 이를 사각형 두 개로 표현한다고 해보자.

이 때 아무것도 건드리지 않고 Scale만 바꾸면 다음과 같이 가운데를 중심으로 크기가 변한다.

이건 우리가 원한게 아니지 않은가!

체력바가 왼쪽에 밀착한 상태로 변하게 만들어줘야 할 것이다.

이를 위해 pivot이라는 것이 있다.

(Inspector에서) Pivot의 X좌표를 0으로 수정

이 때 뭔가 내가 원하는 대로 안바뀌는데? 라는 생각이 든다면 Pivot을 변경할 때 해당 차원의 Position을 상황에 맞춰 변화시켜주니 참고하자.

4. Rigidbody가 중력의 영향을 안받게 하기

Body Type: Dynamic

충돌 판정을 위해 투사체에 Rigidbody 2D를 달고나면, 뭔가 이상한 것이 느껴질 것이다.

얘는 중력의 영향을 받으면 안되는데?

그렇다. Rigidbody 2D는 기본적으로 Dynamic이라는 Body Type을 가지고 있는데, 이는 질량을 가진 물체가 중력과 같은 힘을 받았을 때의 물리를 시뮬레이션 하는 Body Type이다.

그래서 낙하 현상도 발생하고, 다른 물체랑 부딪히면 훨씬 자연스럽게 움직이는 것이다.

주의사항이 하나 있는데, Body TypeDynamic인 오브젝트의 위치를 바꾸고 싶을 때, 스크립트로 Transform Component를 변경하면 안된다는 것이다.

해보면 알텐데, 스크립트로 변경이 되지 않을 것이다.

스크립트로는 Rigidbody 2D에 내장되어 있는 AddForce()를 사용하여 바꿀 수 있다.

하지만 이는 해당 게임의 투사체를 구현하기 위해선 적절한 Body Type이 아니다.

Body Type: Kinematic

(Inspector에서) Rigidbody 2D → Body Type을 Kinematic으로 수정

스크립트로 오브젝트를 제어하고 싶을 때 사용하는 Body Type이다.

이걸로 우리는 투사체 제어가 가능한 것이다.

참고로 Static이라는 Body Type인데, 움직이지 않는 오브젝트의 Body Type이다.

그냥 스크립트를 안쓰면 되지 왜 이게 따로 있냐고?

리소스를 덜먹는다(중요하다).

5. 충돌 감지에 대해

isTrigger

Collider에 isTrigger라는 것이 있다.

유니티에선 두 가지의 충돌이 있다.

물리적인 충돌과 트리거 충돌.

총알이 물리적인 충돌을 받아 다른데로 튀면 안되기 때문에, 이러한 물리 충돌을 끄고 Trigger로서만 기능하겠다.

이것이 isTrigger인 것이다.

6. Prefab Unpack

프리팹을 몇 가지만 수정된 다른 종류로 만들고 싶을 때가 있을 것이다.

이 때 프리팹을 Hierarchy에 불러와서, 해당 오브젝트와 프리팹의 연결을 해제할 수 있는데, 이러한 기능이 Unpack이다.

(Hierarchy에서) 우클릭 → Prefab → Unpack

그러면 프리팹의 종속에서 벗어난 별개의 오브젝트로 만들어지는 것이다.


Uploaded by N2T