web-dev-qa-db-fra.com

Dans Unity, comment puis-je transmettre des valeurs d'un script à un autre?

Dans Unity, je souhaite qu'un objet ait une variable de vitesse de chute à laquelle tous les autres objets peuvent accéder. Pour diverses raisons, je ne peux pas utiliser la gravité intégrée pour ce que j'essaie de faire.

Comment puis-je accéder à une variable dans un objet à plusieurs reprises, de sorte que quand il met à jour je reçois la variable mise à jour, à partir d'un autre objet?

19
Dakeyras

Il y a plusieurs façons d'y parvenir.

Si vous voulez que la variable de vitesse soit contrôlée par un composant attaché à un GameObject MyObject

public class SpeedController : MonoBehaviour
    public float speed;
    // maybe you want restrict this to have read access, then you should use a property instead

Dans d'autres classes, vous pouvez faire:

GameObject go = GameObject.Find ("MyObject");
SpeedController speedController = go.GetComponent <SpeedController> ();
float courrentSpeed = speedController.speed;

Veillez à ce qu'il n'y ait qu'un seul objet nommé MyObject, sinon les choses seraient gâchées.

Vous pouvez également définir un membre SpeedController dans chaque classe ayant besoin d'accéder à speed et définir une référence par glisser-déposer dans l'éditeur Unity. Vous sauvegardez alors la recherche, mais bien sûr, cela est assez gênant si nécessaire dans de nombreuses classes.


Une autre méthode consiste à créer un singleton qui contient la variable speed et qui possède:

public class MyGlobalSpeedController {
    private static MyGlobalSpeedController instance = null;
    public static MyGlobalSpeedController SharedInstance {
        get {
            if (instance == null) {
                instance = new MyGlobalSpeedController ();
            }
            return instance;
        }
    }
    public float speed;
}   

Donc, toutes les classes peuvent accéder à ceci:

float currentSpeed = MyGlobalSpeedController.SharedInstance.speed

Comme Jan Dvorak l'a déclaré dans la section commentaires:

public class SpeedController : MonoBehaviour
    public static float speed;

[Mise à jour] Merci à Jerdak. Oui Component.SendMessage devrait être définitivement sur la liste:

go.SendMessage("GetFallingSpeed");

Encore une fois, vous devez avoir une référence à go comme décrit dans la première solution.

Il y a encore plus de solutions à ce problème. Si vous pensez à des objets de jeu actifs dans toutes les scènes, vous devriez jeter un oeil sur Unity singleton manager classes

24
Kay

Si j'étais vous, je rendrais simplement cette variable de vitesse «statique publique» afin que vous puissiez y accéder depuis n'importe où. Vous devriez toujours éviter les fonctions "find.anything", etc., elles sont assez lentes. Il n'y a aucune raison pour que vous cherchiez quelque chose que vous savez exactement où il se trouve.

4
Furjoza

si c'est dans le fixedUpdate - Martin j 

semble que cela fonctionne bien dans Awake aussi. Les deux scripts sont ajoutés au même GameObject. 

public class FirstScript : MonoBehaviour {
    protected internal GameObject myobject;
private void Awake() {
       myobject = (GameObject)Instantiate(Resources.Load("nameofprefab"));
       myobject.transform.parent = gameObject.transform;
...
public class SecondScript : MonoBehaviour {
    private GameObject myobject;
private void Awake() {
       myobject = gameObject.GetComponent<FirstScript>().myobject;
       myobject.SetActive(false); //for example
...       
1
NBAH79
other.GetComponent<class name>().object name;
0
Martin j