我有一個帶有 RobotMovment 腳本的游戲物件,如下所示:
public class RobotMovement : MonoBehaviour {
private Transform target;
private float speed = 2f;
void Start() {
target = GameObject.FindGameObjectWithTag("Ball").transform;
}
void Update() {
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, target.position, step);
}
}
然后我將另一個腳本放置在一個名為 Ball 的空游戲物件上,如下所示:
public class Ball : MonoBehaviour {
public GameObject ballPrefab;
void Start() {
var randomPosition = new Vector3(Random.Range(GetComponent<Collider>().bounds.min.x, GetComponent<Collider>().bounds.max.x), 0.25f, Random.Range(GetComponent<Collider>().bounds.min.z, GetComponent<Collider>().bounds.max.z));
Instantiate(ballPrefab, randomPosition, Quaternion.identity);
}
}
我想要實作的是讓 RobotMovement 游戲物件朝著在游戲開始時產生的球預制件移動。現在我得到一個:nullreferenceexception object reference not set游戲開始時的錯誤。可能是在啟動時 RobotMovement 腳本無法讀取球預制件的位置?
uj5u.com熱心網友回復:
Awake() 函式在 Start() 之前執行。最好使用 Awake() 來查找和分配諸如 target 之類的參考,然后在確信所有參考都已到位后,將 Start() 用于您需要的任何初始化邏輯。
也就是說,您的空參考可能在很多地方,但最有可能的是:
- 當 RobotMovement 呼叫 Start() 時,找不到名為“Ball”的游戲物件。
- Ball 在某個時候被破壞或參考丟失,并且 RobotMovement.Update() 拋出。
- Ball 上沒有碰撞器組件,所以 Ball.Start() 拋出。
您沒有要求但很重要的一件事是 GetComponent() 是一個呼叫的昂貴方法,因此您最好只呼叫一次:
Collider collider = GetComponent<Collider>()
var randomPosition = new Vector3(Random.Range(collider.bounds.min.x, collider.bounds.max.x), 0.25f, Random.Range(collider.bounds.min.z, collider.bounds.max.z));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/316198.html
標籤:统一3d
上一篇:將document.body.style.backgroundColor分配給一個變數
下一篇:如何理解“this.transform.position=target.TransformPoint(_camOffset)”?
