C# & Unity :按值传递引用

本文关键字:按值传递 引用 Unity amp | 更新日期: 2023-09-27 18:09:17

我是C#和Unity的新手,在这里我正在调整和创建我的第一个小游戏。

问题是这样的:
我有一个小立方体,会动。我已经实现了一个在移动之前检查下一个位置的方法。该方法接收当前立方体位置和方向作为参数:

 public bool okToMove(Transform playerCurrentPosition , int directionIndex)
{
   Transform playerNextPosition = playerCurrentPosition;
   playerNextPosition.Translate(toDirection(directionIndex));
    if (playerNextPosition.position.x > 1 ||
        playerNextPosition.position.x < -1 ||
        playerNextPosition.position.y > 1 ||
        playerNextPosition.position.y < -1)
        return false;
    else
        return true;
    }

然后,我调用该方法

public void movePlayer(int directionIndex)
{
    if (  okToMove(gameObject.transform, directionIndex) )
        transform.Translate(toDirection(directionIndex));
}

问题是立方体一次移动 2 次。这是因为

transform.Translate(toDirection(directionIndex));

playerNextPosition.Translate(toDirection(directionIndex));

这是从okToMove方法调用的。Unity 或 C# 将playerNextPosition视为真正的多维数据集,而不是仅存在于方法中的某种临时副本。

那么,为什么我的gameObject.transform是作为引用而不是按值传递的呢?我怎样才能让它工作?

提前感谢,对不起我的菜鸟。

C# & Unity :按值传递引用

你正在传递对 Transform 的引用,然后在 "okToMove" 中使用翻译移动它,最好的方法是制作 Vector3 的副本,只需像这样更改你的 "okToMove"。

public bool okToMove(Transform playerCurrentPosition , int directionIndex){
    Vector3 playerNextPosition = playerCurrentPosition.position;
    playerNextPosition += toDirection(directionIndex);
    if (playerNextPosition.x > 1 ||
        playerNextPosition.x < -1 ||
        playerNextPosition..y > 1 ||
        playerNextPosition.position.y < -1)
        return false;
    else
    return true;
}

变换是附加到每个游戏对象的组件,它包含位置、旋转和缩放的值,因此您的"playerCurrentPosition"不是位置的副本,而是对变换的引用(不是副本(。

创建一个

GameObject,它是原始副本的副本,并使用其transform进行计算。(此答案最初来自 Unity 论坛(。官方文档告诉我,您可以使用Object.Instantiate来创建游戏对象的克隆。

在 C# 中,对象的引用始终作为值传递,因此简单地重新分配是行不通的。请参阅此相关问题。

C# 中的对象是通过引用传递的。 如果要复制对象,请实现具有方法Clone((的ICloneable接口。 您需要自己复制对象并从此方法返回它。