2,3 Unity3D의 Game Object 생성과 Component 의 종류 알아 보기

2013. 7. 4. 18:00게임 개발/Unity

 

1.     컴포넌트 기반의 객체 구현

A.     객체기반과 컴포넌트 기반의 차이점

                i.         컴포넌트 기반 프로그래밍이란?

 

1.      컴포넌트란?

A.     소프트 웨어 개발을 마치 레고 블록을 쌓듯이 쉽게 할 수 있도록 하는 기술을 말함.
, 기존 코딩 방식에 의한 개발에서 벗어나 소프트웨어 구성단위(module)를 미리 만든 뒤 필요한 응용 기술을 개발할 때 이 모듈을 조립하는 기술을 말한다
.
컴포넌트 기술을 활용하면 복잡한 정보 시스템을 신속하게 구축할 수 있으며, 유사한 정보 시스템을 구축할 때 재사용이 가능한 장점이 있다.

 

2.      컴포넌트 기반 개발(Component based development)

A.     로직별로 구현해야 할 객체를 카테고리화 시킨 후 컴포넌트화 하여 프로그래밍

B.     다양한 컴포넌트를 조합하여 원하는 객체를 구현하는 방식

 

3.      컴포넌트 기반 프로그래밍의 장점

A.     재 사용이 가능하고 다른 프로그램과의 호환성 및 이식성이 우수

B.     개발 생산성이 전반적으로 높아지는 효과

 

4.      객체 기반 상속의 문제점

A.     Object ß Dynamic Object  / Static Object
Dynamic Object
는 움직이는 객체, Static Object 는 정적인 객체

B.     Dynamic Object ß Monster / Player

C.     상속으로 인해 중간에 하나가 변경이 되면, 상속을 받은 객체들에 대해서 전체적인 수정의 번거로움이 발생, 그로인해 컴포넌트 방식으로 구현을 하면 위와 같은 문제 발생 방지

 

5.      컴포넌트의 장점
게임 내에 새로운 Component 추가 시 최소한의 변경 또는 변경 없이 재 사용 가능함.
변경 상황에 유연하게 대체해서 프로그램 할 수 있다.

A.     Player Entity 라는 객체 생성 아래와 같이 컴포넌트들을 붙여준다.

                                           i.         Rendering Component

                                          ii.         Actor Physics Component

                                         iii.         Mouse Input Component

                                         iv.         Network Component

                                          v.         Animation Component

 

6.      Entities (독립체) 와 컴포넌트 기반 플로어

A.     Input : 입력을 받는 처리 역할

B.     Position : 포지션 변경, 위치, 회전 및 트렌스폼의 변화 역할

C.     Physics : 충돌 등에 의한 물리 반응 역할

D.     Render : 위의 총 변경 사항을 최종적으로 화면에 출력하는 역할, 일반적으로 Rendering 컴포넌트에서 사용하는 것은 엔티티 혹은 Rendering 콤포넌트에서 요구하는 메쉬 데이터, material 데이터에 기반해 가지고 그리고 또 Input 에서부터 시작된 다양한 변경 사항들은 실제로 Rendering에 컴포넌트에 반영을 해서 실제 출력을 하게 되면 화면에 변경된 내용들이 나타나게 되겠습니다.

E.      Network : 변경된 사항을 실제로 Network를 통해 전달하게 되면 다른 컴퓨터라든가 플레이어 한테도 변경된 내용들이 전달되어 똑같이 나타나게 됨

F.      위와 같이 상속을 사용하지 않고 아니면 최소한의 어떤 상속만을 사용해서 이 컴포넌트를 이러한 엔티티 게임 객체에서 필요한 콤포넌트를 조합을 해서 게임 내에서 사용하는 다양한 게임 객체들을 구현을 하는 방식을 컴포넌트 기반의 프로그래밍 방식이라고 한다.

 

B.     Unity3D 의 스크립트 언어 특징

 

                i.         Unity3D 에서는 Entity = GameObject  라는 용어로 설명한다.

               ii.         Component:MonoBehaviour 클래스를 상속

 

 

2.     Unity 와 컴포넌트

 

A.     Game Object 생성하기

 

                i.         Ctrl + shift + n  (windows).

               ii.         새로 생성된 Game Object에는 Inspector 창에서 보유하고 있는 Entities 를 볼수 있는데, 기본적으로 Transform 컴포넌트가 붙어 있습니다.

              iii.         Unity에서 모든 게임 오브젝트들은 모두 GameObject 이고, Component들의 컨테이너 역할을 한다.

              iv.         GameObject.Instantiate 로 로딩한 프리펩에 대한 게임 오브젝트 인스턴스를 생성할 수 있다.

