我无法从其自己的游戏对象(unity3d)访问组件
I cannot access a component from its own gameobject (unity3d)
我想从(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# 的新手,所以它改变了什么。如果是,我该如何解决?
可能是您在游戏对象链中的位置太低或太高。
尝试
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!
我想从(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# 的新手,所以它改变了什么。如果是,我该如何解决?
可能是您在游戏对象链中的位置太低或太高。
尝试
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!