2016-11-20 60 views
-1

所以我創建一個保存和加載腳本,這是它的內容:團結告訴我通過一個對象的實例引用時,Visual Studio告訴我不要

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"); 
} 
} 

的第一個版本,沒有「公共播放器播放器「行,返回一個NullReferenceException並表示通過Unity中的一個對象實例引用。現在,當我嘗試這樣做(而不是(「健康」,Player.Health.CurrentVal)我使用(「健康」,player.Health.CurrentVal),沒有資本在「播放器」,引用我在同樣的腳本),Visual告訴我「Player.Health不能通過一個對象的實例來訪問;改爲使用類型名稱來對其進行限定」。正如你所看到的,我有點陷入循環。我是否搞砸了將玩家作爲一個實例?這也有點混亂,因爲玩家既是遊戲對象的名字,也是腳本的。 播放器腳本:

[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; 

而這裏的統計自定義變量類:

[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使用只是爲了檢查訪問這些值。

+0

你能從'Player'類發佈相關部分嗎? –

+0

當然,看到第一篇文章@ botond.botos – Nech

回答

2

問題是你無法初始化公共成員像這樣:

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

他們應該在開始,清醒或OnEnable方法來初始化。如果將其更改爲下方,則應該可以工作

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

另一件事是爲什麼要讓它公開呢?如果在檢查員中進行了分配,則在Start()後將忽略其分配的值。我建議你讓它內在。或者是安全的:

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

「現在,當我試圖做到這一點(而不是(」健康「,Player.Health.CurrentVal)我使用(」健康「,player.Health.CurrentVal),沒有資本在「玩家」中,指的是我在同一個腳本中出現的實例),Visual告訴我「Player.Health不能用對象的實例訪問;用類型名稱來代替「」。 Unity也告訴我,我應該把「public Player player = GameObject.FindGameObjectWithTag(」Player「)。GetComponent ();」在一個Start()方法中,我將會在一秒之內看到這引起了我的位置。 – Nech

+0

當我嘗試這樣做時,Visual Studio不會識別爲Start方法的關閉,它會執行什麼操作,而是關閉SaveLoad類,並將腳本的其餘部分弄錯:/ – Nech

+0

我編輯了答案。它仍然給你同樣的錯誤的原因是你有腳本中的其他錯誤,統一沒有編譯你的改變。這兩個更改應該爲了生效 – Bijan