コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Unity で Immutable Collections を使用できるようにする「Unity3D Immutable Collections」紹介

はじめに

「Unity3D Immutable Collections」を Unity プロジェクトに導入することで
Unity で Immutable Collections を使用できるようになります

使用例

using Izzo.Collections.Immutable;
using UnityEngine;

public sealed class Example : MonoBehaviour
{
    private void Awake()
    {
        var list = ImmutableList.Create( 1, 2, 3 );

        list.Add( 4 );
        list.Remove( 1 );

        // 1,2,3
        Debug.Log( string.Join( ",", list ) );
    }
}

例えば ImmutableList を使用して Add や Remove を呼び出しても list 自体は変化しない

using Izzo.Collections.Immutable;
using UnityEngine;

public sealed class Example : MonoBehaviour
{
    private void Awake()
    {
        var list = ImmutableList.Create( 1, 2, 3 );

        var addedList   = list.Add( 4 );
        var removedList = addedList.Remove( 1 );

        // 1,2,3,4
        Debug.Log( string.Join( ",", addedList ) );

        // 2,3,4
        Debug.Log( string.Join( ",", removedList ) );
    }
}

変化後の状態は戻り値で受け取ることができる

using Izzo.Collections.Immutable;
using System.Collections.Generic;

public sealed class Example
{
    private List<int> m_list = new List<int>();

    public ImmutableList<int> List => m_list.ToImmutableList();
}

リストを外部に公開したい時に ToImmutableList することで
不変なリストとして公開することもできる