我想从Taxi游戏对象的CarAgent组件访问HorizontalAxis变量。 当我尝试从另一个游戏对象访问它时,它工作正常,但是当我尝试在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中的HorizontalAxis变量?
编辑:我试图访问此脚本中的其他类,但它也不起作用。 我从UnityStandardAssets / Vehicules / Car获得了此脚本,因此一开始它是这样写的:
namespace UnityStandardAssets.Vehicles.Car
{
[RequireComponent(typeof (CarController))]
public class CarUserControl : MonoBehaviour
{
我是unity和c#的新手,所以它会改变某些东西。如果是的话,我该如何解决?
答案 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>
非常繁重。明智的做法是使用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()
}
}