[Unity] 3주차 "고양이 밥주기 게임"

Flaming Bun·2025년 4월 4일

Unity

목록 보기
4/39

🔥 Instantiate() 함수

유니티에서 게임 오브젝트를 동적으로 생성할 때 사용하는 함수입니다. 동적으로 생성한다는 것은 프로그램 실행 시 미리 생성되는 것이 아닌, 필요할 때 생성하는 것을 의미합니다.

⚔ 사용 방법

  1. Instantiate(GameObject obj)
    가장 기본 형태로, 위치와 회전 값은 원본 오브젝트와 동일하게 복사됩니다.
	GameObject obj = Instantiate(objPrefab);
  1. Instantiate(GameObject obj, Transform parent)
    parent를 지정하면 생성된 오브젝트가 해당 부모 오브젝트의 자식으로 설정됩니다.
	GameObject obj = Instantiate(objPrefab, parentTransform);
  1. Instantiate(GameObject obj, Vector3 position, Quaternion rotation)
    생성될 오브젝트의 위치와 회전을 지정할 수 있습니다.
	GameObject obj = Instantiate(objPrefab, new Vector3(0, 1, 0), Quaternion.identity);
  1. Instantiate(GameObject obj, Vector3 position, Quaternion rotation, Transform parent)
    위치와 회전을 지정하면서 부모 오브젝트 설정도 같이 할 수 있습니다.
	GameObject obj = Instantiate(objPrefab, new Vector3(0, 1, 0), Quaternion.identity, parentTransform);

⚔ 사용 예시

public class GameManager : MonoBehaviour
{
	void MakeCat()
    {
		Instantiate(normalCat);
    }
}

public class Dog : MonoBehaviour
{
 	void MakeFood()
    {
        float x = transform.position.x;
        float y = transform.position.y + 2.0f;

        // Quaternion.identity: 별도의 회전값을 주지 않겠다는 의미
        Instantiate(food, new Vector2(x, y), Quaternion.identity);
    }
}


🔥 Canvas Render Mode

CanvasRender Mode에는 Screen Space - Overlay, Screen Space - Camera, World Space가 있다.
Render Mode는 UI가 스크린으로 렌더링 되거나 3D 공간에서 오브젝트로 렌더링되는 방법을 나타냅니다.

Screen Space - Overlay

캔버스가 자동으로 화면 크기에 맞춰지고, 씬이나 카메라의 영향 없이 항상 화면에 직접 렌더링 돼서 UI가 항상 화면에 표시됩니다.

UI가 항상 화면에 떠 있어야 한다 -> Screen Space - Overlay

Screen Space - Camera

캔버스가 지정한 카메라의 일정 거리에 위치한 평면 위에 그려지는 것처럼 렌더링 돼서 UI 평면보다 카메라와 가까운 오브젝트는 UI 앞에 렌더링되고, UI 뒤의 오브젝트는 가려진다.

카메라와 UI를 자연스럽게 연결하고 싶다 -> Screen Space - Camera

World Space

UI가 3D 오브젝트처럼 동작하며, 씬 안의 오브젝트와 함께 배치돼서 월드 좌표계를 따라 이동, 회전, 크기 조정이 가능하다.

UI를 3D 오브젝트처럼 다루고 싶다 -> World Space

① Screen Space - Overlay
② Screen Space - Camera
③ World Space

이런 느낌일 것 같다.



🔥 Rect Transform의 Anchor과 Pivot

Rect Transform 컴포넌트는 Transform 컴포넌트의 2D 레이아웃 버전이다. Transform은 포인트 하나를 나타내지만, Rect Transform은 UI 요소를 안에 넣을 수 있는 사각형을 나타낸다.

Anchor

Anchor는 씬 뷰에 네 개의 작은 삼각형 손잡이 모습으로 표시되며, UI가 부모(캔버스 또는 상위 UI 요소)의 상대적으로 어디에 위치할지를 결정하는 기준점이다.

Pivot

PivotUI의 중심으로, UI의 이동, 회전, 크기 수정은 피벗을 중심으로 일어난다.

유니티 매뉴얼
https://docs.unity3d.com/kr/2020.3/Manual/UIBasicLayout.html



🔥 Rigidbody 2D

Rigidbody 2D 컴포넌트는 오브젝트를 물리 엔진이 제어하게 만듭니다.

📌 Rigidbody 2D 작동 방식

2D 물리 엔진은 Collider를 움직이고 상호작용하도록 할 수 있고, 이러한 Collider의 움직임을 Transform 컴포넌트에 다시 전달하기 위한 메서드가 필요합니다. 이러한 움직임과 Collider들을 연결시켜주는 것이 Rigidbody 2D 컴포넌트의 용도입니다.

Rigidbody 2D 컴포넌트는 Transform을 오버라이드하고 Rigidbody 2D에 의해 정의된 포지션/회전으로 업데이트합니다.

같은 게임 오브젝트나 자식 게임 오브젝트에 추가되는 모든 Collider 2D 컴포넌트는 해당 Rigidbody 2D에 암시적으로 연결됩니다. 즉, Rigidbody 2D와 동기화되어 모두 함께 움직이고 회전하는 단일 복합 콜라이더와 같이 효과적으로 작동하는 Collider 세트를 만들 수 있습니다.

📌 Body Type

Body Type은 Dynamic, Kinematic, Static 세 가지가 있습니다.
Rigidbody 2D에 연결된 모든 Collider 2D는 Body Type 을 상속한다.

Dynamic

Dynamic Body Type은 기본 설정값으로 중력과 힘에 영향을 받습니다. 또한 다른 모든 Body Type과 충돌하며 가장 인터랙티브한 Body Type이다. Transform을 직접 변경하면 물리 엔진과 충돌할 가능성이 있으므로, Rigidbody의 AddForce, velocity 등을 사용하여 이동한다.

ex) 플레이어 캐릭터, 적

Kinematic

Kinematic Body Type은 무한한 질량을 갖고 중력과 힘에 영향을 받지 않습니다. 그리고 다른 Kinematic Body Type나 Static Body Type의 Rigidbody와 충돌하지 않으며 오직 Dynamic Body Type의 Rigidbody와 충돌합니다. 즉, Dynamic Body Type을 제외한 나머지와 충돌 콜백(OnCollisionEnter, OnCollisionStay, OnCollisionExit)이 발생하지 않는다.
만약 충돌을 처리하고 싶으면 Trigger 사용.

ex) 엘리베이터, 무빙 플랫폼

Static

완전히 고정된 상태로, 움직일 수 없음. 충돌 감지는 가능하지만, 어떤 물리적인 반응도 하지 않음.
Rigidbody 2D 컴포넌트가 없는 모든 Collider 2D는 내부적으로 숨겨진 Static Rigidbody 2D 컴포넌트 하나에 연결된 것으로 간주한다.

ex) 건물, 벽, 바닥



📌 3초 뒤 오브젝트 파괴

Destroy(gameObject, 3.0f);

0개의 댓글