B.     Cube GameObject 생성시

 

                i.         Transform 컴포넌트

               ii.         화면에 보이기 때문에 렌더링 되어지는데, 그것이 바로 Mesh Renderer 컴포넌트가 하는 역활이다.
이안에서는 사용하는 Materials 옵션이 있는데, 기본적으로 Default-Diffuse 가 설정된다.

              iii.         Mesh Filter 에서 Cube 라는 vertax 데이터(정점 데이터)인 메쉬 데이터를 관리를 함.

              iv.         Box Collider 컴포넌트
박스 형태의 충돌을 지원하는 컴포넌트

C.     기본적으로 제공하는 컴포넌트

 

                i.         Mesh : 렌더링 할 때 사용하는 메쉬 데이터

1.      Mesh Filter : 메쉬 데이터를 가지고 있는 것

2.      Mesh Renderer : 데이터를 실제 렌더링 하는 것

               ii.         Effects : 파티클등의 효과 처리

              iii.         Physics : 물리와 관련된 컴포넌트 , 중력의 rigidbody, 충돌과 관련된 Collider

              iv.         Navigation : 길찾기

               v.         Audio : 사운드,배경음악, 효과음등의 음악 처리

              vi.         Rendering : 렌더링과 관련된 부분, 카메라, 하늘처리, , 기본적인 GUI 제공

             vii.         Miscellaneous : 애니메이션, 네트워크 뷰

3.     Unity Script Basic

 

A.     Unity API : MonoBehavior
스크립트,클래스 생성시에 기본으로 MonoBehaviour을 상속받아서, 기본 적으로 정의되어진 Start,update 등의 함수들을 사용하게 된다.

 

                i.         Awake 함수(default)
:
게임 객체가 인스턴스화 될 때, 컴포넌트의 초기화 함께 호출되는 함수

               ii.         Start 함수
: Awake
다음에 호출되는 함수임. 한번씩만 호출

              iii.         OnEnable / onDisable 함수
:
해당 컴포넌트의 객체가 활성/비활성화 될 때 구현해야 하는 부분

              iv.         FixedUpdate 함수
:
물리처리에 관련된 함수  , physics related… 60 MS Frame 이 업데이트 되고 있고, FixedUpate 20ms 로 되어 있다면 3 times per a frame.
Edit > Project settings > TimeManager > Fixed Timestep
값을 조정하면 됨.

               v.         Update 함수
:
지속적으로 처리 되어지는 사항 (Update is called once per frame)

              vi.         LastUpdate 함수
: Update
다음으로 호출되는 함수.
순서는 FixedUpdate > Update > LateUpdate 순으로 진행 되고, 입력 처리에 대한 부분등이 많이 사용.

             vii.         OnWillRenderObject 함수
:
렌더링과 관련된 함수 이며, Mesh Renderer Skinned Renderer 가 있을 경우에만 해당 함수가 유효 하다.

            viii.         OnGUI 함수
:
디버깅용도로 거의 많이 사용되어짐.

              ix.         OnDestroy 함수
:
삭제되어질때 호출 되어지는 함수

 

Tip!!     게임 오브젝트의 인스턴스를 생성하거나 컴포넌트를 얻어 올 때에는 항상 인스턴스가 제대로 생성이 되었는지 혹은 컴포넌트의 레퍼런스를 제대로 얻어 왔는지 체크하도록 하자. 이러한 처리는 코드에서 빈번하게 사용하므로 아래와 같은 제너릭 함수를 만들어서 사용하는 것도 좋은 방법이다.

 

                                      public static T GetSafeComponent<T>(this GameObject obj) where T : MonoBehavior
{
 T component = obj.GetComponent<T>();
 if(component == null)
 {
  Debug.LogError(“Cannot find component of type “ + typeof(T) + “ but found none”, obj);
 }
 return component;
}

 

 

마지막 팁에 대한 정보를 찾던 중에 자~알 정리 해놓은 블로그 글이 있어서 링크 걸어 놓도록 하겠습니다.

시간 날때 마다 가서 숙지 해야 겠네요

 

원본 : http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/

한글  : http://szone2s.blog.me/70151813805