본문 바로가기

Unity 기초 기능 #3 - Canvas Render Mode, Rigidbody2D 타입

@코야딩구2025. 6. 16. 16:53

1. 패키지 파일 임포트

 - .unitypackage 파일은 다른 프로젝트에서 만든 에셋, 스크립트, 폰트 등을 손쉽게 재사용할 수 있는 포맷이다.

 - Project에 드래그 앤 드롭으로 해당 패키지 파일을 임포트할 수 있다.

2. EventSystem

 - EventSystem은 Unity에서 UI 입렵 이벤트(클릭, 드레그 등)를 처리하기 위한 핵심 컴포넌트다.

 - 새 Canvas를 만들거나 버튼을 추가하면 자동으로 생성된다.

 - 삭제하면 UI 버튼이나 슬라이더 입력이 동작하지 않는다.

  2-1. EventSystem 삭제 경험

   - Hierarchy 창에 만든적도 없는 EventSystem이 있어 삭제한 적이 있다.

   - 이후 버튼 UI가 작동하지 않아, 원인을 찾느라 한참 헤맨 적이 있다.

   - 실수로 삭제했을 경우, Hierarchy -> 우클릭 -> UI -> Event System을 통해 생성할 수 있다.

3. Instantiate(GameObject, Vector3, Quaternion);

 - Instatiate(GameObject)와 같이 Unity에서 오브젝트를 동적으로 생성할 때 사용하는 함수다.

 - 제네릭 함수로, GmaeObject 외에도 다양한 타입에 사용할 수 있다.

 - 이번 프로젝트에서는 프리팹(GmaeObject)을 원하는 위치에 생성할 때 사용했다.

 - 예제 코드:

public class Dog : MonoBehaviour
{
    public GameObject food;
	void MakeFood()
	{
		// 발사 위치
   		Vector2 dogPos = transform.position + offset;
    	// 회전 정보 필수, 여기선 회전 없음을 의미함
    	Instantiate(food, dogPos, Quaternion.identity);
    }
}

4. 테스트를 위한 Inspector 창에서 변수 조정하기

 - 개발 중 변수를 실시간으로 조정하기 위해 public 키워드를 사용에 Inspector창에 노출했다.

 - enum을 Inspector창에서 사용하려면 선언과 변수 모두 public으로 지정해줘야 한다.

 - 예제: C# 스크립트에서 public으로 지정 후, Inspector창에서 수정

public class Cat : MonoBehaviour
{
    // Inspecter에서 사용하려면 eum 선언, enum변수 다 public이어야 함
    public enum CATTYPE // 캣 타입
    {
        NORMAL, FAT, PIRATE
    }
    public CATTYPE catType;
    // 고양이 스피드
	public float speed = 7.0f; // 내려오는 속도
	public float outSpeed = 5.0f; // 퇴장 속도
    // 최대 게이지 바
	public float fullGauge = 5.0f;
    
    void Start()
    {
    	// Inspecter창에서 테스트한 값으로 설정하기
        switch (catType) 
        {
            case CATTYPE.NORMAL:
                speed = 7.0f;
                outSpeed = 4.0f;
                fullGauge = 5.0f;
                break;
            case CATTYPE.FAT:
                speed = 4.0f;
                outSpeed = 2.0f;
                fullGauge = 10.0f;
                break;
            case CATTYPE.PIRATE:
                speed = 10.0f;
                outSpeed = 5.0f;
                fullGauge = 8.0f;
                break;
            default:
                break;
        }
    }
}

5. Canvas Render Mode

 - Canvas는 Unity UI의 루트 컴포넌트로, Render Mode에 따라 렌더링 방식이 달라진다.

  5-1. Canvas Render Mode 종류

   - Screen Space - Overlay: 가장 일반적인 방식. UI가 화면 위에 렌더링됨.

   - Screen Space - Camera: 특정 카메라를 기준으로 UI를 렌더링함. 깊이 조절 가능.

   - World Space: UI가 월드 오브젝트처럼 3D 공간 내에 배치됨.

   - 예시: 이번 프로젝트 중 고양이의 배고픔 게이지는 World Space, 메인UI는 Screen Space - Overlay로 설정

         1) 같은 게이지를 가지고 있지만, 서로 다른 Canvas Render Mode를 사용했다.

         2) World Space는 고양이 오브젝트를 기준으로 위치해 있다.

         3) Screen Space - Overlay는 카메라 고정 UI이므로 별도로 위치한다.

6. Rigidbody2D 타입과 충돌

 - Unity 2D에서는 적어도 하나의 오브젝트에 Rigidbody2D가 있어야 충돌 계산을 수행한다.

 - 물리 효과를 제어하기 위해 Rigidbody2D의 Body Type을 조절할 수 있다.

  6-1. Rigidbody2D 타입

타입 중력 영향 이동 방식 충돌 응답(OnCollision ) 트리거 응답(OnTriger)
Dynamic 받음 물리 시뮬레이션 작동함 작동함
Kinematic 안 받음 코드로 직접 이동 작동 안됨 작동함
Static 안 받음 이동 없음 작동 안됨 작동함

  6-2. Rigidbody2D 타입에 따른 충돌 판단

   - Dynamic: OnCollisionEnter2D() 사용

   - Kinematic 또는 Static: Collider에 Is Trigger를 활성화하고, OnTriggerEnter2D() 사용

   - 프로젝트 #3의 경우 밥(투사체)이 중력을 받지 않도록 오Kinematic을 사용하였다.

7. static과 싱글턴을 이용한 클래스 접근

 - 게임 매니저처럼 전역에서 접근이 필요한 객체는 싱글턴 패턴으로 설계할 수 있다.

 - 예시: Cat.cs에서 GameManager.cs의 AddScore() 함수 접근

// GameManager.cs
public class GameManager : MonoBehaviour
{
    public static GameManager Instance;
    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        Application.targetFrameRate = 60;
        Time.timeScale = 1.0f;
    }
    // 스테이지 레벨
	int level = 0;
	public int lvMaxScore = 5;
	int score = 0;
	public Text lvTxt;
	public RectTransform lvFront;
    public void AddScore() // 외부에서 호출되는 함수
    {
        score++;
        level = score / lvMaxScore;
        lvTxt.text = level.ToString();
        lvFront.localScale = new Vector3(score % lvMaxScore / (float)lvMaxScore, 1f, 1f);
    }
}

// Cat.cs
public class Cat : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Food"))
        {
        	// "Food"와 충돌했다면 게임 매니저를 호출하여 점수 추가
         	GameManager.Instance.AddScore();
            // 맞은 밥 삭제
            Destroy(collision.gameObject);
        }
    }
}

8. 게임 구현

 - 아래는 앞서 설명한 기능으로 구현한 게임입니다.

 

Unity 기초 프로젝트 #3 - 고양이 밥주기

1. 고양이 밥주기 게임 소개 - 플랫폼: 모바일 - 장르: 2D 캐주얼 게임 - 목표: 고양이들에게 밥을 주어 생선 가게를 지키고, 최대한 높은 스테이지 레벨에 도달하기2. 게임 플레이 - 게임 화면 오른

gyro-code-game.tistory.com

목차