2016-05-31 11 views
-1

`パブリッククラスシュート:MonoBehaviour {Unity3dでUnity3d c# "オブジェクト参照がオブジェクトのインスタンスに設定されていません"?

public GameObject shell; 
public Transform barrelEnd; 
public float launchForce = 200; 

void Update() { 

    if (Input.GetButtonDown("Fire1")) 
    { 
     Fire(); 
    } 
} 
void Fire() 
{ 
    Rigidbody projectile; 
    projectile = Instantiate(shell, barrelEnd.position, barrelEnd.rotation) as Rigidbody; 
    projectile.AddForce(0, 0, launchForce); 

} 
} 

、私がやりたいすべてのシェルをインスタンス化し、それを起動しています。私がプレイすると、それはシェルをインスタンス化しますが、起動しません。ただ落とします。私はなぜこのエラーが出てくるのか分かりません。明らかに、私はすでにオブジェクトのインスタンスを正しく作成していますか?どんな助けでも大歓迎です!

+0

これはエラーを出すのですか、またはシェルまたはその両方をインスタンス化していますか?もしあなたがエラーを出すなら、それは何もインスタンス化してはいけません。詳細を教えていただけますか? – sami1592

答えて

2

Rigidbodyをインスタンス化していない場合は、Rigidbodyをコンポーネントとして含むGameObjectをインスタンス化しています。

asを使用して、それがオブジェクトではないものにキャストしようとすると、キャストがnullに設定されます。キャストをGameObjectに変更してからGetComponentを使用してRigidbodyを取得しても問題ありません。

projectile = Instantiate(shell, barrelEnd.position, barrelEnd.rotation) as GameObject; 
Rigidbody rb = projectile.GetComponent<Rigidbody>(); 
rb.AddForce(0, 0, launchForce); 
+0

これは私のために、ありがとう! :) – airide101

2

このエラーはさまざまな理由で発生します。

shellbarrelEndがエディタに割り当てられていることを確認してください。それが完了した場合は、インスタンス化したObjectからgetComponentを取得する必要があります。

カメラがの場合、常にがZ軸に面していない限り、このコード行には問題があります。projectile.AddForce(0, 0, launchForce);

カメラが動き回るFPSゲームの場合は、cameraTransform.forwardを使用して、弾丸を常にカメラから前方/前方に撮影します。

public GameObject shell; 
public Transform barrelEnd; 
public float launchForce = 200; 

Transform cameraTransform; 

void Start() 
{ 
    cameraTransform = Camera.main.transform; 
} 

void Update() 
{ 

    if (Input.GetButtonDown("Fire1")) 
    { 
     Fire(); 
    } 
} 
void Fire() 
{ 
    GameObject tempObj; 
    tempObj = Instantiate(shell, barrelEnd.position, barrelEnd.rotation) as GameObject; 
    Rigidbody projectile = tempObj.GetComponent<Rigidbody>(); 

    projectile.velocity = cameraTransform.forward * launchForce; 
} 
+0

'shell'はプレーヤーの中に新しいシェルを作成するので大丈夫ですが、' barrelEnd'についての良い点はそれを見落としています。しかし、私はカメラの前方を使用することに同意しない、 'barrelEnd.forward'は論理的な選択のように思える。 –

+0

先端の先端がありがとう。これも問題でした – airide101

1
  1. あなたはshellbarrellEndの値を持っていることを確認してください。あなたはユニティエディタか、コード
  2. から開始することができます。rb.AddForce(0, 0, launchForce);を呼び出す前に、rbnullであるかどうかをチェックしてください。 nullの場合、Scottのアプローチがより理にかなっています。
関連する問題