我无法从其自己的gameobject(unity3d)访问组件

时间:2018-12-29 19:27:48

标签: c# unity3d unity-components

我想从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#的新手,所以它会改变某些东西。如果是的话,我该如何解决?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可能在游戏对象链中太低或太高。

尝试

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

OR

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

答案 2 :(得分:0)

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

Unity关于Order of Execution的文档对此进行了详细说明。

此外,循环查询GetComponent<T>非常繁重。明智的做法是使用InitStart()之类的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()
    }
}