MRが楽しい

MRやVRについて学習したことを書き残す

IEquatableでClassの比較を実装する

本日は C# の小ネタ枠です。
IEquatable で Class の等価性チェックを実装する方法についてです。

前回記事

以下の前回記事の付随記事です。
bluebirdofoz.hatenablog.com

Classの比較処理を実装する

前回記事で Class のみ ReactiveProperty の差分チェックが意図通りに動作しませんでした。
何らかの理由で Struct や Record が利用できない場合は IEquatable インタフェースの Equals を実装して比較の方法を指定できます。

値の比較が行われるように前回のコードを変更してみました。
・ReactivePropertyTest2.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;

public class ReactivePropertyTest2 : MonoBehaviour
{
    /// <summary>
    /// Class
    /// </summary>
    private class CheckClass : System.IEquatable<CheckClass>
    {
        public bool onoff;

        /// <summary>
        ///  比較処理
        /// </summary>
        /// <param name="other"></param>
        /// <returns></returns>
        public bool Equals(CheckClass other)
        {
            return onoff == other.onoff;
        }
    }

    // 各ReactiveProperty変数
    private ReactiveProperty<CheckClass> checkClassProp = new ReactiveProperty<CheckClass>(new CheckClass());

    void Start()
        
    {
        // Class 変更検知時の処理
        checkClassProp
            .Subscribe(checkstate => { Debug.Log($"CheckClass Changed! : {checkstate.onoff}"); })
            .AddTo(this);
    }

    /// <summary>
    /// 全ての bool を True に変更
    /// </summary>
    [ContextMenu("ON")]
    void ChangeOn()
    {
        ChangeStates(true);
    }

    /// <summary>
    /// 全ての bool を False に変更
    /// </summary>
    [ContextMenu("OFF")]
    void ChangeOff()
    {
        ChangeStates(false);
    }

    void ChangeStates(bool isOnOff)
    {
        var checkClass = new CheckClass() { onoff = isOnOff };
        checkClassProp.Value = checkClass;
    }
}

以下の通り、これで false -> false への変化の場合で通知が発生しないようになりました。