2016-07-17 27 views
0

私は世界にさまざまなブロック(プレハブ)を配置する機能を追加しようとしています。エラーが続くだけで、苦労しています。インベントリのコードは次のとおりです。Unity 3D Sandboxゲームの問題

public bool displayInventory; 

public Behaviour PlayerController; 

public int currentPrefabId; 

public GameObject playerInv; 

public Transform playerTransform; 

public Vector3 playerPosition; 

void Start() { 
    displayInventory = false; 
    playerPosition = playerTransform.position; 
} 

void FixedUpdate() { 

    playerPosition = playerTransform.position; 

    if (Input.GetButtonDown("Open Inventory")) 
    { 
     displayInventory = true; 

    } 

    if (Input.GetButtonDown("Cancel")) 
    { 
     displayInventory = false; 
    } 

    if (displayInventory == true) 
    { 
     showInventory(playerInv); 
     Cursor.lockState = CursorLockMode.None; 
     Cursor.visible = true; 
    } 

    if (displayInventory == false) 
    { 
     closeInventory(playerInv); 
     Cursor.lockState = CursorLockMode.Locked; 
     Cursor.visible = false; 
    } 

    if (Input.GetButton("Fire1")) 
    { 
     Sign.placePrefabSign(); 
    } 

    if (Input.GetButton("Fire2")) 
    { 
     Wood.placePrefabWood(); 
    } 
} 

public static void showInventory(GameObject playerInv) 
{ 
    playerInv.SetActive(true); 
} 

public static void closeInventory(GameObject playerInv) 
{ 
    playerInv.SetActive(false); 
} 

public static void PlacePrefab(int currentPrefabId, GameObject[] Prefabs, Vector3 playerPosition) 
{ 
    Instantiate(Prefabs[currentPrefabId], playerPosition, new Quaternion(0, 0, 0, 0)); 
} 

誰でもこの手伝いできますか? (部品はまだ私が試した古いシステムです)。

私はこれらのエラーを取得しています:

enter image description here

私はそれがここにあるソースコードをアップロードしました:

Source Code Download

+3

あなたはどんなエラーが出ていますか? – SurvivalMachine

+0

この投稿を編集してあなたのエラーを編集してください。 – VSG24

+0

@TimeHopper明らかに、NullReferenceExceptionを引き起こすnullオブジェクトにアクセスして使用しようとしています。そのオブジェクトを検出するために行ごとにデバッグします。 – VSG24

答えて

2

をUPDATE:

今私が理解あなたがしたいこと。押されたボタン上でプレハブをインスタンス化するためにWood.csスクリプトは必要ありません。あなたは、あなたがそれを必要としないwood.csスクリプトを削除することができます

using UnityEngine; 

public class inventory : MonoBehaviour { 

    public bool displayInventory; 

    public Behaviour PlayerController; 

    public int currentPrefabId; 

    public GameObject playerInv; 

    public Transform playerTransform; 

    public Vector3 playerPosition; 

    public GameObject m_oPlayer // <- NEW! : Must be linked in the editor with the player (RigidBodyFPSController); 

    public GameObject m_oWoodPrefab; // <- NEW! :Must be linked in the editor with the prefab 

    void Start() { 
     displayInventory = false; 
     playerPosition = playerTransform.position; 
    } 

    void FixedUpdate() { 

     playerPosition = playerTransform.position; 

     if (Input.GetButtonDown("Open Inventory")) 
     { 
      displayInventory = true; 

     } 

     if (Input.GetButtonDown("Cancel")) 
     { 
      displayInventory = false; 
     } 

     if (displayInventory == true) 
     { 
      showInventory(playerInv); 
      Cursor.lockState = CursorLockMode.None; 
      Cursor.visible = true; 
     } 

     if (displayInventory == false) 
     { 
      closeInventory(playerInv); 
      Cursor.lockState = CursorLockMode.Locked; 
      Cursor.visible = false; 
     } 

     if (Input.GetButton("Fire1")) 
     { 
      Sign.placePrefabSign(); 
     } 

     if (Input.GetButtonDown("Fire2")) // <- CHANGED 
     { 
      Instantiate(m_oWoodPrefab, playerPosition, m_oPlayer.transform.rotation); 
     } 
    } 

    public static void showInventory(GameObject playerInv) 
    { 
     playerInv.SetActive(true); 
    } 

    public static void closeInventory(GameObject playerInv) 
    { 
     playerInv.SetActive(false); 
    } 

    public static void PlacePrefab(int currentPrefabId, GameObject[] Prefabs, Vector3 playerPosition) 
    { 
     Instantiate(Prefabs[currentPrefabId], playerPosition, new Quaternion(0, 0, 0, 0)); 
    } 

} 

:だから同じようinventory.csのコードを変更。 MonoBehaviorオブジェクトや静的関数を作成するには、 "new"キーワードを使用しないでください。 [OK]を、私はソースコードをチェックし

:...

オリジナル回答を私はまた、符号関数を変更していないが、あなたはする必要があります。

あなたは、関連するゲームオブジェクトの「初期化」としてスクリプトクラスのコンストラクタを使用しています。これは正しい方法ではありません。

エラーはコンストラクタ時にゲームオブジェクトの参照が利用できなかったために発生します。 nullが返され、Instantiate関数がクラッシュしました。

ザ・は例

void Start() 

のためスタートがスクリプトはどの Updateメソッドのが初めてと呼ばれる直前に有効になっているときのフレームで呼び出され、Unity3Dが提供する標準機能です。

Awake関数と同様に、Startはスクリプトの有効期間である で一度だけ呼び出されます。ただし、Awakeは、スクリプトオブジェクトが有効になっているかどうかにかかわらず、 が初期化されたときに呼び出されます。初期化時に が有効になっていない場合、開始 は、Awakeと同じフレームで呼び出されないことがあります。

http://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html

また、あなたのコードと他のいくつかの問題がある...私はあなたが団結チュートリアルのいくつかを見ることをお勧めします。

これは木のコードです。csスクリプトが動作します(私はそれを試しました):

using UnityEngine; 
using System.Collections; 

public class Wood : MonoBehaviour { 

    public GameObject prefab; 

    public Transform playerTransfom; 

    public Quaternion rotation; 

    void Start() { 
     Instantiate(prefab, playerTransfom.position, rotation); 
    } 

} 
+0

私はあなたが 'new Wood()'を呼ぶべきではないと確信しています。 –

+0

@Scott Chamberlainそれでは、私は何を呼ぶべきですか? –

+0

@Simon Pessottoそのコードが動作することを意味しますか?だから私はそれを使用する必要がありますので、ありがとう!また、すでにチュートリアルを探していましたが、3Dサンドボックスゲームを作成するために利用できるものはありません! –