我无法从其自己的游戏对象(unity3d)访问组件

I cannot access a component from its own gameobject (unity3d)

我想从(Taxi 游戏对象的)CarAgent 组件访问 Horizo​​ntalAxis 变量。 当我尝试从另一个游戏对象访问它时它工作正常,但是当我尝试在 CarUserControl 中访问它时,它也是一个 Taxi 组件,它说 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;
}

如何访问 CarUserControl 中的 Horizo​​ntalAxis 变量?

编辑:我试图访问此脚本中的其他 类 但它也不起作用。 我从UnityStandardAssets/Vehicules/Car那里得到这个脚本,所以在开头,它是这样写的:

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

我是 unity 和 c# 的新手,所以它改变了什么。如果是,我该如何解决?

可能是您在游戏对象链中的位置太低或太高。

尝试

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

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

主要是因为Update()(每帧)和FixedUpdate()(每物理帧)不一致。事实上,对于同一个 Update() 帧,FixedUpdate 可以被多次调用,或者根本不被调用。

Unity 关于 Order of Execution 的文档对其进行了更多解释。

此外,在循环中查询 GetComponent<T> 非常繁重。 "cache" 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()
    }
}

最后,问题是 CarUserControl 位于标准资产文件夹中,而 CarAgent 脚本不在该文件夹中。显然,标准资产文件夹不会与其他文件夹同时编译。查看更多 here!