Version: 2019.4
언어: 한국어
컴포넌트를 사용하여 게임 오브젝트 제어
시간 및 프레임 속도 관리

이벤트 함수

Unity의 스크립트는 코드가 작업을 완료할 끝날 때까지 연속적인 루프로 계속 실행되는 기존 프로그램의 개념과 다릅니다. 대신 Unity는 스크립트 안에 선언된 특정 함수를 호출하여 컨트롤을 간헐적으로 스크립트에 넘깁니다. 함수 실행이 완료되면 컨트롤이 다시 Unity에 반환됩니다. 이런 함수는 게임플레이 중에 발생하는 이벤트에 대응하여 Unity에서 활성화되기 때문에 이벤트 함수라고 합니다. Unity는 특정 이벤트에 대해 호출할 함수를 확인하기 위해 이름 지정 체계를 사용합니다. 예를 들어 (프레임 업데이트가 일어나기 전에 호출되는) Update 함수와 (오브젝트의 첫 프레임 업데이트 직전에 호출되는)Start 함수는 이미 표시되었을 것입니다. Unity에서는 훨씬 더 많은 이벤트 함수를 사용할 수 있습니다. 전체 함수 리스트는 MonoBehaviour 클래스에 대한 스크립트 레퍼런스 페이지에서 자세한 사용법과 함께 확인할 수 있습니다. 다음은 가장 많이 사용되는 중요한 이벤트의 일부입니다.

정기 업데이트 이벤트

게임은 애니메이션 프레임이 즉흥적으로 생성되는 애니메이션과 비슷합니다. 게임 프로그래밍의 핵심적인 개념 중 하나는 각 프레임이 렌더링되기 전에 게임에서 오브젝트의 포지션, 상태 및 동작을 변경하는 것입니다. Unity에서는 이런 코드가 Update 함수에 주로 있습니다. Update 함수는 프레임이 렌더링되기 전에 호출되고 애니메이션이 계산되기 전에도 호출됩니다.

void Update() {
    float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal");
    transform.Translate(Vector3.right * distance);
}

물리 엔진도 프레임 렌더링과 비슷한 방법으로 불연속적인 시간 단계로 업데이트됩니다. FixedUpdate라는 별도의 이벤트 함수는 각 물리 업데이트 직전에 호출됩니다. 물리 업데이트와 프레임 업데이트는 동일한 빈도로 실행되지 않으므로, Update 대신 FixedUpdate 함수에 물리 코드를 삽입하면 물리 코드에서 더욱 정확한 결과를 얻을 것입니다.

void FixedUpdate() {
    Vector3 force = transform.forward * driveForce * Input.GetAxis("Vertical");
    rigidbody.AddForce(force);
}

씬의 모든 오브젝트에 대해 Update 및 FixedUpdate 함수를 호출한 후와 모든 애니메이션이 계산된 후의 포인트에 변경 사항을 추가로 적용할 수 있어도 때때로 유용합니다. 예로는 카메라가 타겟 오브젝트를 계속 따라가야 하는 경우가 있습니다. 카메라 방향은 타겟 오브젝트가 이동한 후에 조정해야 합니다. 또한 (예를 들어 캐릭터의 머리가 씬에 있는 타겟 오브젝트를 향해 바라보도록 하기 위해) 스크립트 코드가 애니메이션의 효과를 치환해야 하는 경우도 예로 들 수 있습니다. 이런 상황에는 LateUpdate 함수를 사용할 수 있습니다.

void LateUpdate() {
    Camera.main.transform.LookAt(target.transform);
}

초기화 이벤트

게임플레이 중에 실행되는 업데이트 전에 초기화 코드를 호출할 수 있으면 종종 유용합니다. Start 함수는 첫 프레임이나 오브젝트의 물리 업데이트 전에 호출됩니다. Awake 함수는 씬이 로드될 때 씬의 각 오브젝트에 대해 호출됩니다. 다양한 오브젝트의 Start 및 Awake 함수는 임의 순서로 호출되지만, 모든 Awake는 첫 Start가 호출되기 전에 완료됩니다. 따라서 Start 함수는 Awake 단계에 이미 수행된 다른 초기화를 이용할 수 있습니다.

GUI 이벤트

Unity에는 씬의 메인 액션 위에 GUI 컨트롤을 렌더링하고 이 컨트롤의 클릭에 반응하는 시스템이 있습니다. 이 코드는 노멀 프레임 업데이트와 다소 다르게 처리되므로 주기적으로 호출되는 OnGUI 함수에 넣어야 합니다.

void OnGUI() {
    GUI.Label(labelRect, "Game Over");
}

게임 오브젝트 위에 발생하는 마우스 이벤트가 씬에 나타날 때도 탐지할 수 있습니다. 이 기능은 무기를 타게팅하거나 현재 마우스 포인터 아래에 있는 캐릭터에 대한 정보를 표시하는 데 사용할 수 있습니다. OnMouseXXX 이벤트 함수 집합(예: OnMouseOver, OnMouseDown)을 사용하여 스크립트가 마우스를 통한 사용자 액션에 반응하도록 할 수 있습니다. 예를 들어 포인터가 특정 오브젝트 위에 있을 때 마우스 버튼을 누르면 해당 오브젝트의 스크립트에 OnMouseDown 함수가 있는 경우 호출됩니다.

물리 이벤트

물리 엔진은 오브젝트의 스크립트에 있는 이벤트 함수를 호출하여 오브젝트 충돌을 보고합니다. OnCollisionEnter, OnCollisionStayOnCollisionExit 함수는 접촉이 발생하거나 유지되거나 분리될 때 호출됩니다. 해당되는 OnTriggerEnter, OnTriggerStayOnTriggerExit 함수는 오브젝트의 콜라이더가 트리거(무언가가 안에 들어오면 물리적으로 반응하지 않고 단순히 감지만 하는 콜라이더)로 설정된 경우에 호출됩니다. 이런 함수는 물리 업데이트 중에 하나 이상의 접촉이 감지되는 경우 여러 번 연속적으로 호출될 수 있고, 따라서 충돌에 대한 세부 정보(포지션과 대상 오브젝트의 정체)를 제공하는 파라미터가 함수에 전달됩니다.

void OnCollisionEnter(otherObj: Collision) {
    if (otherObj.tag == "Arrow") {
        ApplyDamage(10);
    }
}

컴포넌트를 사용하여 게임 오브젝트 제어
시간 및 프레임 속도 관리