Unityで transform.localPosition.x = 1.0f; ができないわけ
C#初心者の私がUnityで最初戸惑ったのはtransform.localPosition.x = 1.0f;というようなことができないことです。
これをやろうとすると、
error CS1612: Cannot modify a value type return value of `UnityEngine.Transform.localPosition'. Consider storing the value in a temporary variable
というエラーが出ます。UnityEngine.Transform.localPositionは変更できないよって言われてます。
なんで、こんなことになるかというと、localPositionが値型で、なおかつプロパティだからです。
Transformの定義を見ると、
public Vector3 localPosition { get; set; }
というようになっています。
これが、プロパティでなく、
public Vector3 localPosition;
という形であれば、localPosition.x = 1.0fは可能です。
また、Vector3が参照型(class)であった場合も、transform.localPosition.x = 1.0f;という風に書くことができます。
localPositionは値型を返すプロパティなので、メモリ上に一時的にできた一時変数が返されてしまうのです。
そこに値を入れたところで何も起きません。なのでエラーになるのです。
C++で考えると、プロパティは以下のような関数があるようなものです。
const Vector3 GetLocalPosition() { return localPosition; } void SetLocalPosition( const Vector3 pos ) { localPosition = pos; }
そう考えると、Vector3で渡さないといけないのが理解しやすいんじゃないかと思います。
P.S 2018.11.25
自分の理解が浅はかだったので修正しました。