2016-04-15 116 views
1

我需要一些幫助來理解使用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()'。 –

回答

2

團結通過引用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

0

你只是偶然得最多的編程LA的基本 「功能」 nguages。

有兩種方式圍繞傳遞變量:

通行證通過引用

在C#對象通過引用被傳遞。這意味着無論您何時將一個已經存在的對象(如Rigidbody rb)分配給一個變量(您的localRigidBody),您就是而不是創建一個新對象。相反,您的localRigidBody只是對rb的參考。如果你想創建一個獨立的副本rb,你需要「克隆」它。

按值傳遞

類型,如intdouble是按值傳遞。你將永遠得到通過新鮮和獨立副本的參數。

我建議你開始讀變的msdn article

+0

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

+1

@ Dayman75我不認爲有人真的回答了這個問題。在團結**班**通過參考傳遞。 **結構**作爲值傳遞。這是環境的絕對基礎。 – Fattie