Я не могу получить доступ к компоненту из своего игрового объекта (unity3d)
Я хочу получить доступ к переменной HorizontalAxis из компонента CarAgent (игрового объекта Taxi). Он отлично работает, когда я пытаюсь получить к нему доступ из другого игрового объекта, но когда я пытаюсь получить к нему доступ в CarUserControl, который также является компонентом такси, он говорит, что CarAgent не существует.
Это скрипт другого игрового объекта, и он отлично работает:
private float HorizontalAxis;
public void Start() {
HorizontalAxis = GameObject.Find("Taxi").GetComponent<CarAgent>().HorizontalAxis;
}
// Update is called once per frame
public void Update()
{
transform.rotation = new Quaternion(0, 0, HorizontalAxis, 360);
}
и это скрипт CarUserControl:
private void Start()
{
HorizontalAxis = GameObject.Find("Taxi").GetComponent<CarAgent>().HorizontalAxis;
}
Как я могу получить доступ к переменной HorizontalAxis в CarUserControl?
РЕДАКТИРОВАТЬ: я пытался получить доступ к другим классам в этом сценарии, и он не работает ни. Я получил этот скрипт из UnityStandardAssets/ ГИБЛЕЙ / Автомобиль, поэтому в начале написано:
namespace UnityStandardAssets.Vehicles.Car
{
[RequireComponent(typeof (CarController))]
public class CarUserControl : MonoBehaviour
{
Я новичок в единстве и C# так что-то изменить. И если да, как я могу это исправить?
3 ответа
Наконец, проблема заключалась в том, что CarUserControl находился в стандартной папке ресурсов, а сценарий CarAgent отсутствовал в этой папке. По-видимому, стандартная папка ресурсов не компилируется одновременно с другими папками. Смотрите больше здесь!
Вероятно, вы слишком низко или слишком высоко в цепочке игровых объектов.
Пытаться
car = GetComponent<CarAgent>(this.parent);
ИЛИ ЖЕ
car = GetComponent<CarAgent>(this.child);
h = car.HorizontalAxis;
Это главным образом потому, что есть несоответствия между Update()
(каждый кадр) и FixedUpdate()
(каждый физический кадр). Действительно FixedUpdate
можно вызывать более одного раза за одно и то же Update()
кадр или нет вообще.
Документ Unity о порядке исполнения объясняет это подробнее.
Кроме того, запрос GetComponent<T>
в петлях довольно тяжелый. Разумнее "кешировать" ссылку в Init
метод как Start()
или же Awake()
,
private HorizontalAxis hAxis;
public void Start(){
GameObject taxi = GameObject.Find("Taxi");
if(taxi != null){
hAxis = taxi.GetComponent<CarAgent>().HorizontalAxis;
}
}
public void Update(){
if(hAxis != null)
transform.rotation = new Quaternion(0, 0, hAxis, 360);
}
public void FixedUpdate(){
if(hAxis != null){
// Do only Physics related stuff: rigidbodies, raycast
// inputs and transform operations should stay in the Update()
}
}