使用切换按钮停止合作例程

时间:2016-03-15 13:53:13

标签: c# unity3d

我有一个协同例程,当一个切换按钮的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(由切换按钮)变为真。

你能帮忙吗?

2 个答案:

答案 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());那样开始,你就无法通过名字来阻止它。

(您也可以访问实际的枚举器来停止协同程序,但这远远超出了使用协同程序的初学者的范围。)