2016-05-31 97 views
-1

'公共類拍攝:MonoBehaviour {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); 

} 
} 

在Unity3d,所有我想做的事就是實例化一個殼,並啓動它。當我玩,它會實例化外殼,但它不啓動它,它只是下降。我不明白爲什麼我不斷收到此錯誤。很明顯,我已經創建了一個正確的對象的實例?任何幫助深表感謝!

+0

它會給出錯誤還是實例化shell或兩者?如果如果給你的錯誤,那麼它不應該實例化任何東西。你能給我們更多的細節嗎? – sami1592

回答

2

你的問題是你沒有實例化一個Rigidbody,你正在實例化一個GameObject,其中包含一個Rigidbody作爲一個組件。

當您使用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中獲取組件。

除非您的相機是總是面向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'是可以的,因爲它確實在播放器內創建了一個新的shell,但'barrelEnd'的好處忽略了這個。然而,我不同意使用相機的前進,'barrelEnd.forward'似乎更像是合乎邏輯的選擇。 –

+0

感謝您提供正面的提示。這也是一個問題 – airide101

1
  1. 請確保您有值shellbarrellEnd。您可以在統一編輯器或代碼
  2. 的啓動功能中調用rb.AddForce(0, 0, launchForce);來檢查rb是否爲null。如果爲空,斯科特的方法會更有意義。
相關問題