提前感谢您提供的任何帮助或代码。我希望下面的一切都有道理。
我的问题是我想在一个完全不同的脚本中使用存储在一个脚本中的vector3 thumbStickInput
,而不必在更新时使用getComponent
(这正是我目前正在做的)。它应该在start ()
我想?我目前的剧本肯定是错的,有点浪费!
这是代码,它可以工作,但不是很好/
using UnityEngine;
using System.Collections;
public class Movement : MonoBehaviour {
public Vector3 thumbStickInput;
public PlayerInput gcPlayerInput;
Vector3 targetRotation;
public GameObject TankTurret, TankBase, Player;
// Use this for initialization
void Start () {
var gcPlayerInput = Player.GetComponent<PlayerInput>();
// --- Why won't this be registered to work on update? ---
}
// Update is called once per frame
void Update () {
var gcPlayerInput = Player.GetComponent<PlayerInput>(); // <-- BAD!
thumbStickInput = gcPlayerInput.thumbStickInput; <-- BAD.
if (thumbStickInput != Vector3.zero) {
targetRotation = thumbStickInput;
TankTurret.transform.rotation = Quaternion.LookRotation(targetRotation);
print (thumbStickInput);
}
}
}
进一步分解它可能会引起任何混乱。我将一个名为thumbStickInput
的Vector3中的玩家1的拇指杆轴存储在名为PlayerInput
的脚本中,该脚本位于名为Player
的游戏对象上。
在名为movement
的层次结构中较低的游戏对象上的另一个名为playerTank
的脚本中,我尝试使用前面提到的thumbStickInput
旋转对象。
答案 0 :(得分:1)
您的脚本已包含用于缓存组件的成员gcPlayerInput,您未使用该成员。正如你所说的,在Update上获取组件是一种不好的做法,所以常见的方法是在Start上缓存组件然后再使用它。
您不应该使用var关键字为对象的成员分配值,因为这意味着您要声明具有相同名称的局部变量。我想团结应警告你这个
using UnityEngine;
using System.Collections;
public class Movement : MonoBehaviour {
public Vector3 thumbStickInput;
public PlayerInput gcPlayerInput;
Vector3 targetRotation;
public GameObject TankTurret, TankBase, Player;
// Use this for initialization
void Start () {
gcPlayerInput = Player.GetComponent<PlayerInput>(); // removed var
// now it's cached and you can use it on update
}
// Update is called once per frame
void Update () {
// var gcPlayerInput = Player.GetComponent<PlayerInput>(); // <-- BAD! ---- removed
thumbStickInput = gcPlayerInput.thumbStickInput; <-- BAD.
if (thumbStickInput != Vector3.zero) {
targetRotation = thumbStickInput;
TankTurret.transform.rotation = Quaternion.LookRotation(targetRotation);
print (thumbStickInput);
}
}
}