본문 바로가기
Lecture

Unity3D의 Monobehaviour 클래스 소개

by 작은별하나 2014. 3. 18.
반응형

이번 강좌는 NGUI가 아닌 Unity3D의 기본 기능을 익히는 것을 배우도록 합니다.

 

Unity3D에서 프로그램을 작성하려면, Mobobehaviour란 클래스에 대해서 알아야 합니다.

Monobehaviour 클래스는 Unity3D의 기본 오브젝트(base object)에 연결할 수 있는 기본 클래스(base class)입니다.  이 클래스는 여러가지 변수와 기능을 제공하고 있지만, 여기서는 당장 꼭 알아야 하는 몇가지만 짚고 넘어가도록 합니다.

 

일단 멤버 변수입니다.

 

gameObject란 멤버변수는 Unity3D의 기본 오브젝트의 인스턴스입니다.  이 값은 NULL이 될 수 없습니다.  즉 gameObject가 없는 Monobehaviour 객체는 있을 수 없습니다.  gameObject의 타입은 GameObject이며, 일반적으로 임시 변수명으로 쓸 때에는 go라는 이름을 많이 쓰고 있으니, 이것도 알아두심이 좋을 듯 합니다.  GameObject에 대해서는 다른 강좌에서 설명하도록 할께요.  Unity3D에서는 하나의 gameObject에 여러개의 Mobobehaviour 클래스를 상속받은 클래스(Unity3D에서는 이것을 컴포넌트(component)라 합니다.)를 연결할 수 있습니다.  연결된 컴포넌트들은 모두 독립적으로 동작을 합니다.

 

name이란 멤버변수는 gameObject의 이름입니다.  name이란 멤버변수도 gameObject와 같이 연결된 모든 컴포넌트와 공유합니다.  사실 name은 GameObject 클래스에도 똑같이 들어가 있습니다.  제 경우에는 오브젝트 이름이 필요할 때, MonoBehaviour의 name보다는 GameObject의 name을 참조하는 편입니다.

 

멤버 함수 중에서 당장 알아두셔야하는 것들은 총 4가지입니다.  Awake(), Start(), Update(), LateUpdate() 입니다.  이 4가지 함수들은 다음과 같이 호출됩니다.

 

 

                               [MonoBehaviour 클래수 주요 멤버함수 호출 순서]

 

Awake() 함수는 클래스 인스턴스가 생성되면서 실행됩니다.  그래서 처음 한번 호출됩니다.

Start() 함수도 클래스 인스턴스 당 한번만 호출되지만, 호출 시점은 Update를 하기전에 생성된 인스턴스가 있다면, 호출합니다.  그래서 Awake() 함수보다 늦게 호출이 됩니다.

Update() 함수는 매 프레임마다 호출이 됩니다.  Unity3D는 모든 클래스 인스턴스들의 Update() 함수를 호출하기 전에 Time의 시간을 계산합니다.  그래서 모든 클래스의 Update()에 동일한 시간 간격이 지정되어 계산할 수 있게 합니다.

LateUpdate() 함수도 Update()함수와 동일하지만, 다른 점은 모든 클래스 인스턴스의 Update()가 호출된 후에 호출이 된다는 것입니다.

 

Unity3D에서는 이와 같이 기본적인 MonoBehaviour 클래스를 운용합니다.  그런데 문제는 클래스 객체간 순서입니다.  Awake()와 Start() 함수를 적절히 이용해서 초기화하는 순서를 어느정도 조절할 수 있지만, 실제 복잡한 게임을 제작하게 되면, 이것이 만만치 않습니다.

 

마찬가지로 Update()와 LateUpdate() 함수를 이용해서 매 프레임마다 두단계 실행 순서를 조절할 수 있지만, LateUpdate() 함수의 경우 카메라와 같이 업데이트가 제일 나중에 되어야 할 오브젝트에서 이미 쓰고 있기 때문에 곤란합니다.

 

예를 들어서 두개의 오브젝트 A, B가 충돌할 때, A가 움직여서 충돌할 때의 결과와 B가 움직여서 충돌할 때의 결과가 다르다고 합시다.  두 오브젝트 모두 움직여서 충돌이 된다면, Update() 함수의 순서를 보장할 수 없기 때문에 어떤 것이 먼저 충돌할지 모른다는 것이죠.

 

실제 Unity3D에서 프로젝트를 만들어서 실험을 해보도록 하겠습니다.

 

먼저 새로운 프로젝트를 생성토록 합니다.  프로젝트 이름은 Tutorial1 정도로 할께요.

Unity3D 환경설정에 따라 다르겠지만, 다음과 같은 화면을 얻을 수 있습니다.

 

 

                         [Unity3D에서 새로운 프로젝트 만들기 : Tutorial1]

 

GameObject->Create Empty 메뉴를 두번 선택해서 두개의 게임오브젝트를 만듭니다.

 

 

                                           [두개의 게임 오브젝트를 생성한다]

 

Hierarchy 창에 GameObject 두개가 생성된 것을 알 수 있습니다.

이름을 바꾸시기 위해서는 Inspector창에 형광색으로 색칠된 곳을 클릭해서 이름을 바꾸셔야 합니다.  간단하게 obj1, obj2라고 바꾸도록 합니다.

 

이 작업이 완료되었으면, Asset->Create->C# Script 메뉴를 선택합니다.  그러면 Assets창에 NewBehaviourScript라는 아이템이 생성됩니다.

 

 

                                          [새로운 스크립트를 만든다.]

 

오른쪽 Inspector창에 MonoBehaviour를 상속받은 클래스 내용이 나옵니다.  이 내용을 간단하게 고쳐보도록 합니다.  NewBehaviourScript 아이템을 더블 클릭에서 열게 되면 편집기 화면으로 갑니다.  거기서 내용을 다음과 같이 고칩니다.

 

[NewBehaviourScript.cs]

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour 
{

	void Awake () 
	{
		Debug.Log ("Awake() : " + gameObject.name);
	}

	// Use this for initialization
	void Start () 
	{
		Debug.Log ("Start() : " + gameObject.name);
	}
	
	// Update is called once per frame
	void Update () 
	{
		Debug.Log ("Update() : " + gameObject.name);
	}

	void LateUpdate () 
	{
		Debug.Log ("LateUpdate() : " + gameObject.name);
	}
}

 

 

해당 스크립트를 저장하고 Unity3D로 와서, 위에서 생성했던 obj1을 클릭하고, NewBehaviourScript 아이템을 Inspector창에 드래그앤드롭합니다.  그러면 Transform 밑에 NewBehaviourScript가 연결되어있는 것을 볼 수 있습니다.

 

 

                                                  [스크립트 연결]

 

obj2에 대해서도 동일한 작업을 해줍니다.

 

그렇게 하고 나서 중앙에 있는 플레이버튼을 눌렀다가 다시 눌러서 종료합니다.

 

 

그다음 Window->Console 메뉴를 선택해서 Console창을 만듭니다.  그 창을 스크롤해서 앞에 부분을 보시면, 각각의 멤버함수 실행순서를 확인해볼 수 있습니다.

 

[실행 결과화면]

 

 

 

이상으로 이번 강좌는 마치도록 하겠습니다.

 

 

 

728x90

'Lecture' 카테고리의 다른 글

3. Unity3D에서 간단한 C# 스크립트 만들기  (0) 2014.04.22
Unity3D의 GameObject 객체 소개  (0) 2014.03.18
Unity3D와 NGUI 소개 및 설치  (0) 2014.03.17
목차  (0) 2014.03.17
코시 곡선 그리기  (2) 2011.09.24

댓글