Код, который вы предоставили, работает очень хорошо, и грехи, вы говорите, цвет меняется только один раз, я предполагаю, что у вас есть коллайдер на объекте, к которому прикреплен скрипт, единственное, что вы должны изменить, это продолжение вызова GetComponent<SpriteRenderer>
потому что это довольно дорого и должно вызываться только в Start
или Awake
другой вещи, которая не важна, и в этом нет ничего плохого, но это как-то меня теряет, это созданиеновая сопрограмма в конце старой, почему бы не сделать что-то вроде этого:
private Coroutine _colorChanger;
private SpriteRenderer _renderer;
void Start() //Can be Awake, whichever you choose
{
_renderer = GetComponent<SpriteRenderer>();
if (_renderer == null)
{
Debug.Log("No sprite found.");
return;
}
//This is performed if OnMouseDown is implemented, if you implement the Update with Input.GetKeyDown, then this can be removed
var collider = GetComponent<Collider>();
if (collider == null)
{
collider = gameObject.AddComponent<BoxCollider>(); //or BoxCollider2D if you are applying the script to the sprite itself.
}
collider.isTrigger = true;
}
private void OnMouseDown() //this can be swapped out for what Saif wrote, a Update method which checks if the button is down, should be GetKeyDown instead of GetKey, having it that way will eliminate the need for a collider/UI element
{
if (_colorChanger == null)
{
_colorChanger = StartCoroutine(ChangeColor(2f));
}
else
{
StopCoroutine(_colorChanger);
_colorChanger = null;
}
}
IEnumerator ChangeColor(float timeoutSec)
{
while (true)
{
yield return new WaitForSeconds(timeoutSec);
int random = Random.Range(1, 5); //Change max from 4 to 5
if (random == 1)
{
_renderer.color = Color.blue;
}
else if (random == 2)
{
_renderer.color = Color.red;
}
else if (random == 3)
{
_renderer.color = Color.green;
}
else
{
_renderer.color = Color.yellow;
}
}
}
Обновление: только что заметил что-то, что другие пропустили, вы должны изменить Random.Range(1, 4)
на Random.Range(1, 5)
или желтыйцвет никогда не вступит в силу.
![A preview of the color change using the above script, turn on and turn off](https://i.stack.imgur.com/92F7Z.gif)