为什么我不能在Unity中引用对象?

时间:2017-03-04 18:37:56

标签: c# unity3d unity5

我想创建一个Vector3类型的对象,引用我的播放器的位置,以便我可以在我的脚本中使用更短的名称。但我没有这样做。似乎新对象指向其他地址。

我写了一些这样的代码:

//PlayerController.cs
vector3 playerPos = transform.position;
Debug.Log(System.Object.ReferenceEquals(playerPos,transform.position)); 

输出

  

是什么造成了这种情况?如何才能正确引用我的玩家的位置?

1 个答案:

答案 0 :(得分:5)

  

是什么造成了这个

以下是一个简单的解释。

transform.positionVector3

Vector3struct

Struct是一种值类型。

在Unity的文档中总是很好看,看看Unity API是哪种类型。在Unity中工作时这非常重要。

enter image description here

当你这样做时:

vector3 playerPos = transform.position;

创建新的struct,并将transform.position;的值复制到playerPos变量。由于变量是值类型并已复制,因此对其执行System.Object.ReferenceEquals应返回false

  

我想创建一个引用我的播放器的vector3类型的对象   位置,以便我可以使用更短的

在这种情况下,您必须将Vector3更改为Transform

Transform myPos = null;
void Start()
{
    myPos = transform;
}

然后你可以这样做:

myPos.position = newPos; 

您必须将位置声明为Transform而不是Vector3的原因是因为Transform是一个类,而一个类存储了该对象的引用。

类是引用类型。

enter image description here

Debug.Log(System.Object.ReferenceEquals(myPos, transform));应返回true,因为myPostransform都是类,myPos变量引用transform变量。

因此,无论何时使用myPos.position;访问您的位置,它都会为您提供GameObject的最新位置,也是(transform.position),因为myPos变量是{{1}它的引用为class,也是transform

假设classmyPos或声明为struct而不是vector3 myPos,则Transform myPos变量将保留myPos的副本值当它被分配时,永远不会返回GameObject的最新位置,因为它是一个副本。

您可以在此处详细了解class vs struct

最后transform.position说" ReferenceEquals "不是" ValueEquals "所以这甚至是不言自明的。您可以在不在System.Object.ReferenceEquals上的class /引用类型或值类型上使用它。