从统一c#中的另一个脚本访问vector3?

时间:2015-03-15 15:20:12

标签: c# unity3d

提前感谢您提供的任何帮助或代码。我希望下面的一切都有道理。

我的问题是我想在一个完全不同的脚本中使用存储在一个脚本中的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旋转对象。

1 个答案:

答案 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);
        }
}
}