Alors j'essaie de créer ce script qui change la couleur du sprite lorsque j'exécute la méthode onmousedown (). Le changement de couleur doit exécuter toutes les 2 secondes. Dans ce code prévu ci-dessous, changez une fois pour une raison quelconque.
J'ai déjà essayé Coroutines. Mais ils n'ont pas fonctionné pour une raison quelconque. P>
Aide s'il vous plaît Merci, P>
public bool startstop = false;
SpriteRenderer m_SpriteRenderer;
IEnumerator Changecolor() {
yield return new WaitForSeconds(3);
int random = Random.Range(1, 4);
if (random == 1) {
this.m_SpriteRenderer = this.GetComponent<SpriteRenderer>();
this.m_SpriteRenderer.color = Color.blue;
} else if (random == 2) {
this.m_SpriteRenderer = this.GetComponent<SpriteRenderer>();
this.m_SpriteRenderer.color = Color.red;
} else if (random == 3) {
this.m_SpriteRenderer = this.GetComponent<SpriteRenderer>();
this.m_SpriteRenderer.color = Color.green;
} else {
this.m_SpriteRenderer = this.GetComponent<SpriteRenderer>();
this.m_SpriteRenderer.color = Color.yellow;
}
this.StartCoroutine("Changecolor", 3f);
}
private void OnMouseDown() {
if (this.startstop) {
this.StartCoroutine("Changecolor", 3f);
this.startstop = !this.startstop;
} else {
this.StopCoroutine("Changecolor");
this.startstop = !this.startstop;
}
}
4 Réponses :
Votre code est correct, sans problème, sauf que la fonction Onmousedown () code> ne sera pas appelée car vous cliquez sur des déclencheurs de case ou des éléments d'interface utilisateur. D'où essayez d'utiliser la fonction de mise à jour comme indiqué ci-dessous:
pas nécessairement si c'est sur un objet de jeu, ce script est attaché à cela fonctionne juste bien
@Bugfinder Il est donné sur ce lien que cela ne peut être appelé que si l'utilisateur a appuyé sur le bouton de la souris via l'élément GUI ou un collisionneur docs.unity3d.com/screprenefence/monobehaviour.onmousedown.h tml
En effet, mais cela ne veut pas dire que cela ne peut pas travailler sur un objet de jeu qui a un collisionneur. Jeter le script Orignal Mousedown sur un cube par défaut et remplacez les Coroutines de début / Arrêt avec des journaux de débogage et voyez-le.
@Bugfinder ah oui, il devrait. On dirait que le gameObject de OP contient Spriterenderer ne contient aucun collision.
Avez-vous un collisionneur Le code fonctionne principalement, mais est loin de la qualité. Voici le code avec quelques améliorations: P> code> sur l'objet? Un Collider code> est nécessaire pour avoir le Onmousedown Code> Événement viré.
- Appeler uniquement getComponent () code> une fois, puis cache le résultat. Cet appel est très cher.
- Initialement, vous devez cliquer deux fois, car la Coroutin sera arrêtée au premier clic. P> public bool m_isRunning = false;
public SpriteRenderer m_spriteRenderer;
private void Start() {
m_spriteRenderer = this.GetComponent<SpriteRenderer>();
}
private IEnumerator Changecolor() {
yield return new WaitForSeconds(3);
int random = Random.Range(1, 4);
if (random == 1) {
m_spriteRenderer.color = Color.blue;
} else if (random == 2) {
m_spriteRenderer.color = Color.red;
} else if (random == 3) {
m_spriteRenderer.color = Color.green;
} else {
m_spriteRenderer.color = Color.yellow;
}
this.StartCoroutine("Changecolor", 3f);
}
private void OnMouseDown() {
m_isRunning = !m_isRunning;
if (m_isRunning) {
StartCoroutine("Changecolor", 3f);
} else {
StopCoroutine("Changecolor");
}
}
Le code que vous avez fourni fonctionne simplement bien et que vous indiquez que la couleur change une seule fois une seule fois, je suppose que vous avez un collisionneur sur l'objet qui dispose du script attaché, la seule chose que vous devriez modifier est la poursuite de l'appel à mise à jour: vient de remarquer quelque chose que les autres manquaient, vous devriez changer le . Getcomponent Démarrer code> ou éveillé code> une autre chose, ce qui n'est pas majeur, et il n'y a rien mal avec ça, mais cela me frotte le mauvais sens, est la création d'une nouvelle Coroutin à la fin de l'ancien, pourquoi ne pas faire quelque chose comme ceci: aléatoire.range (1, 4) code> sur aléatoire.range (1, 5) code> ou bien la couleur jaune n'entrera jamais en vigueur . P>
Notez que le deuxième paramètre que vous passez ( ne fait rien depuis votre Je suggérerais de ne pas utiliser la coroutine ici du tout, mais plutôt 3f code>) ChangeColor code> ne prend aucun argument. .. P>
invoquée code> et AnnulerInvoke CODE> P> void Changecolor()
{
// Either in Awake or as lazy initialization
if(!m_SpriteRenderer) m_SpriteRenderer = GetComponent<SpriteRenderer>();
int random = Random.Range(1, 4);
switch(random)
{
case 1:
m_spriteRenderer.color = Color.blue;
break;
case 2:
m_spriteRenderer.color = Color.red;
break;
case 3:
m_spriteRenderer.color = Color.green;
break;
default:
m_spriteRenderer.color = Color.yellow;
break;
}
}
private void OnMouseDown()
{
startstop = !startstop;
if (this.startstop)
{
InvokeRepeating(nameof(Changecolor), 0f, 2f);
}
else
{
CancelInvoke(nameof(Changecolor));
}
}
Vous n'avez pas vraiment décrit ce qui se passe exactement. Comment changer continuellement les couleurs changent? Et quelles couleurs voyez-vous?
Et si vous mettez des messages de débogage pour dire à partir de Coroutin, arrêt de la coroutine ... Que voyez-vous - votre code semble fonctionner.