因此,我有这种换色器方法,可以连续更改精灵的颜色。我的问题是我想在执行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
}
}
将方法放入Update()方法中。然后将其封装在if语句中,该语句在OnMouseDown()上变为false。
private bool methodEnabled = true;
void Update()
{
if (methodEnabled)
{
ChangeColor(){...}
}
}
void OnMouseDown()
{
methodEnabled = false;
}
有几种方法可以解决此问题,其中一些方法需要更改您的代码。
以下是解决问题的两种最简单的方法。
此策略在ecco's comment中部分显示,尽管他们的解决方案涉及Update()方法,但这不是必需的。
void ChangeColor()
{
if(!paused)
{
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;
}
}
}
void OnMouseDown()
{
paused = true;
}
void OnMouseUp()
{
paused = false;
}
这有效地使您的InvokeRepeating继续运行,但是如果将游戏标记为“已暂停”,ChangeColor的逻辑将不会执行。按照最佳实践标准,这是可以接受的解决方案。
InvokeRepeating使用游戏时间,而不是实时。因此,如果使用Time.timeScale更改游戏的时间标度,则可以有效地pause重复调用。但是,这也会暂停游戏中其他任何基于时间的交互(例如物理)。
void OnMouseDown()
{
Time.timeScale = 0.0f //Stop time.
}
void OnMouseUp()
{
Time.timeScale = 1.0f //Allow time to continue at a normal pace.
}
修改时间表通常只用于暂停整个游戏,而不仅仅是特定方法,因为它会暂停所有物理过程。我建议使用基于布尔的方法,但这只是可以使其工作的另一种方法。