Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

GUMI Dev

[유니티 게임 오브젝트 흐름] 초기화 - 프레임(물리, 로직) - 해제 본문

Unity

[유니티 게임 오브젝트 흐름] 초기화 - 프레임(물리, 로직) - 해제

GUMI Dev 2021. 11. 15. 08:53

1. 초기화

1) 최초 Awake()

Awake 함수는 게임 오브젝트를 생성할 때 최초로 한번만 실행된다. 

 

새로운 프로젝트 창에서 실린더 도형을 추가하고 C# 스크립트를 생성했다. 

여기서 생성한 C# 파일의 이름은 "LifeCycle"이라고 설정했다. 

그리고 이 파일을 실린더의 Inspector에 포함시켰다. 

 

C# 스크립트에 아래와 같이 작성해보았다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LifeCycle : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log("플레이어의 데이터가 준비되었습니다. ");
    }
}

정상적으로 작동한다. 

 

 

2) 프레임시작 Start()

Start 함수는 업데이트 시작 직전에 최초로 한번만 실행한다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LifeCycle : MonoBehaviour
{
    // 초기화 영역
    void Awake()
    {
        Debug.Log("플레이어의 데이터가 준비되었습니다. ");
    }

    void Start()
    {
        Debug.Log("장비를 챙겼습니다. ");
    }
}

Awake와 Start 함수를 모두 포함하여 초기화 영역이라고 한다. 

 

2. 프레임

1) 물리 FixedUpdate()

FixedUpdate()는 고정적으로 꾸준히 호출을 하는 고정된 실행주기를 가지며, CPU를 많이 사용한다. 

1초에 약 50회 정도 호출을 한다. 

함수를 하나씩 추가하면서 주석과 함께 코드를 정리해보았다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LifeCycle : MonoBehaviour
{
    // 초기화 - 최초
    void Awake()
    {
        Debug.Log("플레이어의 데이터가 준비되었습니다. ");
    }

    // 초기화 - 프레임 시작
    void Start()
    {
        Debug.Log("장비를 챙겼습니다. ");
    }

    // 프레임 - 물리 연산 
    void FixedUpdate()
    {
        Debug.Log("이동");
    }
}

 

2) 게임로직 Update()

Update 함수는 물리연산을 제외한 나머지, 즉 주기적으로 변하는 로직을 넣을 때 사용하는 함수다. 

FixedUpdate()는 보통 초당 50프레임인 반면, Update()는 초당 60프레임으로 실행된다. 

다만, Update()는 FixedUpdate()와는 달리 환경에 따라 실행 주기가 떨어질 수 있다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LifeCycle : MonoBehaviour
{
    // 초기화 - 최초
    void Awake()
    {
        Debug.Log("플레이어의 데이터가 준비되었습니다. ");
    }

    // 초기화 - 프레임 시작
    void Start()
    {
        Debug.Log("장비를 챙겼습니다. ");
    }

    // 프레임 - 물리 연산 
    void FixedUpdate()
    {
        Debug.Log("이동");
    }

    // 프레임 - 로직
    void Update()
    {
        Debug.Log("몬스터 사냥");  
    }
}

 

3) 후처리 LateUpdate()

LateUpdate 함수는 모든 업데이트가 끝난 후 마지막으로 호출된다. 

예를들면 캐릭터를 따라가는 카메라 또는 후처리 등을 다룰 수 있는 부분이다. 

Update()와 같이 초당 60프레임이다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LifeCycle : MonoBehaviour
{
    // 초기화 - 최초
    void Awake()
    {
        Debug.Log("플레이어의 데이터가 준비되었습니다. ");
    }

    // 초기화 - 프레임 시작
    void Start()
    {
        Debug.Log("장비를 챙겼습니다. ");
    }

    // 프레임 - 물리 연산 
    void FixedUpdate()
    {
        Debug.Log("이동");
    }

    // 프레임 - 로직
    void Update()
    {
        Debug.Log("몬스터 사냥");  
    }

    // 프레임 - 후처리
    void LateUpdate()
    {
        Debug.Log("경험치 획득");
    }
}

 

3. 해제 OnDestory()

OnDestroy 함수는 게임 오브젝트가 삭제되기 직전에 무언가를 남기고 삭제되는 의미로 사용된다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LifeCycle : MonoBehaviour
{
    // 초기화 - 최초
    void Awake()
    {
        Debug.Log("플레이어의 데이터가 준비되었습니다. ");
    }

    // 초기화 - 프레임 시작
    void Start()
    {
        Debug.Log("장비를 챙겼습니다. ");
    }

    // 프레임 - 물리 연산 
    void FixedUpdate()
    {
        Debug.Log("이동");
    }

    // 프레임 - 로직
    void Update()
    {
        Debug.Log("몬스터 사냥");  
    }

    // 프레임 - 후처리
    void LateUpdate()
    {
        Debug.Log("경험치 획득");
    }

    // 해제
    void OnDestroy()
    {
        Debug.Log("플레이어 데이터를 해제하였습니다. ");
    }
}

 

