wake-up-neo.com

Wie kann ich in Unity Werte von einem Skript an ein anderes übergeben?

In Unity möchte ich, dass ein Objekt eine fallende Geschwindigkeitsvariable hat, auf die alle anderen Objekte zugreifen können. Aus verschiedenen Gründen kann ich die eingebaute Schwerkraft nicht für das nutzen, was ich versuche.

Wie kann ich wiederholt auf eine Variable in einem Objekt zugreifen, damit ich bei Aktualisierungen die aktualisierte Variable von einem anderen Objekt bekomme?

19
Dakeyras

Hierfür gibt es mehrere Möglichkeiten.

Wenn Sie möchten, dass die Geschwindigkeitsvariable von einer Komponente gesteuert wird, die an ein GameObject angehängt ist, MyObject

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

In anderen Klassen können Sie Folgendes tun:

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

Achten Sie darauf, dass es nur ein Objekt mit dem Namen MyObject gibt, da andernfalls Dinge durcheinander geraten.

Alternativ können Sie in jeder Klasse, die Zugriff auf SpeedController benötigt, einen Member speed definieren und im Unity-Editor eine Referenz per Drag & Drop festlegen. Sie speichern die Suche dann, aber natürlich ist dies ziemlich unpraktisch, wenn sie in vielen Klassen benötigt wird.


Eine andere Möglichkeit ist, ein Singleton zu erstellen, das die Variable speed enthält und Folgendes hat:

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

So können alle Klassen darauf zugreifen:

float currentSpeed = MyGlobalSpeedController.SharedInstance.speed

Wie Jan Dvorak in den Kommentaren feststellte:

public class SpeedController : MonoBehaviour
    public static float speed;

[Update] Danke an Jerdak. Ja Component.SendMessage sollte definitiv auf der Liste stehen:

go.SendMessage("GetFallingSpeed");

Wieder müssen Sie einen Verweis auf go haben, wie in der ersten Lösung beschrieben.

Es gibt noch mehr Lösungen für dieses Problem. Wenn Sie an Spielobjekte denken, die in allen Szenen aktiv sind, sollten Sie einen Blick auf Unity-Singleton-Manager-Klassen werfen.

24
Kay

Wenn ich Sie wäre, würde ich diese Geschwindigkeitsvariable einfach "statisch öffentlich" machen, damit Sie von überall darauf zugreifen können. Sie sollten immer "find.thingthing" -Funktionen vermeiden, sie sind ziemlich langsam. Es gibt keinen Grund für Sie, nach etwas zu suchen, das Sie genau wissen, wo es ist.

4
Furjoza

wenn es in der fixedUpdate ist - Martin j 

scheint auch in Awake gut zu funktionieren. Beide Skripts werden demselben GameObject hinzugefügt. 

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