Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我不能把一个物体统一起来?_C#_Unity3d_Unity5 - Fatal编程技术网

C# 为什么我不能把一个物体统一起来?

C# 为什么我不能把一个物体统一起来?,c#,unity3d,unity5,C#,Unity3d,Unity5,我想创建一个Vector3类型的对象来引用我的玩家的位置,这样我就可以在我的脚本中使用一个较短的名称。但是我没有做到。新对象似乎指向其他地址 我编写了如下代码: //PlayerController.cs vector3 playerPos = transform.position; Debug.Log(System.Object.ReferenceEquals(playerPos,transform.position)); 输出是 假的 这是什么原因造成的?我怎样才能正确地参考球员的位置

我想创建一个Vector3类型的对象来引用我的玩家的位置,这样我就可以在我的脚本中使用一个较短的名称。但是我没有做到。新对象似乎指向其他地址

我编写了如下代码:

//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,因为它是一个结构。