-2
votes

Comment changer de booléen depuis un autre script c #

J'ai 2 scripts, plumermanics et ennemybehavior. Mon ennemiBehavior a un booléen que lorsque le booléen est vrai, il s'éloigne du joueur. Au lieu de cela, j'obtiens l'erreur: "Référence d'objet non définie sur une instance d'un objet".

Je suis sûr que cela signifie que le script ne peut pas trouver le composant mais je ne peux pas bien comprendre ce qui ne va pas.

public class playerMechanics : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {

    }

    void OnCollisionEnter(Collision collision)
    {

        enemyBehavior evade = gameObject.GetComponent<enemyBehavior>();
        if (collision.gameObject.name == "coin")
        {
            Destroy(collision.gameObject);
            enemyBehavior script = GetComponent<enemyBehavior>();
            script.evade = script.evade == true;
        }
    }
}


7 commentaires

script.evade = script.vade == true; ne fait rien. Essayez-vous d'inverser la valeur? Si tel est le cas, changez true à false ou simplement faire: script.evade =! Script.vade;


Mon problème principal est l'erreur: «Référence d'objet non définie sur une instance d'objet». Je ne peux même rien faire quand c'est là ...


@Rufusl c'est script.evade = script.vade == faux;


Donc, cela signifie que script est null . De La documentation : "renvoie le composant du type de type si le type de type L'objet de jeu a une pièce jointe, NULL si ce n'est pas le cas. ". En outre, il semble que cette ligne ne soit pas nécessaire: ennemybehavior Evade = gameObject.getComponent ();


@Rufusl Oui, cette ligne n'était pas nécessaire. Je l'ai supprimé mais je ne comprends toujours pas ce que je dois faire pour réparer l'évasion. Je l'ai changé à: script.evade =! Script.vade; Mais je reçois toujours l'erreur


Testez pour NULL en premier? si (script! = null) {script.vade =! script.vade; }


@Rufusl peut confirmer qu'il s'agissait d'une null, oui


3 Réponses :


0
votes

appeler GeComponent Par lui-même recherchera le composant attaché à l'objet parent du script, qui est le joueur dans ce cas, je pense. Donc, cela retournera toujours null.

Ajouter xxx

à la classe de playermechanics puis entrez dans le concepteur et faites glisser l'objet de jeu qui a le script d'ennemiBehavior attaché. La méthode Oncollisionenter présente plusieurs problèmes. Quelque chose comme ça xxx

devrait vous faire aller dans la bonne direction.


0 commentaires

0
votes

est le comportement ennemi sur l'objet joueur? Voir ici

enemyBehaviour.instance.evade = false;


0 commentaires

0
votes

Si j'ai raison, je pense que votre mécanique de jeu fonctionne comme ceci: l'objectif du joueur est de collecter des pièces de monnaie. Quand ils en recueillent un, l'ennemi près d'elle viendra et échappera au joueur.

Si tel est le cas, vous devez utiliser ceci: xxx

dans votre code, vous avez écrit "collision.gameObject". Ceci fait référence à l'objet que le script est attaché à. Si vous souhaitez faire référence à l'objet que nous appuyons, utilisez «Collision.Collider».

'[Serializefield]' est une unité Attribut , utilisé pour créer un champ apparaître dans l'inspecteur sans le rendre public.

Juste une tête haute, si vous utilisez 2D, assurez-vous que la méthode est signaturé 'Oncollisionenter2D (collision2d collision)'.

J'espère avoir répondu à votre question. :)


0 commentaires