2013-08-12 4 views
0

Unity3D C#에서 조건이 충족 될 때까지 x 초마다 코드를 실행해야합니다. 코드는 조건이 참일 때 다른 코드와 관계없이 실행되어야하며 그렇지 않은 경우 중지해야합니다. 조건이 거짓으로 바뀌 자마자 실행을 멈추고 조건이 참일 경우 다시 실행해야합니다 (가능한 경우 0에서 초로 계산). 그렇게하는 방법?매 x 초 후에 Unity3D에서 일부 코드를 실행하는 방법은 무엇입니까?

답변

3

이와 비슷한 기능이 작동합니다.

void Start(){ 
    StartCoroutine("DoStuff", 2.0F); 
} 

IEnumerator DoStuff(float waitTime) { 
    while(true){ 
     //...do stuff here 
     if(someStopFlag==true)yield break; 
     else yield return new WaitForSeconds(waitTime); 
    } 
} 
2

실제로는 수율이 높은 coroutine을 사용하는 것보다 나은 방법이 있습니다. InvokeRepeating 방법은 적은 오버 헤드를 가지고 있으며, 추악한 동안 (사실) 구조가 필요하지 않습니다

또한
using UnityEngine; 
using System.Collections; 

public class Example : MonoBehaviour { 
    public Rigidbody projectile; 
    public bool Condition; 
    void LaunchProjectile() { 
     if (!Condition) return; 
     Rigidbody instance = Instantiate(projectile); 
     instance.velocity = Random.insideUnitSphere * 5; 
    } 
    void Start() { 
     InvokeRepeating("LaunchProjectile", 2, 0.3F); 
    } 
} 

, 어떻게 당신의 상태가 정의를?

public class Example : MonoBehaviour { 
    public Rigidbody projectile; 
    private bool _condition; 
    public bool Condition { 
     get { return _condition; } 
     set 
     { 
      if (_condition == value) return; 
      _condition = value; 
      if (value) 
       InvokeRepeating("LaunchProjectile", 2, 0.3F); 
      else 
       CancelInvoke("LaunchProjectile"); 
    } 
    void LaunchProjectile() { 
     Rigidbody instance = Instantiate(projectile); 
     instance.velocity = Random.insideUnitSphere * 5; 
    } 
} 
+2

[여기가 (http://forum.unity3d.com/threads/67856-Coroutines-vs- : 당신이없는이 방법은 그것에게 모든 시간을 확인하는 - 그것은 속성의 경우 훨씬 낫다 업데이트) 오버 헤드와 관련하여 [링크] (http://answers.unity3d.com/questions/189917/any-costs-i-should-know-about-associated-with-invo.html)를 참조하십시오. 이러한 링크의 벤치 마크에 세심한주의를 기울이면 5000 개체의 4ms 스파이크가 비효율을 느끼지 않습니다. 또한, 마지막으로 점검 했으므로 런타임에 InvokeRepeating의 반복 속도를 수정할 수 없습니다. InvokeRepeating은 깨끗합니다. 의심의 여지가 없습니다. – Jerdak

관련 문제