컴포넌트 패턴
유니티는 게임 오브젝트를 컴포넌트 패턴을 통해 만듬. 컴포넌트 패턴 혹은 컴포지션 Composition 패턴이란 미리 만들어진 부품을 조립하여 완성된 오브젝트를 만드는 방식이다. 미리 만들어진 부품은 컴포넌트를 뜻하고 컴포넌트는 저마다의 대표 기능을 가지는데, 빈 껍데기인 게임오브젝트에 컴포넌트를 조립하여 기능을 추가하는 형식이다.
컴포넌트의 독립성
- 게임 오브젝트는 단순한 빈 껍데기
- 컴포넌트는 스스로 동작하는 독립적인 부품
컴포넌트는 독립적이기에 기능 추가와 삭제가 쉽다.
MonoBehaviour
브로드 캐스팅이 가능한 원리를 이해하려면 먼저 모든 컴포넌트의 기반인 MonoBehaviour를 알아야 함. 유니티의 모든 컴포넌트는 MonoBehaviour클래스를 상속한다. MonoBehaviour 클래스는 유니티에서 미리 만들어 제공하는클래스이며 컴포넌트에 필요한 기본 기능을 제공한다. 즉, monoBehaviour를 상속한 클래스는 게임 오브젝트에 컴포넌트로서 추가될 수 있다.
MonoBehaviour를 상속해서 만든 컴포넌트는 유니티의 제어를 받게 된다. 그러므로 컴포넌트는 유니티의 메시지를 들을 수 있다.
MonoBeaviour를 상속하지 않은 경우
MonoBeaviour 클래스는 게임 오브젝트의 컴포넌트로서 필요한 기능들을 제공한다. 따라서 이 클래스를 상속하지 않은 Animal 클래스는 게임 오브젝트에 컴포넌트로서 추가할 수 없다.
MonoBeaviour는 new를 사용하지 않는다.
유니티에서 작성하는 대부분의 스크립트는 MonoBehaviour 클래스를 상속한다. 그런데 MonoBehaviour를 상속한 클래스는 new로 오브젝트로 생성할 수 없다.
MonoBeaviour를 상속한 클래스는 드래그&드롭 등으로 스크립트를 게임 오브젝트에 컴포넌트로 추가하는 방법으로만 오브젝트로 만들 수 있다.
C#에서는 클래스를 기반으로 새로운 오브젝트를 생성할 때 new를 사용하는 것이 일반적이다. 하지만 유니티 C#스크립트는 new를 거의 사용하지 않기에 당활할 수 있다.
MonoBeaviour를 상속한 클래스는 컴포넌트로 동작하며, 컴포넌트는 게임 오브젝트의 부품으로만 존재할 수 있다. 또한 컴포넌트는 게임 오브젝트에 추가될 때 컴포넌트로서 필요한 초기화 과정을 거친다.
new연산자로 MonoBeaviour를 상속한 클래스를 오브젝트로 생성하면 필요한 초기화 과정과 게임 오브젝트에 추가되는 과정을 전부 생략하고 즉시 오브젝트가 생성된다. 따라서 생성된 오브젝트가 정상적으로 동작하지 않는다.
스크립트를 통해 리지드바디 컴포넌트 사용
- 스크립트에서 public으로 Rigidbody타입의 변수를 선언
- 스크립트를 드래그&드롭으로 게임 오브젝트에 추가함.
- 게임 오브젝트를 클릭하여 스크립트에 뜬 Rigidbody변수를 확인할 수 있음. PlayerRigidbody가 선언된 변수의 이름임
PlayerRigidbody에 할당된 값이 None으로 표시되어 있는데, 어떠한 오브젝트도 가리키고 있지 않다는 뜻이다.
private으로 Rigidbody변수를 선언하면 아래 사진과 같이 변수가 인스펙터에 나타나지 않음.
리지드바디 컴포넌트를 드래그하여 스크립트의 PlayerRigidBody변수부분에 할당시킬 수 있다.
크기와 유닛 단위
Plane의 기본 크기는 가로세로 10유닛이다. 유니티에서 1유닛은 Cube한 변의 길이이므로, Plane에 한 방향으로 Cube오브젝트를 10개 나열할 수 있다.
1 유닛을 현실의 몇 미터에 대응시킬 수 있는지 정해지지는 않았지만, 보통 1유닛을 1미터로 취급한다.
태그 설정
게임 오브젝트가 플레이어인지 확인하는 것을 태그를 통해 해결함. 태그는 게임 오브젝트를 분류하고, 코드에서 게임 오브젝트를 구별하는데 사용된다.
RigidBody
Rigidbody 는 GameObject 가 물리 제어로 동작하게 한다. 리지드바디는 힘과 토크를 받아 오브젝트가 사실적으로 움직이도록 한다. 리지드바디가 포함된 모든 게임 오브젝트는 중력의 영향을 받아야 하며 스크립팅을 통해 가해진 힘으로 움직이거나 NVIDIA PhysX 물리 엔진을 통해 다른 오브젝트와 상호 작용해야 한다.
요약하자면, 리지드바디 컴포넌트를 추가하면 물리엔진이 적용되어 물리적인 기능을 가지게 된다.
Material
게임 오브젝트의 컬러는 머터리얼이 결정한다. 머터리얼은 셰이더와 텍스쳐(이미지)가 합쳐진 에셋으로, 오브젝트의 픽셀 컬러를 결정한다.
셰이더 : 물감, 텍스처 : 스케치. 밑그림
Camera Clear Flags
를 통해 단색, skybox등 설정을 할 수 있다.
리지드바디 제약 설정
Rigidbody 컴포넌트의 Constraints 필드를 통해 축을 고정시킬 수 있다.
Collider (콜라이더)
콜라이더가 추가되면 물리적인 표면이 생긴다. 이를 통해 다른 게임 오브젝트와 충돌하면 튕겨나갈 수 있다.
트리거 콜라이더
충돌한 물체를밀어내는 물리적은 표면은 없어서 일반 콜라이더와 겹치거나, 뚫고 지나갈 수 있지만 충돌감지는 가능하다. 콜라이더의 is Trigger 체크를 통해 사용할 수 있다.
프리팹
프리팹은 언제든지 재사용할 수 있는 미리 만들어진 게임 오브젝트 에셋(파일)이다. 비슷한 게임 오브젝트를 여러 개 만들 때 매번 다시 설정하는 번거로움을 줄이기 위해 프리팹을 사용한다. 게임 오브젝트를 프리팹으로 만들면 나중에 해당 게임 오브젝트와 똑같은 게임 오브젝트를 프리팹에서 복제 생성할 수 있습니다. 프리팹은 파일로 저장되기 때문에 현재 씬뿐만 아니라 다른 씬에서도 사용할 수 있다. 하이어라키의 게임 오브젝트를 프로젝트 창으로 드래그&드롭하면 만들고자 하는 게임오브젝트의 프리팹이 생성된다.
transform
트랜스폼 컴포넌트는
Transform 타입의 변수 transform은 "자신의 게임 오브젝트의 트랜스폼 컴포넌트"로 바로 접근 가능하다
즉, GetComponent<Transform>(); 과 같이 컴포넌트를 직접 찾아오는 과정없이 바로 접근하여 사용가능 하다.
transfrom.forward
transform 컴포넌트는 여러 기능을 제공하는데, 그 기능들 중 하나인 forward도 제공한다. transform.forward를 사용하면 해당 트랜스폼을 가진 게임 오브젝트의 앞쪽 방향을 Vector3 값으로 제공한다.
리지드바디 컴포넌트와 충돌 메시지
284
콜리전과 콜라이더
284 285
other
286
287에 있는 내용을 통해 알 수 있는 것
: 스크립트를 게임 오브젝트에 넣게되면 그 스크립트도 일종의 컴포넌트라 볼 수 있다.
288의 OnTriggerEnter를 보면 알겠지만 오버라이딩해서 사용하는 메소드 같음.
트리거 충돌 시 자동으로 실행되는 메소드라고 하니까. (그래서 update가 필요없나?)
docs.unity3d.com/kr/530/ScriptReference/Collider.OnTriggerEnter.html
TIme.deltaTime 개념
297 317
FindObject~~랑 GetComponent의 차이
stackoverflow.com/questions/30310847/gameobject-findobjectoftype-vs-getcomponent
www.reddit.com/r/Unity3D/comments/3leqo4/whats_the_difference_between_getcomponent/
프로젝트 에셋 경로 변경 개념
310
앵커프리셋
322
게임매니저
ui텍스트를 관리하고 게임을 재시작할 수 있어야 함.
330
빌드메뉴?338
인스펙터 창에 표시되는 컴포넌트의 공개된 필드들은 대부분 코드 상에서 접근하고 수정할 수 있다.
유니티에서 씬은 하나의 게임 월드이다. 새로운 씬이 로드되면 기존 씬에 있던 모든 게임 오브젝트가 파괴된다.
내용 정리중에 있습니다.
'유니티에서 게임개발을 추구하면 안되는걸까' 카테고리의 다른 글
[Unity] SetActive와 enabled (0) | 2021.03.05 |
---|---|
[Unity] RequireComponent란? (0) | 2021.03.05 |
[Unity] 공식 Documentation 읽을 때 주의점 (0) | 2021.03.05 |
유니티 기본 정리(기본ui) (2) | 2020.11.18 |
유나이트 now #1 (0) | 2020.08.27 |