유니티에서 딜레이를 함수를 딜레이 후 작동하기 위해서는 여러방법이 있습니다.
1.Invoke 함수를 이용하는 방법입니다
유니티 함수는 매개변수 파라미터 인자에 실행할 함수 이름과 딜레이 시간을 넣어주어 실행합니다.
실행함수
Invoke(string methodName, float time);
취소함수 (실행되기전에 취소할수 있습니다)
CancelInvoke();
메소드에 매개변수를 전달해야 하는 경우 대신 Coroutine 을 사용 하는 것이 좋습니다. 코루틴은 또한 더 나은 성능을 제공합니다.
장점
코드가 간결하고 쉽다.
단점
함수이름을 string으로 넣어줘야 한다.
복합적인 딜레이가 하기위해서는 코드가 지져분해 진다.
실행할 함수에 매개변수를 넘길수 없다.
public class Test : MonoBehaviour
{
Rigidbody projectile;
void Start()
{
Invoke("LaunchProjectile", 2.0f);
//2.0초후 함수 LaunchProjectile를 실행합니다.
}
void LaunchProjectile()
{
Rigidbody instance = Instantiate(projectile);
instance.velocity = Random.insideUnitSphere * 5.0f;
}
}
2.Coroutine 을 이용하는 방법입니다.
반환함수가 IEnumerator인 함수를 파라미터에 넣어주어 실행합니다
Coroutine StartCoroutine(IEnumerator routine)
취소함수
StopCoroutine(string methodName);
함수이름을 넣어서 코루틴을 취소합니다.
StopCoroutine(IEnumerator routine);
코루틴을 실행할 함수를 넣어서 멈출수 있습니다.
public void StopCoroutine(Coroutine routine);
StartCoroutine의 반환된 값 Coroutine를 넣어 멈출수 있습니다.
StopAllCoroutines();
behaviour 안에 있는 코루틴 함수를 모두 취소시킵니다. (실행시키고 있는 스크립트 안에 있는 코루틴)
using System.Collections;
using UnityEngine;
public class Test : MonoBehaviour
{
private IEnumerator coroutine;
void Start()
{
coroutine = WaitAndPrint(2.0f); //반환값 IEnumerator를 저장해둔다.
StartCoroutine(coroutine);
//StopCoroutine(coroutine); 반환된 IEnumerator을 저장 해두었다가 멈출때 사용한다
}
//딜레이를 할 함수를 만들어 줍니다. 반환값을 IEnumerator 로 해주어야 합니다.
private IEnumerator WaitAndPrint(float waitTime)
{
while (true)
{
yield return new WaitForSeconds(waitTime); //waitTime 만큼 딜레이후 다음 코드가 실행된다.
Shot();
//While문을 빠져 나가지 못하여 waitTime마다 Shot함수를 반복실행 됩니다.
}
}
public void Shot()
{
}
}
using System.Collections;
using UnityEngine;
public class Test : MonoBehaviour
{
private Coroutine coroutine;
void Start()
{
coroutine = StartCoroutine(WaitAndPrint(2.0f));
//StopCoroutine(coroutine); 반환된 IEnumerator을 저장 해두었다가 멈출때 사용한다
}
//딜레이를 할 함수를 만들어 줍니다. 반환값을 IEnumerator 로 해주어야 합니다.
private IEnumerator WaitAndPrint(float waitTime)
{
while (true)
{
yield return new WaitForSeconds(waitTime); //waitTime 만큼 딜레이후 다음 코드가 실행된다.
Shot();
//While문을 빠져 나가지 못하여 waitTime마다 Shot함수를 반복실행 됩니다.
}
}
public void Shot()
{
}
}
코루틴으로 딜레이 할수 있는 방법들 입니다.
yield return null;
한 프레임 기다린후 진행합니다.
yield return new WaitForSeconds(1f);
게임 시간으로 1초 기다린후 진행합니다. time scale 영향을 받아서 time scale = 1 일겨우 제대로 작동합니다.
yield return new WaitForSecondsRealtime(1f);
실제 시간으로 1초 기다린후 진행합니다. time scale을 영향을 받지 않습니다.
yield return new WaitForFixedUpdate();
다음 FixedUpdate 끝날 때까지 기다린후 진행합니다.
yield return new WaitForEndOfFrame();
다음 프레임의 Update와 모든 렌더링이 끝난후 진행합니다.
'Unity 유니티 기초강의' 카테고리의 다른 글
유니티 에디터 Editor Unity (0) | 2022.06.04 |
---|---|
C# 반환값 여러개 받기 Tuple 메서드 (0) | 2022.05.19 |
유니티 Unity 메모리 관리 가비지 컬렉션 (0) | 2022.05.17 |
유니티 unity 씬 로브 및 전환 (0) | 2022.05.17 |
유니티 수학함수 Mathf (0) | 2022.05.17 |
댓글