C# 为什么我不能把一个物体统一起来?
我想创建一个Vector3类型的对象来引用我的玩家的位置,这样我就可以在我的脚本中使用一个较短的名称。但是我没有做到。新对象似乎指向其他地址 我编写了如下代码:C# 为什么我不能把一个物体统一起来?,c#,unity3d,unity5,C#,Unity3d,Unity5,我想创建一个Vector3类型的对象来引用我的玩家的位置,这样我就可以在我的脚本中使用一个较短的名称。但是我没有做到。新对象似乎指向其他地址 我编写了如下代码: //PlayerController.cs vector3 playerPos = transform.position; Debug.Log(System.Object.ReferenceEquals(playerPos,transform.position)); 输出是 假的 这是什么原因造成的?我怎样才能正确地参考球员的位置
//PlayerController.cs
vector3 playerPos = transform.position;
Debug.Log(System.Object.ReferenceEquals(playerPos,transform.position));
输出是
假的
这是什么原因造成的?我怎样才能正确地参考球员的位置
这是什么原因
下面是一个简单的解释
是
这是一个很好的例子
Struct是一种值类型
在Unity的文档中查看Unity API的类型总是很好的。在团结一致的情况下,这真的很重要
当您这样做时:
vector3 playerPos = transform.position;
创建新结构并从transform.position获取值;被复制到playerPos变量。由于变量是值类型且已复制,因此对其执行System.Object.ReferenceEquals应返回false
我想创建一个vector3类型的对象,引用我的玩家的
位置,以便我可以使用较短的
在这种情况下,您必须将更改为
然后你可以做:
myPos.position = newPos;
您必须将位置声明为而不是,因为是一个类,而一个类存储对象的引用
类是引用类型
Debug.LogSystem.Object.ReferenceEqualsmyPos,转换;应该返回true,因为myPos和transform都是类,并且myPos变量正在引用transform变量
因此,无论何时使用myPos.position访问您的位置;,它会给你游戏对象的最新位置,也是transform.position,因为myPos变量是一个类,它引用了transform,transform也是一个类
假设myPos是struct或声明为vector3 myPos而不是Transform myPos,那么myPos变量将在赋值时保存Transform.position的副本值,并且永远不会返回游戏对象的最新位置,因为它是副本
你可以在这里了解更多
最后System.Object.ReferenceEquals说ReferenceEquals不是ValueEquals,所以这甚至是不言自明的。您可以在类/引用类型上使用它,而不是在结构或值类型上使用它
这是什么原因
下面是一个简单的解释
是
这是一个很好的例子
Struct是一种值类型
在Unity的文档中查看Unity API的类型总是很好的。在团结一致的情况下,这真的很重要
当您这样做时:
vector3 playerPos = transform.position;
创建新结构并从transform.position获取值;被复制到playerPos变量。由于变量是值类型且已复制,因此对其执行System.Object.ReferenceEquals应返回false
我想创建一个vector3类型的对象,引用我的玩家的
位置,以便我可以使用较短的
在这种情况下,您必须将更改为
然后你可以做:
myPos.position = newPos;
您必须将位置声明为而不是,因为是一个类,而一个类存储对象的引用
类是引用类型
Debug.LogSystem.Object.ReferenceEqualsmyPos,转换;应该返回true,因为myPos和transform都是类,并且myPos变量正在引用transform变量
因此,无论何时使用myPos.position访问您的位置;,它会给你游戏对象的最新位置,也是transform.position,因为myPos变量是一个类,它引用了transform,transform也是一个类
假设myPos是struct或声明为vector3 myPos而不是Transform myPos,那么myPos变量将在赋值时保存Transform.position的副本值,并且永远不会返回游戏对象的最新位置,因为它是副本
你可以在这里了解更多
最后System.Object.ReferenceEquals说ReferenceEquals不是ValueEquals,所以这甚至是不言自明的。在类/引用类型上使用它,而不是在结构或值类型上使用它。这是否意味着在Unity中的Vector3结构和transform类中,==被等于而不是默认的引用等于覆盖?因为如果我们使用playerPos==transform.position Unity,则返回true。结构不是引用类型。它的值可以直接访问。因此,当您比较Vector3和Vector3时,您是在比较值类型Equals,而不是它们的引用类型ReferenceEquals。@Galandil ReferenceEquals比较引用。playerPos==transform.position比较矢量3的值,例如x、y和z,这些值都是浮动的。对不起,我解释得不好。我的问题是:默认情况下,==使用ReferenceEquals进行引用比较。因此,当我们用==比较两个对象时,其中至少有一个是值类型,我们会重写为等于,而不是ReferenceEquals,对吗?@Galandil默认情况下,==不会真正进行引用比较。这取决于API。对于Vector3,Unity有一个of==来比较两个向量的SqrMagnitude。它不比较参考
向量3的==。另一方面,你是对的。您可以重写Equals函数,但不应该重写Vector3的ReferenceEquals,因为它是一个结构。这是否意味着在Vector3结构和Unity中的transform类的情况下,==被Equals而不是默认的ReferenceEquals重写?因为如果我们使用playerPos==transform.position Unity,则返回true。结构不是引用类型。它的值可以直接访问。因此,当您比较Vector3和Vector3时,您是在比较值类型Equals,而不是它们的引用类型ReferenceEquals。@Galandil ReferenceEquals比较引用。playerPos==transform.position比较矢量3的值,例如x、y和z,这些值都是浮动的。对不起,我解释得不好。我的问题是:默认情况下,==使用ReferenceEquals进行引用比较。因此,当我们用==比较两个对象时,其中至少有一个是值类型,我们会重写为等于,而不是ReferenceEquals,对吗?@Galandil默认情况下,==不会真正进行引用比较。这取决于API。对于Vector3,Unity有一个of==来比较两个向量的SqrMagnitude。它不会将矢量3的引用与==进行比较。另一方面,你是对的。您可以重写Equals函数,但不应重写Vector3的ReferenceEquals,因为它是一个结构。