値型のプロパティ・インデクサ

2022年1月9日

値型では代入時にコピーが作成されますが、値型のプロパティやインデクサから値を取得しようとする場合も同様にコピーが作成されます。 値型のプロパティ・インデクサはインスタンスそのものではなくインスタンスのコピーを返すことから、直接インスタンスを変更することができません。

エラーサンプルコード

ジェネリック コレクション内の構造体を直接変更しようとしたときに発生

using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
    void Start()
    {
        List<Vector2> positions = new List<Vector2>();

        Vector2 player1Pos;

        player1Pos.x = 1.0f;
        player1Pos.y = 2.0f;

        positions.Add(player1Pos);

        // エラー(Listクラスの内部では、インデクサでアクセスされているため)
        positions[0].x = 3.0f;

        // positionはプロパティのため、変更できません。
        transform.position.x = 10;
    }
}

// UnityEngineのVector2の代わりに定義
struct Vector2
{
    public float x;
    public float y;
}

対応

このような操作を行いたい場合は、いったんListから一時変数に構造体をコピーし、値を変更してから再度Listに格納するようにします。

Vector2 pos = positions[0];
pos.x = 3.0f;
positions[0] = pos;

Unityでのポジションに適用
いったんプロパティから一時変数に構造体をコピーし、値を変更してから再度プロパティに格納するようにします。

var pos = transform.position;
pos.x = 3.0f;
transform.position = pos;

Unity

Posted by hidepon