2

現在、JavaScript から変換された次のコードを使用して、Unity3D で作成したマップにカメラをロックしようとしています。

transform.position.z = Mathf.Clamp(transform.position.z, zmin, zmax);
transform.position.x = Mathf.Clamp(transform.position.x, xmin, xmax);

しかし、Unity はコンパイル中に次のエラーを返し続けます。error CS1612: Cannot modify a value type return value of 'UnityEngine.Transform.position'. Consider storing the value in a temporary variable.

4

3 に答える 3

10

Vector3is aであるためstruct、「参照型」ではなく「値型」を意味します。そのため、プロパティTransform.positionのゲッターVector3は結果に対して「NEW」を返します。直接変更すると、'NEW'Vector3が変更され、'NOT'Transform.positionプロパティが変更されます。それは明らかですか?

Transform.position.x = 0; // this is wrong code
// is same with
Vector3 _tmp = Transform.position; // getter
_tmp.x = 0; // change 'NEW' Vector3

これは明らかにあなたが望むものではないので、コンパイラはそれが問題だと言いました。

new を宣言し、の getter でVector3初期化しTransform.position、それを変更Transform.positionし、その setter で変更する必要があります。

Vector3 _tmp = Transform.position; // getter
_tmp.x = 0; // change 'NEW' Vector3
Transform.position = _tmp; // change Transform.position with it's setter

心配しないでくださいVector3 _tmp。これは単なる値の型であり、メモリの断片化は作成されません。

于 2013-09-23T00:31:17.060 に答える
1

位置の単一の座標を変更することはできません。ベクトル全体を再割り当てする必要があります。

Vector3 newVal;
newVal.x = transform.position.x = Mathf.Clamp(transform.position.x, xmin, xmax);
...
transform.position = newVal;
于 2013-09-21T09:33:44.057 に答える
1

コンパイラ エラー CS1612 について

そのようにカメラの位置を変更しないでください。

于 2013-09-21T00:39:08.143 に答える