4
Vector3 v = new Vector3(1, 1, 1);
v.x = 5;

なぜ私はこれを行うことができないのですか?私がしなければなりませんv = new Vector3(5, v.y, v.z);

この背後にある理由は、パフォーマンスのためだと思います。しかし、なぜこれが必要なのか推測できません。


編集:

私は嘘をつきました、これは実際に機能します。Vector3私が取り組んできた は常にtransform.positionそれ自体のコピーを返すため、値を設定しても機能しません。ユニティマジックの一種。

4

4 に答える 4

5

私は嘘をつきました、これは実際に機能します。私が transform.position で作業してきた Vector3 は、常にそれ自体のコピーを返すため、値を設定しても機能しません。ユニティマジックの一種。

実は、その理由は Vector3 が構造体だからです。C# では、構造体は値の型です。したがって、それらは常に値によって返され、クラスは参照によって渡されたり返されたりする可能性があります。構造体メンバー (Rect、Vector2 など) をラップするすべてのプロパティで同じ動作になります。

これはプロパティであるため、get メソッドを呼び出すと、構造体の位置のコピー値が返されます。常にローカル参照に割り当て、変更してから再割り当てする必要があります。

Vector3 t_Pos = transform.position;
t_Pos.Normalize();
transform.position = t_Pos;
于 2014-07-22T13:00:09.117 に答える
1

Unity の Vector3 も確かに構造体です。そのため、値を 1 つだけ変更する場合でも、新しいインスタンスを作成する必要があります。質問自体への回答として、すでに述べたように、Vector3 のプロパティは読み取り専用ではありません。

ソース

于 2013-09-12T06:27:35.547 に答える
1

(免責事項: 私は Unity 開発者ではありません)

私が見るすべての例は、新しいVector3.. を初期化しました。これは、プロパティがおそらく Unity で読み取り専用であることを意味します (XNA にはありません)。

ただし、ドキュメントにはSet()メソッドが示されていVector3ます。したがって、(明らかに)これを行うことができます:

v.Set(5, v.y, v.z);
于 2013-09-11T05:03:55.383 に答える