midas+son의 크리에이티브(creative) 이야기

지난 글에 이벤트 함수에 대해 말한 게 있었는데 오늘 공부 하다가 하나 확실히 안게 있다.


http://docs.unity3d.com/kr/current/Manual/ExecutionOrder.html

//스크립트 라이프 사이클 플로우차트(Script Lifecycle Flowchart)



Awake(), Start() 두가지 함 수 모두 보통 맨처음 초기화 해줄 때 사용 해줬는데

본인은 Awake를 자주 사용해서 

Awake만 쓰다가 문제가 발생하였었다.


폭탄을 포물선으로 날리기 위해

폭탄을 prefab(자식에 리지드바디가 있는 Sphere가 있음)으로 만들고 

Player가 스크립트에서 

GameObject.Instantiate()을 이용하여

폭탄을 동적 생성을 하게 만들었다.

그리고 폭탄의 방향을 주기 위해 

GameObject bomb = GameObject.Instantiate(bombTemp, this.transform.position, Quaternion.identity) as GameObject;

bomb.transform.rotation = this.transform.rotation;

위와 같이 자신의 방향을 넘겨 주었는데

이부분에서 문제가 있었다.


폭탄 prefab의 자식 ball에 script가 있는데

맨처음에는 

    public void Awake()

    {

        enemyMask = LayerMask.GetMask("Shootable");

        floorMask = LayerMask.GetMask("Floor");

        start = false;

        explosion = false;


        bombRigidBody = transform.GetComponent<Rigidbody>();

        Vector3 startPosition = transform.forward * 0.7f + transform.up * 0.3f;

        bombRigidBody.AddForce(startPosition * 500.0f);   

    }

위 스크립트와 같이 초기화해줄 변수는 초기화 해주고

방향을 가지고 와 힘을 줬는데

방향에서 계속 초기 값이 들어가는 것이었다.


그래서 이것 저것 테스트 해보니 

Player에 있는 bomb.transform.rotation = this.transform.rotation; 부분보다

생성된 Bomb의 Awake()가 먼저 실행된다는 것을 알았다.


그럼 어떻게 하였느냐?


    public void Awake()

    {

        enemyMask = LayerMask.GetMask("Shootable");

        floorMask = LayerMask.GetMask("Floor");

        start = false;

        explosion = false;

    }


    public void Start()

    {

        bombRigidBody = transform.GetComponent<Rigidbody>();

        Vector3 startPosition = transform.forward * 0.7f + transform.up * 0.3f;

        bombRigidBody.AddForce(startPosition * 500.0f);   

    }


위의 script와 같이 

본인만 사용할 뿐인 변수들의 초기화는 Awake() 에

다른 곳에서 값 설정 한 후

컨트롤 하기 위한 초기화는 Start()에 하는 것이

의도한대로 동작 할 방법이었다.


Awake()는 생성 하자마다 들어가는 함수이고

Start()는 Awake() 후에 Update() 전에 동작 하는 이벤트 함수임을 기억하자.

(맨위의 url로 들어가서 다시 한번 이벤트 사이클에 주목하자.)