我想创建一个Vector3类型的对象,引用我的播放器的位置,以便我可以在我的脚本中使用更短的名称。但我没有这样做。似乎新对象指向其他地址。
我写了一些这样的代码:
//PlayerController.cs
vector3 playerPos = transform.position;
Debug.Log(System.Object.ReferenceEquals(playerPos,transform.position));
输出
假
是什么造成了这种情况?如何才能正确引用我的玩家的位置?
答案 0 :(得分:5)
是什么造成了这个
以下是一个简单的解释。
Struct是一种值类型。
在Unity的文档中总是很好看,看看Unity API是哪种类型。在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
是一个类,而一个类存储了该对象的引用。
类是引用类型。
Debug.Log(System.Object.ReferenceEquals(myPos, transform));
应返回true
,因为myPos
和transform
都是类,myPos
变量引用transform
变量。
因此,无论何时使用myPos.position;
访问您的位置,它都会为您提供GameObject的最新位置,也是(transform.position
),因为myPos
变量是{{1}它的引用为class
,也是transform
。
假设class
为myPos
或声明为struct
而不是vector3 myPos
,则Transform myPos
变量将保留myPos
的副本值当它被分配时,永远不会返回GameObject的最新位置,因为它是一个副本。
您可以在此处详细了解class
vs struct
。
最后transform.position
说" ReferenceEquals "不是" ValueEquals "所以这甚至是不言自明的。您可以在不在System.Object.ReferenceEquals
上的class
/引用类型或值类型上使用它。