变量赋值和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组件的对象会改变它的速度。你能解释我为什么吗?

请告诉我,如果我的问题没有澄清,我会尽力表达自己。

谢谢。

+0

觉得作为一个指向内存的一部分。内存包含实例的字段和属性。如果你有2个变量,并且把'a'分配给'b',你所做的只是将指针设置为同一段内存。 因此,如果您更改了它们都指向的内存,它们将具有相同的新值。 –

+0

@RB所以C#中的所有变量都是指针?谢谢您的回答。 – Dayman75

+0

您的'localRigidBody'在这种情况下将是对该刚体的引用,而不是副本。除了一些缓存的东西等,这可以被看作是一些生活质量,因为,而不是做'rb.AddForce'之类的东西,否则你总是必须写一些像'GameObject.FindWithTag(“Foo”)。GetComponent () .AddForce()'。 –

团结通过引用Rigidbody。在原始

void someMethod(Rigidbody rb) 
{ 
    Rigidbody localRigidBody = Instantiate<Rigidbody>(rb); 
    localRigidBody.velocity = 10.0f; 
} 

否则,@RB说,你localRigidBody:如果你想有一个copyRigidbodyclone是完全独立的传递给你的方法的原始对象(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... 
+0

谢谢你的时间:)如果你有时间,还有一个问题:如果我创建一个简单的脚本,我声明一个变量“int a = 10;”然后“int b = a”后跟“b = 8”。 “a”会改变它的价值吗?还是“b”也是别名?谢谢。 – Dayman75

+0

@ Dayman75,检查我的答案,我更新了 – SushiHangover

+1

很费力:)谢谢你的时间。 – Dayman75

你只是偶然得最多的编程LA的基本 “功能” nguages。

有两种方式围绕传递变量:

通行证通过引用

在C#对象通过引用被传递。这意味着无论您何时将一个已经存在的对象(如Rigidbody rb)分配给一个变量(您的localRigidBody),您就是而不是创建一个新对象。相反,您的localRigidBody只是对rb的参考。如果你想创建一个独立的副本rb,你需要“克隆”它。

按值传递

类型,如intdouble是按值传递。你将永远得到通过新鲜和独立副本的参数。

我建议你开始读变的msdn article

+0

明白了。你的答案做了一个了不起的工作。谢谢:) – Dayman75

+1

@ Dayman75我不认为有人真的回答了这个问题。在团结**班**通过参考传递。 **结构**作为值传递。这是环境的绝对基础。 – Fattie