2016-11-20 2 views
-1

so bin ich ein Skript speichern und laden zu schaffen, hier ist es Inhalt:Unity sagt mir, durch eine Instanz eines Objekts zu verweisen, Visual Studio sagt mir nicht zu

using UnityEngine; 
using System.Collections; 

public class SaveLoad : MonoBehaviour { 

public Player player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>(); 

public void Save() { 

    PlayerPrefs.SetFloat ("X", transform.position.x); 
    PlayerPrefs.SetFloat ("Y", transform.position.y); 
    PlayerPrefs.SetFloat ("Z", transform.position.z); 

    PlayerPrefs.SetFloat("Health", Player.Health.CurrentVal); 
    PlayerPrefs.SetFloat ("Exp", Player.Exp.CurrentVal); 
    PlayerPrefs.SetFloat("Oxygen", Player.Oxygen.CurrentVal); 
    PlayerPrefs.SetFloat("PlayerLevel", Player.PlayerLevel.CurrentVal); 

    Debug.Log ("Saved"); 


} 

public void Load() { 
    float x = PlayerPrefs.GetFloat ("X"); 
    float y = PlayerPrefs.GetFloat ("Y"); 
    float z = PlayerPrefs.GetFloat ("Z"); 

    Player.Health.CurrentVal = PlayerPrefs.GetFloat("Health"); 
    Player.Exp.CurrentVal = PlayerPrefs.GetFloat("Exp"); 
    Player.Oxygen.CurrentVal = PlayerPrefs.GetFloat("Oxygen"); 
    Player.PlayerLevel.CurrentVal = PlayerPrefs.GetFloat("PlayerLevel"); 

    transform.position = new Vector3 (x, y, z); 

    Debug.Log ("Loaded"); 
} 
} 

Die erste Version, ohne die " Player-Player-Zeile ", gab eine NullReferenceException zurück und gab an, über eine Instanz eines Objekts in Unity zu referenzieren. Wenn ich das jetzt versuche (anstatt "Gesundheit", Player.Health.CurrentVal), verwende ich ("Health", player.Health.CurrentVal), ohne Kapital in "Player", und verweise auf die Instanz, die ich in der das gleiche Skript), Visual sagt mir "Player.Health kann nicht mit einer Instanz eines Objekts zugegriffen werden, qualifizieren Sie es stattdessen mit einem Typnamen". Wie du sehen kannst, bin ich hier irgendwie in einer Schleife. Habe ich versaut, Spieler als Instanz zu bekommen? Es ist auch ein bisschen durcheinander, weil Player sowohl der Name des Spielobjekts als auch das des Skripts ist. Spieler Skript:

[SerializeField] public Stat health; 
public static Stat Health { get; set; } 
[SerializeField] private Stat exp; 
public static Stat Exp { get; set; } 
[SerializeField] private Stat oxygen; 
public static Stat Oxygen { get; set; } 
[SerializeField] private Stat playerLevel; 
public static Stat PlayerLevel { get; set; } 
[SerializeField] private Text playerLevelText; 

Und hier ist die Stat benutzerdefinierten Variablen Klasse:

[SerializeField] private BarPrototype bar; 
[SerializeField] private float maxVal; 
[SerializeField] private float currentVal; 

public float CurrentVal 
{ 
    get 
    { 
     return currentVal; 
    } 
    set 
    { 
     this.currentVal = Mathf.Clamp (value, 0, MaxVal); 
     if(bar != null) 
      bar.Value = this.currentVal; 
    } 
} 

SerializeField nur verwendet wird, diese Werte von Inspektor zuzugreifen.

+0

Könnten Sie relevante Teile aus 'Player' Klasse veröffentlichen? –

+0

Sicher, siehe den ersten Beitrag @ botond.botos – Nech

Antwort

2

Das Problem ist, dass Sie nicht öffentliche Mitglieder wie folgt initialisieren:

public Player player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>(); 

Sie sollten in Start, Awake oder OnEnable Methode initialisiert werden. Wenn Sie es unten ändern sollte

public Player player; 
void Start(){ 
    player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>(); 
} 

arbeiten Eine andere Sache ist, warum sollte man es dann öffentlich machen? Wenn sie im Inspector zugewiesen wird, wird ihr zugewiesener Wert nach Start() ignoriert. Ich schlage vor, Sie machen es intern. oder um sicher zu sein:

public Player player; 
void Start(){ 
    if(player == null) 
     player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>(); 
} 
+0

"Jetzt, wenn ich es versuche (statt" Health ", Player.Health.CurrentVal) verwende ich (" Health ", player.Health.CurrentVal), ohne Kapital In "Player", Bezug nehmend auf die Instanz, die ich im selben Skript erstellt habe, sagt Visual sich "Player.Health kann nicht mit einer Instanz eines Objekts zugegriffen werden; qualifiziere es stattdessen mit einem Typnamen "." Unity teilt mir auch mit, dass ich "public Player player = GameObject.FindGameObjectWithTag (" Player ") setzen soll. GetComponent ();" In einer Start() Methode werde ich sehen, wohin mich das in einer Sekunde führt. – Nech

+0

Wenn ich dies versuche, erkennt Visual Studio nicht} als Schließen der Start-Methode, was es stattdessen tut, es schließt die SaveLoad-Klasse damit und vermasselt den Rest des Skripts:/ – Nech

+0

Ich bearbeitete die Antwort. Der Grund, warum Sie immer noch denselben Fehler haben, ist, dass Sie andere Fehler im Skript haben und die Einheit Ihre Änderungen nicht kompiliert hat. beide Änderungen sollten vorgenommen werden, um wirksam zu werden – Bijan

Verwandte Themen