Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 停止方法的执行_C#_Unity3d - Fatal编程技术网

C# 停止方法的执行

C# 停止方法的执行,c#,unity3d,C#,Unity3d,因此,我有一个颜色变换器的方法,不断改变我的精灵的颜色。我的问题是,我想在执行OnMouseDown方法时暂停它 我用if和return语句进行了尝试。我也试过使用布尔值,但不起作用 public class colorchange : MonoBehaviour { public int color; private SpriteRenderer _mySpriteRenderer; private float _timeBetweenChange

因此,我有一个颜色变换器的方法,不断改变我的精灵的颜色。我的问题是,我想在执行OnMouseDown方法时暂停它

我用if和return语句进行了尝试。我也试过使用布尔值,但不起作用

       public class colorchange : MonoBehaviour
       {
        public int color;

private SpriteRenderer _mySpriteRenderer;
private float _timeBetweenChanges = 1f;

void Start()
{
    _mySpriteRenderer = GetComponent<SpriteRenderer>();
    InvokeRepeating("ChangeColor", 0F, _timeBetweenChanges);
}

void Update()
{
    // not executed
}

void ChangeColor()
{
        color = Random.Range(1, 5);
        if (color == 2)
        {
            _mySpriteRenderer.color = Color.blue;
        }
        if (color == 3)
        {
            _mySpriteRenderer.color = Color.red;
        }
        if (color == 4)
        {
            _mySpriteRenderer.color = Color.yellow;
        }




}
private void OnMouseDown()
{
  // the Changecolor method should be paused in this one
}
}
评论中提到的另一种替代方法是使用bool

public class colorchange : MonoBehaviour {

private bool canChangeColor;

//...

private void ChangeColor() {
   if (!canChangeColor) {
       // You can even do something here if you like.
       return;
   }
   // ...
}

private void OnMouseDown(){
   canChangeColor = false;
}
}
尽管我强烈建议使用CancelInvoke,除非你需要它做一些事情,如果它不能改变颜色的话

如前所述,CancelInvoke和布尔标志是选项

然而,我更喜欢/建议一种不同的方法

将您的方法更改为常规

public class colorchange : MonoBehaviour
{
    public int color;

    private SpriteRenderer _mySpriteRenderer;
    private float _timeBetweenChanges = 1f;
    private Coroutine _colorRoutine;

    void Start()
    {
        _mySpriteRenderer = GetComponent<SpriteRenderer>();
        _colorRoutine = StartCoroutine(ChangeColor());
    }

    IEnumerator ChangeColor()
    {
        while (true)
        {
            color = Random.Range(1, 5);
            if (color == 2)
            {
                _mySpriteRenderer.color = Color.blue;
            }
            else if (color == 3)
            {
                _mySpriteRenderer.color = Color.red;
            }
            else if (color == 4)
            {
                _mySpriteRenderer.color = Color.yellow;
            }

            yield return new WaitForSeconds(_timeBetweenChanges);
        }
    }

    private void OnMouseDown()
    {
        StopCoroutine(_colorRoutine );
    }
}
我更喜欢这种方法,因为您可以保留对例程的引用,甚至可以在不停止/启动的情况下更改延迟时间


此外,您不依赖于与方法名称匹配的字符串,并且在使用协同程序而不是调用方法时,可以传递额外的参数。

好了,您似乎不想使用OnMouseDown,因为您不能或不想将碰撞器附加到被单击的对象,或者您希望在任何位置都能检测到鼠标单击。在这种情况下,我建议使用Input.GetMouseButtonDown0来检测任何地方发生的鼠标单击。我还建议使用协同程序来使用方便的工具,如Waitill:


我从来没有在Unity中编程过,但在google上快速搜索了一下,认为文档页面有你的答案。@LaurenzKaml它怎么不起作用,你能包括一些错误日志吗?另外,游戏对象需要有一个对撞机才能让OnMouseDown工作。我不太确定是否也需要刚体。@LaurenzKaml您知道是否调用了OnMouseDown方法吗?如果将Debug.LogTest123;在OnMouseDown里面,有什么东西被打印出来了吗?@LaurenzKaml它不起作用,这是没有信息的。告诉我们它实际上在做什么。我怀疑你的代码中有其他东西不起作用,正如你对Kaynn的答案所说的那样,他的答案也应该起作用。
public class colorchange : MonoBehaviour
{
    public int color;        
    public float delaySeconds = 1f;
    IEnumerator changeColorCoroutine;

    SpriteRenderer mySprite;

    public bool doChangeColor;

    void Start()
    {
        // cache result of expensive GetComponent call
        mySprite = GetComponent<SpriteRenderer>();

        // initialize flag
        doChangeColor = true;

        // create coroutine
        changeColorCoroutine = ChangeColor();

        // start coroutine
        StartCoroutine(changeColorCoroutine);
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // toggle doChangeColor
            doChangeColor = !doChangeColor;
        }
    }

    IEnumerator ChangeColor()
    {
        WaitUntil waitForFlag = new WaitUntil( () => doChangeColor);

        while (true)
        {
            yield return waitForFlag;

            Debug.Log("Hello");
            color = Random.Range(1, 5);

            // switch for neater code
            switch (color)
            {
            case 2:
                mySprite.color = Color.blue;
                break;

            case 3:
                mySprite.color = Color.red;
                break;

            case 4:
                mySprite.color = Color.yellow;
                break;
            }

            yield return new WaitForSeconds(delaySeconds);
        }
    }
}