是什么原因造成这种
下面是一个简单的解释。
transform.position
是Vector3
。
Vector3
是struct
。
Struct是一个值类型。
在Unity的文档中总是看好Unity编辑器的类型。在Unity工作时,这非常重要。
当你这样做:
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
是类和对象的类存储的参考。
class是一个引用类型。
Debug.Log(System.Object.ReferenceEquals(myPos, transform));
应该返回true
因为myPos
和transform
都是类和myPos
变量引用transform
变量。
所以,当你myPos.position;
访问你的位置,它会给你的游戏对象的最新位置,这也是(transform.position
),因为myPos
变量是一个class
具有的transform
的参考,这也是一个class
。
假设myPos
为struct
或声明为vector3 myPos
而不是Transform myPos
,那么myPos
变量将持有的transform.position
副本值它分配的时候,绝不会回报您的游戏对象的最新位置,因为它是一个副本。
您可以在这里了解更多关于class
vs struct
的信息。
最后System.Object.ReferenceEquals
说: “的ReferenceEquals” 而不是 “ValueEquals” 所以这是连不言自明的。您在class
/引用类型上使用它,而不是structs
或值类型。
这是否意味着对于Unity中的Vector3结构体和变换类,“==”被“Equals”而不是默认的'ReferenceEquals'覆盖? 因为如果我们使用'playerPos == transform.position',Unity会返回'true'。 – Galandil
结构不是引用类型。它的值直接访问。因此,当您比较Vector3和Vector3时,您正在比较值类型(等于),而不是它们的引用类型(ReferenceEquals)。 –
@Galandil'ReferenceEquals'比较参考。 'playerPos == transform.position'比较'Vector3'的值,例如x,y和z,这些值都是'float'。 – Programmer