我需要一些帮助来理解使用C#语言的变量赋值。
使用Monodevelop for Unity编写脚本时,我将游戏对象的RigidBody和Collider组件(以及其他组件)分配给局部变量。当我通过调用方法或更改其属性来更改这些变量时,这些更改将反映在原始组件中。为了使我的观点更清楚,我将在下面留下这个伪代码:
void someMethod(Rigidbody rb)
{
Rigidbody localRigidBody;
localRigidBody = rb; //assigned external rb component to local rigidBody
localRigidBody.velocity = 10.0f; //changes are reflected in the original rb object!
}
让我感到困惑的是游戏对象的变化,其中包含"包含" rb Rigibody组件。虽然我知道这是有效的,但是它不应该工作,因为localRigidBody是一个局部变量,并且改变localRigidBody的速度不应该改变rb的速度值。然而它会改变,并且它可以工作,因为当我运行程序时,rb组件的对象会改变其速度。你能解释一下为什么吗?
如果我的问题没有得到澄清,请通知我,我会尝试更好地表达自己。
谢谢。
答案 0 :(得分:2)
Unity通过引用传递SOLUTIONTYPE ="Sole"
。如果您希望Rigidbody
或copy
clone
完全独立于传递给您方法的原始对象(Rigidbody
),则可以使用rb
:
Instantiate
否则在您的原文中,正如@RB所述,您的void someMethod(Rigidbody rb)
{
Rigidbody localRigidBody = Instantiate<Rigidbody>(rb);
localRigidBody.velocity = 10.0f;
}
只是原始rb变量的“别名”,因为它们都指向同一个对象(内存位置)。
请参阅此SO问题/答案,了解通过“参考”传递的是:Passing Objects By Reference or Value in C#
更新
如果我创建一个简单的脚本,我声明一个变量“int a = 10;”然后“int b = a”后跟“b = 8”。 “a”会改变它的价值吗?或者“b”也是别名?
原始数据类型的处理方式略有不同;-)我建议对原始类型和引用类型进行一些研究,微软有一些关于这个的好文章......你的例子:
代码:
localRigidBody
输出:
int a = 10;
Console.WriteLine (a);
int b = a;
Console.WriteLine (b);
b = 8;
Console.WriteLine (a);
Console.WriteLine (b);
答案 1 :(得分:0)
你刚刚发现了一个基本的&#34;功能&#34;大多数编程语言。
传递变量的方法有两种:
通过引用传递
在C#中,对象通过引用传递。这意味着,无论何时将现有对象(例如Rigidbody rb
)分配给变量(localRigidBody
),您都 创建新对象。相反,您的localRigidBody
只是对rb
的引用。如果你想创建rb
的独立副本,你需要克隆&#34;它
按值传递
int
或double
等类型按值传递。您将始终获得传递的参数的新鲜且独立的副本。
我建议你先阅读msdn article