Я не могу получить доступ к компоненту из своего игрового объекта (unity3d) - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу получить доступ к переменной HorizontalAxis из компонента CarAgent (объекта Games 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?

РЕДАКТИРОВАТЬ: Iпопытался получить доступ к другим классам в этом скрипте, и он не работает ни.Я получил этот скрипт от UnityStandardAssets / GTules / Car, поэтому в начале написано:

namespace UnityStandardAssets.Vehicles.Car
{
[RequireComponent(typeof (CarController))]
public class CarUserControl : MonoBehaviour
{

Я новичок в Unity и C #, поэтому он что-то меняет.И если да, как я могу это исправить?

Ответы [ 3 ]

0 голосов
/ 30 декабря 2018

Это в основном из-за несоответствий между 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()
    }
}
0 голосов
/ 04 января 2019

Наконец, проблема заключалась в том, что CarUserControl находился в стандартной папке ресурсов, а сценарий CarAgent отсутствовал в этой папке.По-видимому, стандартная папка ресурсов не компилируется одновременно с другими папками.Подробнее здесь !

0 голосов
/ 29 декабря 2018

Вероятно, вы слишком низко или слишком высоко в цепочке игровых объектов.

Попробуйте

car = GetComponent<CarAgent>(this.parent);

ИЛИ

car = GetComponent<CarAgent>(this.child);
h = car.HorizontalAxis;
...