Unity) gameObject 와 Component

강성현
∙∙조회 4
Unity) gameObject 와 Component

1. 게임오브젝트 (gameObject)

씬에 놓이는 모든 것이 게임오브젝트이고, 게임 오브젝트 자체는 아무 기능도 갖지 않습니다.

기능을 갖기 위해 컴포넌트를 담는 그릇입니다.

 


2. 컴포넌트

게임에서 오브젝트와 동작에 관한 기본 구성 요소 입니다.

 


3. 부모 - 자식 계층

  • 부모오브젝트의 좌표값을 옮기게 되더라도 자식오브젝트의 로컬 좌표값은 동일하게 0이다.

 

3-1) 빈 게임오브젝트를 이용하여 피벗처럼 사용하기

 

오브젝트의 포지션을 원점을 기본으로 놓고 진행을 해야 편한데 위와 같이 좌표 기준이 오브젝트의 중앙이라

오브젝트의 포지션을 원점으로 놓게 되었을 때 불편한 상황이 발생할 수 있다.

위와 같이 빈 오브젝트를 생성하여 객체를 자식으로 바꾸면 부모 오브젝트가 움직였을때 Capsule의 로컬값은 변화하지 않게 된다.

 


4. 자주 사용하는 기능

 

4-1) 인스펙터 노출과 직렬화

[Header(" ")] : 인스펙터창에 Header를 띄울 수 있다.

[Tooltip(" ")] : 인스펙터창에 표시된 기능들에 설명을 추가할 수 있다.

[SerializeField] : 인스펙터창에 해당 기능을 표시해줄 수 있다.

csharp
[Header("회전 관련 데이터")]
[Tooltip("회전 관련 데이터를 설정합니다.")]
[SerializeField][Range(0, 300)] private float RotSpeed; // 0~300의 값을 조정할 수 있는 "바" 가 

 

==※주의==

==[SerializeField] private float _moveSpeed = 5f;==

코드상에서 이렇게 적어놓고 인스펙터상에서 12로 변경한 후에, 다시 코드로 돌아와 5f를 20f로 변경하더라도

실제로 쓰이는 값은 인스펙터에서 적은 12로 사용된다.

코드에 적은 초기값은 인스펙터에 저장된 값이 없을 때만 쓰입니다.

 

  • ==자동 구현 프로퍼티의 노출==

==[field: SerializeField] public float MoveSpeed { get; private set; }==

 

==[field: SerializeField]==는 프로퍼티가 감춰 만든 필드에 이 표시를 붙이라는 뜻입니다.

이렇게 하면 다른 클래스에서 MoveSpeed를 읽을 수 있고, 값을 넣는 것은 인스펙터와 이 클래스 안쪽으로 제한됩니다.

 


 

4-2) GetComponent 계열

 

  • ==GetComponent==

같은 게임 오브젝트에 붙어 있는 컴포넌트 하나를 찾아 돌려줍니다.

못 찾으면 null을 반환합니다.

문법형식 :

대상.GetComponent ( );

Renderer foundRenderer = GetComponent<Renderer>();

 

  • ==TryGetComponent==

찾았는지 여부를 bool로 돌려주고, 찾은 것은 out 매개변수에 넣어줍니다.

csharp
if (TryGetComponent<Renderer>(out Renderer foundRenderer) == true)  
{  
    foundRenderer.enabled = false;  
}

 

  • ==GetComponents==

같은 게임 오브젝트에서 조건에 맞는 컴포넌트를 전부 찾아 배열로 돌려줍니다.

MonoBehaviour[] foundScripts = GetComponents<MonoBehaviour>();

  • ==GetComponentInChildren== , ==GetComponentInParent==

GetComponentInChildren : 자기 자신과 그 아래 자식 전체에서 → 처음 찾은 컴포넌트 하나

GetComponentInParent : 자기 자신과 그 위 부모를 거슬러 올라가며 → 처음 찾은 컴포넌트 하나

  • 헷갈릴 수 있는 부분은 자기 자신에게 그 컴포넌트가 붙어있다면 자식, 부모를 보기전에 해당 컴포넌트를 반환합니다.

 


4-3) Find 계열

GameObject.Find( )

※ 주의 / 사용하지 않는 것이 좋다. -> 씬 전체로 순회하기 때문에 오브젝트가 많을 수록 프레임드랍의 원인이 될 수 있다.