变量赋值和Unity
我需要一些帮助来理解使用C#语言进行变量赋值。变量赋值和Unity
在使用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组件的对象会改变它的速度。你能解释我为什么吗?
请告诉我,如果我的问题没有澄清,我会尽力表达自己。
谢谢。
团结通过引用Rigidbody
。在原始
void someMethod(Rigidbody rb)
{
Rigidbody localRigidBody = Instantiate<Rigidbody>(rb);
localRigidBody.velocity = 10.0f;
}
否则,@RB说,你localRigidBody
:如果你想有一个copy
或Rigidbody
clone
是完全独立的传递给你的方法的原始对象(rb
),你可以使用Instantiate
只是原始rb变量的“别名”,因为它们都指向相同的对象(内存位置)。
看到这个SO提问/回答是 “参考”,以了解传球:Passing Objects By Reference or Value in C#
更新:
如果我创建一个简单的脚本,我声明一个变量“INT A = 10 ;”然后“int b = a”后跟“b = 8”。 “a”会改变它的价值吗?还是“b”也是别名?
原始数据类型的处理方式略有不同;-)我会建议做一些研究的原始与引用类型,微软有一些伟大的文章关于这个......你的例子:
代码:
int a = 10;
Console.WriteLine (a);
int b = a;
Console.WriteLine (b);
b = 8;
Console.WriteLine (a);
Console.WriteLine (b);
输出:
10
10
10
8
Press any key to continue...
谢谢你的时间:)如果你有时间,还有一个问题:如果我创建一个简单的脚本,我声明一个变量“int a = 10;”然后“int b = a”后跟“b = 8”。 “a”会改变它的价值吗?还是“b”也是别名?谢谢。 – Dayman75
@ Dayman75,检查我的答案,我更新了 – SushiHangover
很费力:)谢谢你的时间。 – Dayman75
你只是偶然得最多的编程LA的基本 “功能” nguages。
有两种方式围绕传递变量:
通行证通过引用
在C#对象通过引用被传递。这意味着无论您何时将一个已经存在的对象(如Rigidbody rb
)分配给一个变量(您的localRigidBody
),您就是而不是创建一个新对象。相反,您的localRigidBody
只是对rb
的参考。如果你想创建一个独立的副本rb
,你需要“克隆”它。
按值传递
类型,如int
或double
是按值传递。你将永远得到通过新鲜和独立副本的参数。
我建议你开始读变的msdn article
觉得作为一个指向内存的一部分。内存包含实例的字段和属性。如果你有2个变量,并且把'a'分配给'b',你所做的只是将指针设置为同一段内存。 因此,如果您更改了它们都指向的内存,它们将具有相同的新值。 –
@RB所以C#中的所有变量都是指针?谢谢您的回答。 – Dayman75
您的'localRigidBody'在这种情况下将是对该刚体的引用,而不是副本。除了一些缓存的东西等,这可以被看作是一些生活质量,因为,而不是做'rb.AddForce'之类的东西,否则你总是必须写一些像'GameObject.FindWithTag(“Foo”)。GetComponent() .AddForce()'。 –