using System; using UnityEngine.Pool; namespace RosettaUI.UndoSystem { /// /// UndoRecordをプーリングして管理するための構造体 /// /// /// using (UndoRecorder<TUndoRecord>.Get(out var record)) /// { /// // recordの初期化処理 /// record.Initialize(...); /// } /// // Dispose時にUndoHistoryにrecordが追加される /// public readonly struct UndoRecorder : IDisposable where TUndoRecord : class, IUndoRecord, new() { private static readonly ObjectPool Pool = new(() => new TUndoRecord()); public static UndoRecorder Get(out TUndoRecord record) { record = Pool.Get(); return new UndoRecorder(record); } private static void OnDispose(IUndoRecord record) { if (record is TUndoRecord typedRecord) { Pool.Release(typedRecord); } } private readonly TUndoRecord _record; private UndoRecorder(TUndoRecord record) { _record = record; } public void Dispose() { UndoHistory.Add(_record, onDispose: OnDispose); } } }