变量赋值和Unity

时间:2016-04-15 12:06:51

标签: c# unity3d monodevelop

我需要一些帮助来理解使用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组件的对象会改变其速度。你能解释一下为什么吗?

如果我的问题没有得到澄清,请通知我,我会尝试更好地表达自己。

谢谢。

2 个答案:

答案 0 :(得分:2)

Unity通过引用传递SOLUTIONTYPE ="Sole" 。如果您希望Rigidbodycopy 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;它

按值传递

intdouble等类型按值传递。您将始终获得传递的参数的新鲜且独立的副本。

我建议你先阅读msdn article