2015-04-18 28 views
0

我的Player類的構造函數正在編譯,但它實際上並不傳遞Animal對象中任何字段的值。 Animal對象可用,因爲我可以使用Debug.Log()通過添加的Update()函數檢查它的每個值。對象是否無法在構造函數中被訪問?構造函數沒有讀取對象中的值

public class Player : MonoBehaviour { 

    public Animal myAnimal; 

    int hpMax; 
    int power; 
    int defense; 

    Player(){ 
     hpMax = myAnimal.hpMax; 
     power = myAnimal.power; 
     defense = myAnimal.defense; 
     } 
} 

這裏是進口Animal(一Sheep,實際上,從Animal繼承):

public class Sheep : Animal { 

    public Sheep(){ 
     hpMax = 100; 
     power = 10; 
     defense = 10; 
} 

超類:

public abstract class Animal : MonoBehaviour { 

    public int hpMax; 
    public int power; 
    public int defense; 
} 
+1

當玩家的構造函數被調用時,myanimal字段將爲空 – Ewan

回答

0

假設你正在設置在檢查或其他地方你myAnimal場,你不能訪問它在你的Player類的構造函數,因爲它尚未設定。嘗試這樣做,在Awake方法:

public class Player : MonoBehaviour { 

    public Animal myAnimal; 

    int hpMax; 
    int power; 
    int defense; 

    void Awake() { 

     hpMax = myAnimal.hpMax; 
     power = myAnimal.power; 
     defense = myAnimal.defense; 
    } 
} 
+0

這正是我所需要的!非常感謝! – greyspace

2

你需要創建一個動物的對象。

如果從MonoBehavior繼承您無法通過新的關鍵字,以便創建它 - 在玩家構造你需要調用:

myAnimal = gameObject.AddComponent<Sheep>(); // You must have this gameObject somewhere 

或第二的辦法 - 不從MonoBehaviour在你的動物類繼承和然後就創造該動物的新對象:

private animal myAnimal = new Sheep(); 
+0

我從進行該更改時得到以下錯誤: 您試圖使用'new'關鍵字創建MonoBehaviour。這是不允許的。 MonoBehaviours只能使用AddComponent()添加。或者,您的腳本可以繼承自ScriptableObject或根本沒有基類 – greyspace

+0

動物是否繼承了MonoBehaviour? – MajkeloDev

+0

是的。我已經包含了上面這個類的代碼。 – greyspace

0

PlayerAnimal對象將不會被初始化,因爲它不是static,因此它還不存在。無論如何,製作這個static是錯誤的。

考慮傳遞Animal對象到構造 - Player(Animal animal),甚至在播放器類Player.CreateFromAnimal(Animal animal)返回一個新Player的靜態方法。此外,從Animal中刪除公共訪問修飾符,因爲這是破壞封裝。

通常閱讀封裝和麪向對象編程。這將有助於設計課程。

+0

當我說刪除公共訪問修飾符時,我的意思是讓它成爲'public get'和'private set'。 – Andrew

相關問題