Я не могу получить доступ к компоненту из своего игрового объекта (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()
    }
}
Другие вопросы по тегам