1
votes

Variables dans d'autres scripts dans Unity

J'essaye de créer un jeu dans Unity 2d. J'ai terminé la plupart de ce que je voulais faire et je suis passé aux ennemis. Les ennemis (dragons) viennent de différents points d'écran. Pour ce faire, j'ai placé des objets de jeu de sprite là où je veux que le dragon apparaisse. J'ai fait de tous ces objets un enfant d'un autre objet appelé DragonAncores. J'ai attaché un script à DragonAncores qui dit ceci ...

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Dragons : MonoBehaviour {
    // same as GoldDragonInit
    bool GoldDragonSpawn = false;
    // same number as DragonCount in DragonTrackeer
    int LiveDragons;
    // same as Difficulty
    int DifLev;
    //get cariables from other script
    DragonAncors.cs.GetComponent.<DragonTracker>() GoldDragonInit = GoldDragonSpawn;

    System.Random RNG= new System.Random();
    void update()
    {
        RSpawn=RNG.Next(0,2)
        DragonType=RNG.Next(0,101)
        if (RSpawn = 1) ;
        {
            if (LiveDragons > DifLev) ;
            {
                if (DragonType > 99) ;
                {
                    // summon regular dragon
                }
                if (DragonType = 100) ;
                {
                    if (GoldDragonSpawn = true) ;
                    {
                        // summon gold dragon
                    }
                }
            }
        }
    }
}

Je joins ensuite un script à chaque sprite qui sera finalement invoqué dans un préfabriqué de dragon (contenant 2 collisionneurs et un animateur) biaisé de Si la logique de l'instruction dérivée des autres variables.

Voici le code que j'utilise.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DragonTracker : MonoBehaviour {
    // is gold dragon in play?
    public bool GoldDragonInit = false;
    // curently active dragons
    public int DragonCount = 0;
    // defalts to 5
    public int Difficulty = 5;
}

Cette liste d'erreurs est lancée.

 Liste des erreurs

Ceci montre ma hiérarchie dans l'unité et les points d'ancrage (le réticule Squair regarde les choses)

 Hiérarchie de l'unité et points d'ancrage

J'ai cherché d'autres fils qui traitent de ce sujet et ils essaient tous des méthodes différentes, aucune ne fonctionne.

J'utilise Unity 2018.2.18f1


0 commentaires

4 Réponses :


0
votes

Il y a beaucoup d'erreurs et certaines étapes peuvent être nécessaires, mais tout d'abord, vous devez d'abord résoudre le problème avec le code que vous essayez d'utiliser qui n'est pas pris en charge. Accédez aux paramètres du projet et modifiez la version du langage du compilateur comme il le note sur la cinquième erreur vers le bas. Cela devrait vous permettre d'utiliser les nouvelles fonctionnalités.


0 commentaires

1
votes

Ce code c # n'est pas valide:
//get cariables from other script
DragonAncors.cs.GetComponent.<DragonTracker>() GoldDragonInit = GoldDragonSpawn;

Pourquoi? Parce que ce n'est pas dans une méthode.

De plus, le commentaire est faux. Ce n'est pas obtenir une variable (faute de frappe aussi), son paramètre une variable dans un autre script!

La raison du premier ... 16 problèmes dont se plaint Visual Studio sont dus à cette ligne.

À cet endroit, vous êtes uniquement autorisé à déclarer des méthodes, des champs et des propriétés et vous essayez actuellement d'y accéder une autre classe et changez l'un de ses membres (quelque chose que vous ne pouvez faire qu'à l'intérieur d'une méthode).

De plus, vous avez .cs ce que je suppose est parce que "DragonAnchors.cs est le nom de fichier!" ce que vous n'avez pas besoin de faire. Je ne sais pas comment réécrire cette ligne (dans Start () ) car je ne suis pas sûr de ce que vous essayez de faire réellement. Autrement dit, je ne sais pas où réside réellement une instance de DragonAnchors. Vous appelez GetComponent () , qui est généralement réservé pour accéder aux composants attachés aux objets de jeu, mais comme vous avez tenté de le faire sur une référence de classe statique, je ne sais pas si vous vouliez dire pour l'appeler sur ceci ou sur autre chose.


0 commentaires

1
votes

Voici comment accéder à DragonTracker:

DragonTracker dt = GameObject.Find("DragonAncores").GetComponent<DragonTracker>()
Debug.Log(dt.DragonCount);


0 commentaires

1
votes

Il y a quelques erreurs dans votre code ici. Ce qui suit est incorrect.

[SerializeField]
private GameObject DragonAncors;
void Start()
{
    DragonAncors.GetComponent<DragonTracker>().GoldDragonInit = GoldDragonSpawn;
}

La manière correcte d'accéder à ceci, puisque vous avez dit que DragonAncors est le parent serait:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Dragons : MonoBehaviour {
    // same as GoldDragonInit
    bool GoldDragonSpawn = false;
    // same number as DragonCount in DragonTrackeer
    int LiveDragons;
    // same as Difficulty
    int DifLev;
    void Start()
    {
        // variables from other script
     GetComponentInParent<DragonTracker>().GoldDragonInit = GoldDragonSpawn;
    }
    System.Random RNG= new System.Random();
    void update()
    {
        RSpawn=RNG.Next(0,2);
        DragonType=RNG.Next(0,101);
        if (RSpawn = 1)
        {
            if (LiveDragons > DifLev)
            {
                if (DragonType > 99)
                {
                    // summon regular dragon
                }
                if (DragonType = 100)
                {
                    if (GoldDragonSpawn = true)
                    {
                        // summon gold dragon
                    }
                }
            }
        }
    }
}

Ceci définit le booléen GoldDragonInit sur la valeur de GoldDragonSpawn. Cela doit être à l'intérieur d'une fonction, car vous l'avez en dehors d'une fonction, je suppose que vous en aviez besoin au démarrage. C'est pourquoi je l'ai placé dans la fonction void Start (). Ceci est appelé au début du jeu (scène chargée).

Vous n'avez pas non plus besoin de points-virgules; après une instruction if, cependant il doit apparaître après chaque ligne de code difinitif. Le code que vous avez fourni devrait plutôt ressembler à ceci.

GetComponentInParent<DragonTracker>().GoldDragonInit = GoldDragonSpawn;

Cela fonctionne parce que DragonTracker est un script dans le parent des objets. Si ce n'était pas le cas, GetComponentInParent (). GoldDragonInit = GoldDragonSpawn; serait remplacé comme ceci:

//get cariables from other script
    DragonAncors.cs.GetComponent.<DragonTracker>() GoldDragonInit = GoldDragonSpawn;


0 commentaires