从Unity中的其他对象读取变量

时间:2018-05-17 21:58:18

标签: c# unity3d

长话短说。我需要获取许多对象的Vector3值并将它们全部放在一个数组中。对于每个游戏对象,我需要运行以下代码:

public class Pos : MonoBehaviour {

    public Vector3 pos;

    // Update is called once per frame
    void Update()
    {
        pos = transform.position;
    }
}

存储数组中所有值的代码是另一个:

public class GetPos : MonoBehaviour {

    public Vector3[] Pos = new Vector3[41];

    //get all the space objects
    GameObject Go = GameObject.Find("Go");
    GameObject Mediterranean = GameObject.Find("Mediterranean");

    private void Start()
    {
        //be able to call all the game objects
        Pos GoPos = Go.GetComponent<Pos>();
        Pos MedPos = Mediterranean.GetComponent<Pos>();

    //make pos contain all possible positions.
        Pos[0] = GoPos.pos;
        Pos[1] = MedPos.pos;
    }
}

我不知道为什么,但每当我运行代码时,数组Pos的所有值都等于0.我做错了什么以及如何解决?

P.S。有更多的对象需要值而不是我提到的(总共41个),但是一旦得到一个,它基本上就是一个复制粘贴工作。

1 个答案:

答案 0 :(得分:2)

让我们从这开始吧。避免在UpDate()中更新变量,这将导致每帧刷新一次这个变量,这意味着每秒几次。这不是非常有效。

此外,正如我从您的代码中理解的那样,您将在start()期间在GetPos中读取此变量pos一次。

由于你试图通过transform.position存储这个版本,我假设你把这个类附加到GameObject。

如果是这种情况,一组两种不同类型的游戏对象:Go和Mediterranean,你可以得到这样的信息:

GameObject.FindGameObjectWithTag("go").transform.position;

GameObject.FindGameObjectWithTag("mediterranean").transform.position;

并且您不需要将此位置存储在类的任何变量中,因为游戏对象本身会包含一个具有位置的变换元素。

您可以阅读有关标记GameObjects here

的更多信息

关于你的具体问题,你得到0值,这可能是因为你需要独立访问vector3的每个组件

Pos[0] = new Vector3(GoPos.pos.x,GoPos.pos.y,GoPos.pos.z);

我现在无法测试它,但它应该类似于

您可以阅读有关vector3 here

的更多信息