明明有正确的引用,为什么我会得到空引用异常? (统一)

Why am I getting a Null Reference Exception when there is clearly a proper reference? (Unity)

我是 Unity 新手,我有一小段代码实际上是直接从 Unity 教程中获取的。教程可以在这里找到,大约 12:46
https://www.youtube.com/watch?v=7C7WWxUxPZE

脚本已正确附加到游戏对象,并且游戏对象具有刚体组件。

该教程已有几年历史,但我在 API 中进行了查找,就这一特定代码而言,一切似乎都是相同的。

这是脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {
private Rigidbody rb;

void Start()
    {
    rb.GetComponent <Rigidbody> ();

    }


void FixedUpdate() 
    {

    float moveHorizontal = Input.GetAxis ("Horizontal");
    float moveVertical = Input.GetAxis ("Vertical");

    Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);    

    rb.AddForce (movement);
    }
}

我在两个地方得到了 NRE:

rb.GetComponent <Rigidbody> ();

rb.AddForce (movement);

您不应在 rb 对象上调用 GetComponent。您应该在 class MonoBehaviour 本身上调用 GetComponent。然后您需要获取该调用的结果并将其分配给 rb

void Start()
{
    rb = GetComponent <Rigidbody> ();
}

如果修复此问题后您仍然在 rb.AddForce (movement); 调用中获得 NRE,这意味着脚本附加到的游戏对象没有附加 Rigidbody 您需要确保您也向对象添加一个。

为了超越教程显示的内容,您可能需要做的一件事是将 RequireComponent 属性放在 MonoBehavior class 上,这样脚本会自动添加一个 Rigidbody 到游戏对象(如果尚不存在)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour {
private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();

    }


    void FixedUpdate() 
    {

        float moveHorizontal = Input.GetAxis ("Horizontal");
        float moveVertical = Input.GetAxis ("Vertical");

        Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);    

        rb.AddForce (movement);
    }
}