public class FireController : MonoBehaviour
{
[SerializeField] [Range(6, 12)] int timer;
float timeLeft;
void OnEnable()
{
timeLeft = timer;
}
void Update()
{
timeLeft -= time.deltaTime;
if (timer <= 0)
{
gameObject.SetActive(false);
}
}
원래 이렇게 썼었는데 코루틴 써서 아래처럼 고쳤거든.
코루틴 첨 써보는데 저렇게 쓰는거 맞음? 작동은 제대로 하긴 하는데
public class FireController : MonoBehaviour
{
[SerializeField] [Range(6, 12)] int timer;
void OnEnable()
{
StartCoroutine(TurnOffIn(timer));
}
IEnumerator TurnOffIn(float seconds)
{
yield return new WaitForSeconds(seconds);
gameObject.SetActive(false);
}
}
글고 유니티 문서 보니까 'UnityScript에서 코루틴을 시작하는 경우, 일반 함수와 동일하게 호출합니다' 라고 써있어서
StartCoroutine(TurnOffIn(timer)); 이거 안 쓰고 그냥 TurnOffIn(timer) 이렇게 쓰니까 작동 안 하던데 문서에는 왜 일반 함수랑 동일하게 호출한다고 써있는거임??
계속 새로운 시간 생성하는것도 비효율이니까
private WaitForSeconds waitTime = new WaitForSeconds(0.01f);//0.01초 지연을 위한 변수지정. 변수 선언해서 yield return waitTime; 이런식으로 하는게 좋을거야
아하! 고거 당장 수정하러 간다. 땡큐!
StartCoroutine(TurnOffIn(timer)); 이거 안 쓰고 그냥 TurnOffIn(timer) 이렇게 쓰니까 작동 안 하던데 문서에는 왜 일반 함수랑 동일하게 호출한다고 써있는거임?? 이건 나도 모르겠움 애초에 코루틴 실행할 때 저런 식으로 사용해야 돌아가도록 설정된거같은데
IEnumerator가 뭔질 알아야 이해할 수 있어
IEnumerator는 호출될때마다 마지막 yield return 지점에서 시작하는 특수한 함수임 코루틴은 IEnumerator를 업데이트마다 호출하게 해주는 함수고 매 업데이트 마다 호출해줘야 작동하는데 한번만 호출하니까 작동을 안하는거임