Yanıtlar:
Alternatif olarak, modül kullanan bir astar vardır:
void Update()
{
//if you want it loop from specific start time rather than from start of the game,
//subtract said time value from Time.time argument value
if(Mathf.Repeat(Time.time, execDuration + sleepDuration) < execDuration)
executeFunction();
}
%
operatör genellikle garip davranıyor - ya kayan nokta sayılarıyla çalışmıyor, matematik anlamında modülün çalışması için beklenmedik ya da doğrudan yanlış sonuçlar veriyor (donanımın doğasını yansıtıyor) tamsayılarda işlem). C # / mono operatörünün Repeat()
tam olarak uygulanmasını arama zorunluluğundan kaçınmak için daha güvenli bir seçenek olarak seçildi %
.
Aşağıdaki kodu test etmedim, ancak fikri alacaksınız:
public float wakeUpDuration = 10.0f ;
public float sleepDuration = 2.0f;
private bool callFunction = true ;
private float time = 0 ;
void Update()
{
time += Time.deltaTime;
if( callFunction )
{
if( time >= wakeUpDuration )
{
callFunction = false;
time = 0 ;
}
else
{
foo(); // Your function
}
}
if( !callFunction && time >= sleepDuration )
{
callFunction = true;
time = 0 ;
}
}
deltaTime
nispeten kısa olduğunda işe yarar . Delta daha uzunsa sleepDuration
bu başarısız olur.
Bunu bir program ile de yapabilirsiniz. Gibi bir şey
public class Comp : MonoBehaviour
{
private bool _shouldCall;
Start()
{
StartCoroutine(UpdateShouldCall)
}
Update()
{
if(_shouldCall)
CallTheFunction();
}
IEnumerator UpdateShouldCall()
{
while(true)
{
_shouldCall = true;
yield return new WaitForSeconds(10);
_shouldCall = false;
yield return new WaitForSeconds(2);
}
}
}
Repeat()
Ve%
(modül) arasında bir fark var mı ? Belgelerde, "bu modulo operatörüne benzer, ancak kayan nokta sayılarıyla çalışır " , ancak modül kayan noktalarla çalışır ...