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