2017-03-04 95 views
1

我想创建一个引用我的玩家位置的Vector3类型的对象,这样我就可以在脚本中使用一个较短的名字。但是我没能做到。看来,新的对象指向其他地址。为什么我不能在Unity中引用对象?

我写了一些像这样的代码:

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

产量为

是什么原因造成这一点,我怎么可以参考我的球员的位置是否正确?

回答

5

是什么原因造成这种

下面是一个简单的解释。

transform.positionVector3

Vector3struct

Struct是一个值类型。

在Unity的文档中总是看好Unity编辑器的类型。在Unity工作时,这非常重要。

enter image description here

当你这样做:

vector3 playerPos = transform.position; 

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


我想创建一个的Vector3类型对象指的是我的球员的 位置,这样我可以用更短的

在这种情况下,你必须改变Vector3Transform

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

那么你可以做:

myPos.position = newPos; 

必须声明为Transform代替Vector3位置的原因是因为Transform是类和对象的类存储的参考。

class是一个引用类型。

enter image description here

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

所以,当你myPos.position;访问你的位置,它会给你的游戏对象的最新位置,这也是(transform.position),因为myPos变量是一个class具有的transform的参考,这也是一个class

假设myPosstruct或声明为vector3 myPos而不是Transform myPos,那么myPos变量将持有的transform.position副本值它分配的时候,绝不会回报您的游戏对象的最新位置,因为它是一个副本。

您可以在这里了解更多关于class vs struct的信息。

最后System.Object.ReferenceEquals说: “的ReferenceEquals” 而不是 “ValueEquals” 所以这是连不言自明的。您在class /引用类型上使用它,而不是structs或值类型。

+0

这是否意味着对于Unity中的Vector3结构体和变换类,“==”被“Equals”而不是默认的'ReferenceEquals'覆盖? 因为如果我们使用'playerPos == transform.position',Unity会返回'true'。 – Galandil

+0

结构不是引用类型。它的值直接访问。因此,当您比较Vector3和Vector3时,您正在比较值类型(等于),而不是它们的引用类型(ReferenceEquals)。 –

+0

@Galandil'ReferenceEquals'比较参考。 'playerPos == transform.position'比较'Vector3'的值,例如x,y和z,这些值都是'float'。 – Programmer

相关问题