반응형
코루틴에서 yield return에는 여러 종류가 있다.
주로 사용하는 yield return null, WaitForEndOfFrame, WaitForFixedUpdate 등이 있는데
실제로 큰 차이는 없어 보이지만, 미세하게 타이밍을 알아야할 때는 구분해서 사용해야 한다.
유니티 라이프 사이클을 보면 언제 yield가 리턴되는지 알 수 있다.
LifeCycleYieldReturn1.cs를 아무 오브젝트에 추가한 후 게임을 실행시키고, 오브젝트를 제거해보자. (OnDestroy)
로그를 텍스트로 저장하기 위해 StreamWriter를 사용하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
public class LifeCycleYieldReturn1 : MonoBehaviour
{
StreamWriter writer;
void saveLog(string logString, string stackTrace, LogType type)
{
string currentTime = DateTime.Now.ToString(("HH:mm:ss"));
writer.WriteLine($"[{currentTime}] {logString}");
}
void Awake()
{
writer = new StreamWriter("Assets/Log/mylog.txt");
Application.logMessageReceived += saveLog;
Debug.Log("Test 1 Awake");
}
void OnEnable()
{
Debug.Log("Test 1 OnEnable");
}
void Start()
{
Debug.Log("Test 1 Start");
StartCoroutine(yieldReturnWaitForFixedUpdate());
StartCoroutine(yieldReturnNull());
StartCoroutine(yeildReturnWaitForEndOfFrame());
}
IEnumerator yieldReturnWaitForFixedUpdate()
{
while (true)
{
Debug.Log("Test 1 yieldReturnWaitForFixedUpdate");
yield return new WaitForFixedUpdate();
}
}
void FixedUpdate()
{
Debug.Log("Test 1 FixedUpdate");
}
void Update()
{
Debug.Log("Test 1 Update");
}
void LateUpdate()
{
Debug.Log("Test 1 LateUpdate");
}
IEnumerator yieldReturnNull()
{
while (true)
{
Debug.Log("Test 1 yieldReturnNull");
yield return null;
}
}
void OnDrawGizmos()
{
Debug.Log("Test 1 OnDrawGizmos");
}
void OnGUI()
{
Debug.Log("Test 1 OnGUI");
}
IEnumerator yeildReturnWaitForEndOfFrame()
{
while (true)
{
Debug.Log("Test 1 yeildReturnWaitForEndOfFrame");
yield return new WaitForEndOfFrame();
}
}
void OnDisable()
{
Debug.Log("Test 1 OnDisable");
}
void OnDestroy()
{
Debug.Log("Test 1 OnDestroy");
Application.logMessageReceived -= saveLog;
writer.Flush();
writer.Close();
}
}
로그 출력 결과는 다음과 같다.
[18:03:14] Test 1 Awake
[18:03:14] Test 1 OnEnable
[18:03:14] Test 1 Start
[18:03:14] Test 1 yieldReturnWaitForFixedUpdate
[18:03:14] Test 1 yieldReturnNull
[18:03:14] Test 1 yeildReturnWaitForEndOfFrame
[18:03:14] Test 1 FixedUpdate
[18:03:14] Test 1 yieldReturnWaitForFixedUpdate
[18:03:16] Test 1 Update
[18:03:16] Test 1 yieldReturnNull
[18:03:16] Test 1 LateUpdate
[18:03:16] Test 1 OnDrawGizmos
[18:03:16] Test 1 OnGUI
[18:03:16] Test 1 OnGUI
[18:03:16] Test 1 yeildReturnWaitForEndOfFrame
[18:03:16] Test 1 Update
[18:03:16] Test 1 yieldReturnNull
[18:03:16] Test 1 LateUpdate
[18:03:16] Test 1 OnDrawGizmos
[18:03:16] Test 1 OnGUI
[18:03:16] Test 1 OnGUI
[18:03:16] Test 1 yeildReturnWaitForEndOfFrame
[18:03:16] Test 1 Update
[18:03:16] Test 1 yieldReturnNull
[18:03:16] Test 1 LateUpdate
[18:03:16] Test 1 OnDrawGizmos
[18:03:16] Test 1 OnGUI
[18:03:16] Test 1 OnGUI
[18:03:16] Test 1 yeildReturnWaitForEndOfFrame
[18:03:16] Test 1 FixedUpdate
[18:03:16] Test 1 yieldReturnWaitForFixedUpdate
[18:03:16] Test 1 Update
[18:03:16] Test 1 yieldReturnNull
[18:03:16] Test 1 LateUpdate
[18:03:16] Test 1 OnDrawGizmos
[18:03:16] Test 1 OnGUI
[18:03:16] Test 1 OnGUI
[18:03:16] Test 1 yeildReturnWaitForEndOfFrame
[18:03:16] Test 1 Update
[18:03:16] Test 1 yieldReturnNull
[18:03:16] Test 1 LateUpdate
[18:03:16] Test 1 OnDrawGizmos
[18:03:16] Test 1 OnGUI
[18:03:16] Test 1 OnGUI
[18:03:16] Test 1 yeildReturnWaitForEndOfFrame
...
[18:03:16] Test 1 OnDisable
[18:03:16] Test 1 OnDestroy
Update는 매 프레임마다 호출되고, LateUpdate는 모든 Update가 호출된 후 마지막으로 실행되는 함수다.
FixedUpdate는 Fixed TimeStep에 설정된 값에 따라 일정시간마다 호출된다.
위의 경우는 FixedUpdate 한 번에 Update가 두 번 호출되고 있다.
WaitForFixedUpdate는 FixedUpdate가 종료된 후 호출되고,
yield return null은 Update 후, WaitForEndOfFrame은 프레임이 종료된 후(OnGUI 다음)에 호출되었다.
즉, 코루틴이더라도 유니티 LifeCycle에 따라 호출되는 위치가 다르므로,
정확한 타이밍에 호출해야 불필요한 버그를 줄일 수 있다.
Unity Plus:
Unity Pro:
Unity 프리미엄 학습:
반응형
'개발 > Unity' 카테고리의 다른 글
유니티 UI - Text Mesh Pro 한글 깨짐 현상 해결하기 (0) | 2022.10.10 |
---|---|
유니티 C# - 튜플로 여러 값 반환하기 (Returning Multiple Values Using Tuple) (0) | 2022.10.07 |
유니티 - StreamWriter로 로그를 텍스트 파일로 출력하기 (Output Log with StreamWriter) (0) | 2022.10.02 |
유니티 시네머신 - FreeLook + TargetGroup으로 전체 지도 촬영하기 (0) | 2022.10.02 |
유니티 시네머신 - 현재 활성화된 가상 카메라 가져오기 (How to Get Active Virtual Camera) (0) | 2022.10.02 |
댓글