繁体   English   中英

C#和Unity:按值传递引用?

[英]C# & Unity : Pass reference by value?

我是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被作为引用而不是按值传递? 我该如何运作?

在此先感谢您,感谢您的配合。

您要传递对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;
}

变换是附着在每个gameObject上的组件,它保存位置,旋转和比例的值,因此您的“ playerCurrentPosition”不是位置的副本,而是对Transform的引用(不是副本)。

创建一个新的GameObject ,作为您原始副本的副本,并使用其transform进行计算。 (此答案最初来自Unity论坛 )。 官方文档告诉我可以使用Object.Instantiate创建Object.Instantiate的副本。

在C#中,对象始终将其引用作为值传递,因此简单地重新分配就不会这样做。 请参阅此相关问题

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM