我有一个协同例程,当一个切换按钮的bool改变时触发,当bool再次改变时应该停止协同例程而另一个应该启动。这是我的代码:
public class thermoPowerControlPanel : MonoBehaviour {
private ThermoElectric thermo;
public bool toggleBool1;
public int temperature;
private int tempUp = 10;
private int tempDown = 1;
public thermoPowerControlPanel (){
temperature = 100;
}
public void turbine1State (bool toggleBool1) {
if (toggleBool1 == false) {
Debug.Log (toggleBool1);
Invoke("ReduceTemperatureEverySecond", 1f);
}
if (toggleBool1 == true) {
Debug.Log (toggleBool1);
Invoke("IncreaseTemperatureEverySecond", 1f);
}
}
private void ReduceTemperatureEverySecond()
{
if (toggleBool1 == true)
{
Debug.Log("I was told to stop reducing the temperature.");
return;
}
temperature = temperature - tempDown;
Debug.Log (temperature);
Invoke("ReduceTemperatureEverySecond", 1f);
}
private void IncreaseTemperatureEverySecond()
{
if (toggleBool1 == false)
{
Debug.Log("I was told to stop increasing the temperature.");
return;
}
temperature = temperature + tempUp;
Debug.Log (temperature);
Invoke("ReduceTemperatureEverySecond", 1f);
}
}
当函数turbine1State(bool t1)收到第一个bool(false)时,例程reduceTemperatureEverySecond()启动但是它立即停止,发送Debug.Log消息后,应该继续降低温度直到bool(由切换按钮)变为真。
你能帮忙吗?
答案 0 :(得分:3)
public Toggle tog; // DONT FORGET TO SET IN EDITOR
在Start
... 中
InvokeRepeating( "Temp", 1f, 1f );
......然后......
private void Temp()
{
if (tog.isOn)
temperature = temperature + 1;
else
temperature = temperature - 1;
// also, ensure it is never outside of 0-100
temperature = Mathf.Clamp(temperature, 0,100);
}
如果您需要“完全停止”该动作(向上和向下),只需执行此操作
CancelInvoke("Temp");
太容易了!
纯粹注意FYI,我解释的另一种模式是:
bool some flag;
Invoke("Temp", 1f);
private void Temp()
{
if (some flag is tripped) stop doing this
.. do something ..
Invoke( ..myself again after a second .. )
}
在现实生活中,通常最好“保持自己调用”而不是使用InvokeRepeating。
在这个简单的例子中,只需使用InvokeRepeating,然后使用CancelInvoke。
答案 1 :(得分:1)
您只能通过名称停止协程。
尝试使用StartCoroutine("increaseTemperature");
,然后StopCoroutine("increaseTemperature");
。
http://docs.unity3d.com/Manual/Coroutines.html
有很多方法可以拨打StartCoroutine
。你可以"停止"一个协同程序 IF 你用"字符串"方法,像这样StartCoroutine("FunctionNameAsStringHere");
如果你像StartCoroutine(FunctionNameAsStringHere());
那样开始,你就无法通过名字来阻止它。
(您也可以访问实际的枚举器来停止协同程序,但这远远超出了使用协同程序的初学者的范围。)