0
votes

Unity c # Sprite Changement continu de couleur

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;
    }
}


2 commentaires

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.


4 Réponses :


0
votes

Votre code est correct, sans problème, sauf que la fonction Onmousedown () 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: XXX


4 commentaires

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.



2
votes

Avez-vous un collisionneur code> sur l'objet? Un Collider code> est nécessaire pour avoir le Onmousedown Code> Événement viré.

Le code fonctionne principalement, mais est loin de la qualité.
- 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>

Voici le code avec quelques améliorations: 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");
            }
        }


0 commentaires

1
votes

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 à . Getcomponent car il est assez coûteux et ne devrait être appelé que dans Démarrer ou éveillé 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: xxx

mise à jour: vient de remarquer quelque chose que les autres manquaient, vous devriez changer le aléatoire.range (1, 4) sur aléatoire.range (1, 5) ou bien la couleur jaune n'entrera jamais en vigueur .

 A Aperçu du changement de couleur à l'aide du script ci-dessus, activez et désactivez


0 commentaires

2
votes

Notez que le deuxième paramètre que vous passez ( 3f code>) xxx pré>

ne fait rien depuis votre ChangeColor code> ne prend aucun argument. .. P>


Je suggérerais de ne pas utiliser la coroutine ici du tout, mais plutôt 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));
    }
}


0 commentaires