위 C# 스크립트를 작성하고 게임을 플레이를 하면 스크립트가 작동된다. 

여기서 게임이 플레이되는 도중에 게임 오브젝트(여기서는 실린더)를 삭제하면, C# 스크립트에서 OnDestroy 함수에 입력한 기능이 실행된다. 

 

 

여기서 게임 오브젝트를 삭제하지 않고 활성화 또는 비활성화 할 수 있다. 

이어지는 내용을 참고해보자. 

 

4. 활성화 OnEnable()

활성화는 게임의 프로세스 (초기화 - 물리 - 게임로직 - 해체) 중 초기화와 물리 영역 사이에 위치한다. 

따라서 C# 스크립트를 작성할 때 활성화를 하려면 초기화 함수와 물리 함수의 사이에 활성화 함수를 입력해야한다. 

Awake 보다는 늦게, Start 보다는 빠르게 실행된다. 

Awake와 Start와는 달리, OnEnable은 최초 1회 실행이 아니라 활성화나 비활성화를 할 때마다 실행된다. 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LifeCycle : MonoBehaviour
{
    // 초기화 - 최초
    void Awake()
    {
        Debug.Log("플레이어의 데이터가 준비되었습니다. ");
    }

    // 초기화 - 프레임 시작
    void Start()
    {
        Debug.Log("장비를 챙겼습니다. ");
    }

    // 활성화
    void OnEnable()
    {
        Debug.Log("장비를 챙겼습니다. ");
    }

    // 프레임 - 물리 연산 
    void FixedUpdate()
    {
        Debug.Log("이동");
    }

    // 프레임 - 로직
    void Update()
    {
        Debug.Log("몬스터 사냥");  
    }

    // 프레임 - 후처리
    void LateUpdate()
    {
        Debug.Log("경험치 획득");
    }

    // 비활성화

    // 해제
    void OnDestroy()
    {
        Debug.Log("플레이어 데이터를 해제하였습니다. ");
    }
}

 

5. 비활성화 OnDisable()

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LifeCycle : MonoBehaviour
{
    // 초기화 - 최초
    void Awake()
    {
        Debug.Log("플레이어의 데이터가 준비되었습니다. ");
    }

    // 초기화 - 프레임 시작
    void Start()
    {
        Debug.Log("장비를 챙겼습니다. ");
    }

    // 활성화
    void OnEnable()
    {
        Debug.Log("장비를 챙겼습니다. ");
    }

    // 프레임 - 물리 연산 
    void FixedUpdate()
    {
        Debug.Log("이동");
    }

    // 프레임 - 로직
    void Update()
    {
        Debug.Log("몬스터 사냥");  
    }

    // 프레임 - 후처리
    void LateUpdate()
    {
        Debug.Log("경험치 획득");
    }

    // 비활성화
    void OnDisable()
    {
        Debug.Log("플레이어가 로그아웃 했습니다. ");
    }

    // 해제
    void OnDestroy()
    {
        Debug.Log("플레이어 데이터를 해제하였습니다. ");
    }
}

 

게임 오브젝트를 활성 또는 비활성화하기 위해서는, Inspector에서 게임 오브젝트의 스크립트를 체크하거나 체크 취소  하면 된다. 

아래 사진은 게임 오브젝트가 비활성화된 상태다. 

 

 


유니티 공식 문서: https://docs.unity3d.com/kr/530/Manual/ExecutionOrder.html

 

유니티 - 매뉴얼: 이벤트 함수의 실행 순서

자동 메모리 관리를 이해하기 이벤트 함수의 실행 순서 Unity 스크립팅시, 미리 정의된 순서대로 실행되는 많은 이벤트 함수가 있습니다. 아래에서는, 실행 순서를 설명합니다. 에디터 __ Reset : __

docs.unity3d.com

 

'Unity' 카테고리의 다른 글

[유니티 Input] 마우스 입력  (0) 2021.11.17
[유니티 Input] 키보드 입력  (0) 2021.11.17
[유니티 C# 함수 기초] 그룹형 변수  (0) 2021.11.14
[유니티 C# 함수 기초] 변수  (0) 2021.11.14
[유니티 C# 시작하기]  (1) 2021.11.13