게임을 구현하다보면 버프나 디버프, 혹은 게임의 순환시간과 다르게 흘러가는 것을 볼 수 있다.
유니티에서는 대부분의 순환은 Update() 메소드가 호출되는 것으로 상태가 업데이트 된다.
하지만 이 순환과 별개로 다른 상황에서 다른 조건으로 순환을 만들어야하는 상황이 있다.
이럴 때 사용하는 것이 Coroutine이다.
https://docs.unity3d.com/kr/2022.3/Manual/Coroutines.html
유니티 공식 문서에도 나와있는 말로 코루틴은 쓰레드가 아니다. 같은 메인 쓰레드에서 작업되며, 만약 코루틴이 너무 많이 생성될 경우, 메인 쓰레드에 걸리는 부하가 매우 커질 수 있다.
그래서 코루틴은 HTTP 통신, 파일 I/O, 에셋로드 등 게임의 메인 작업과 별개로 비동기 작업으로 이루어지는 경우에 사용하는 것이 좋다.
private IEnumerator Move()
{
while(true)
{
transform.position += Vector3.forward*1.0f*Time.deltaTime;
yield return null;
// 실행을 일시정지하고 다음 프레임에서 밑의 코드가 실행된다.
transform.Rotate(Vector3.forward*1.0f*Time.deltaTime);
yield return new WaitforSeconds(1.0f);
//다음 루틴 시작을 1초 지연시간을 부여할 수 있다.
}
}
private void Update()
{
if(Input.MouseButtonDown(0))
{
StartCoroutine(Move());
// 마우스 왼클릭 시 코루틴 시작
}
if(Input.MouseButtonDown(1))
{
StopCoroutine(Move());
// 우클릭 시 코루틴 종료
}
}
여러가지 씬을 만들 때, 다양한 오브젝트를 만들어서 투입할 수 있다. 하지만 상황에 따라 같은 오브젝트를 여러 번 재사용해야 할 수도 있다. 이럴 때 Prefab 시스템을 이용해서 먼저 오브젝트를 만들어 놓은 다음, 필요할 때 씬에 새로운 프리펩 인스턴스를 만들어 주는 시스템이다.

project 윈도우에서 새로운 프리펩을 생성할 수 있다.

생성한 프리펩을 클릭하면 다음과 같이 화면이 바뀌게 된다.
여기서 원하는 형태의 오브젝트를 만들어 줄 수 있고, 이후에 원하는 상황에 해당 프리펩을 가져다 사용할 수 있다.