2016-04-15 25 views
1

C#言語による変数の割り当てを理解するためには助けが必要です。変数の割り当てとユニティ

Unity用のMonodevelopを使用してスクリプトを作成している間に、ゲームオブジェクトの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")のようなものを書く必要があるので、これはいくつかのキャッシングなどを除いて、いくつかのクオリティオブライフとして見ることができます。 .AddForce() ' –

答えて

2

結束は、Rigidbodyを参照しています。あなたのメソッドに渡された元のオブジェクトの完全に独立しているRigidbodycopyまたはclonerb)をしたい場合は、Instantiate使用することができます。@RBが述べたように、そうでなければ、あなたの元に

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

を、あなたのlocalRigidBodyそれらは両方とも同じオブジェクト(メモリの場所)を指しているため、元のrb変数への単なる「エイリアス」です。

このSO質問/答えは、 "参照" によって何通過を理解するために参照してくださいです:Passing Objects By Reference or Value in C#

更新:

私は、私は、変数を宣言する簡単なスクリプトを作成する場合は「int型のA = 10 ; " 「int b = a」の後に「b = 8」が続きます。 "a"はその価値を変えるでしょうか?または "b"は別名ですか?

コード:

プリミティブデータ型は少し異なる処理され が;-)私は参照型対プリミティブにいくつかの研究を行うアドバイスうが、Microsoftが...これについてのあなたの例をいくつかの素晴らしい記事が掲載されています

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

ありがとうございました:)時間があればもう1つの質問:単純なスクリプトを作成して、 "int a = 10;"という変数を宣言するとどうなりますか? 「int b = a」の後に「b = 8」が続きます。 "a"はその価値を変えるでしょうか?または "b"は別名ですか?ありがとうございました。 – Dayman75

+0

@ Dayman75、私の答えをチェックしてください、私はそれを更新しました – SushiHangover

+1

かなりの努力:)お時間をありがとう。 – Dayman75

0

nguages。

周りに変数を渡す2つの方法がありますC#のオブジェクトで参照

によって

パスが参照によって渡されます。これは、既存のオブジェクト(など)を変数(localRigidBody)に割り当てると、ではなく、という新しいオブジェクトを作成することを意味します。代わりにlocalRigidBodyrbへの参照に過ぎません。 rbの独立したコピーを作成したい場合、それを "複製"する必要があります。 intまたはdoubleなどの

タイプが値で渡された値によって

パス。渡されたパラメータの新鮮で独立したコピーが常に得られます。

私はあなたがメモリの部分へのポインタとして変数のmsdn article

+0

入手しました。あなたの答えは素晴らしい仕事でした。ありがとうございました:) – Dayman75

+1

@ Dayman75私は誰も実際に質問に答えたとは思わない。 **クラス**は参照渡しです。 **構造体**は値として渡されます。これは環境の絶対的な基本です。 – Fattie