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.
Könnten Sie relevante Teile aus 'Player' Klasse veröffentlichen? –
Sicher, siehe den ersten Beitrag @ botond.botos – Nech