为什么我不能在Update函数中使用“ Player.transform.position.y = maxY”?

时间:2019-09-02 16:47:20

标签: c# unity3d

如果玩家想更高,我希望玩家pos等于maxY。但是代码无效,但是在if语句中我可以说出来吗?

我使用Vector 2进行了尝试,但由于“ player.transform.position.y是浮点数”而无法使用

public float maxY;

void Start
{
    Player = GameObject.FindGameObjectWithTag("MyPlayer");
}

void Update()
{
    if (Player.transform.position.y >= maxY)
    {
        StartCoroutine("DontFlySoHigh");
        Player.transform.position.y = maxY;
    }
}

我希望玩家不能超过maxY。 或者,如果你们有更好的主意做一个隐形边框,那就告诉我。

2 个答案:

答案 0 :(得分:4)

因为positionVector3,而struct是值类型,因此是按值传递。

您无法对[base].[any_struct].[component_of_struct]进行更改,因为您在[any_struct]之后得到的结构是对分配给[base]的结构的复制。两个独立的对象。除非您指定新的Vector3来替换原件,否则更改副本的组件将不会反映在原件上。


在这种情况下,请按以下步骤进行更改:

var position = Player.transform.position;
position.y = maxY;
Player.transform.position = position;

您可以使用扩展方法进一步简化此操作:

public static class Vector3Extensions {
    public static Vector3 WithY(this Vector3 vector, float y) {
        vector.y = y;
        return vector;
    }
}

然后它变成:

Player.transform.position = Player.transform.position.WithY(maxY);

答案 1 :(得分:0)

像这样得到它,谢谢;)

    void Update()
{
    if (Player.transform.position.y >= maxY)
    {
        //StartCoroutine("DontFlySoHigh");
        Player.transform.position = new Vector2(Player.transform.position.x, maxY);
    }
    if (Player.transform.position.x <= maxXleft)
    {
        Player.transform.position = new Vector2(maxXleft, Player.transform.position.y);
    }
    if (Player.transform.position.x >= maxXright)
    {
        Player.transform.position = new Vector2(maxXright, Player.transform.position.y);

    }