본문 바로가기

IT/유니티

2016/8/18 유니티 개발 노트

1. Start() vs Awake()


스타트와 어웨이크는 얼뜻보면 같아보인다.

하지만 그 의미가 아주 다른다.


마치 스타트는 생성자처럼 보인다. 왜냐하면 기본적으로 생성되어 나오기때문에, 

기존 프로그래머들은 아마도 아~ 스타트는 생성자랑 비슷한가 보다..

라고 생각할것이다.


하지만 스타트는 전~혀 생성자 라고 말하기 힘들다.

생성자라기 보다는 업데이트직전에 불려지는 업데이트의 문이라고 생각하시면 더 정확할것이다.


그럼 반면에 어웨이크는 기본적으로는 보이기 않기때문에 잘 모르는 개발자가 있을수도 있지만,

어웨이크가 훨씬 생성자에 가깝다고 말할수 있다.

말그대로 깨어나다 라는 뜻을 가진 어웨이크는 그 클라스가 어웨이크 할때 즉 생성될때 불려진다.


왜 스타트와 어웨이크가 중요한가하면 다음의 소스를 보면 이해하기 쉬울것이다.




public class Cell : MonoBehaviour {


Renderer materialColor;


void Awake(){

}


// Use this for initialization

void Start () {

materialColor = GetComponent<Renderer> ();

materialColor.material.color = new Color(Random.Range(0.0f, 0.9f)

,Random.Range(0.0f, 0.9f)

,Random.Range(0.0f, 0.9f));


}


위와같이 스타트에서 materialColor를 정의한다면, 다른 게임메니져에서 이 prefab을 생성했을때에 과연 materialColor를 접근할수 있을까?

물론 퍼블릭이니까 접근가능하다, 하지만! NullPoint를 가질것이다.


왜냐하면 생성했다고 해서 스타스에 들어가지는 않기때문이다. 

매니저의 스타트도 다 끝나고 업데이트를 하기 직전에 불려지는 것이 스타트이기때문이다.


그렇게 때문에 매니저에서 객체를 생성에서 조작접근하고 싶다면, 그 객체는 어웨이크를 생성자로 생각하고 개발하는것이 좋을것이다.


덕분에 개고생했다.