fgm24/Assets/Scripts/PathFinding/NavMeshComponents/Scripts/NavMeshBuilderState.cs

109 lines
2.9 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
namespace NavMeshPlus.Extensions
{
public class NavMeshBuilderState: IDisposable
{
public Matrix4x4 worldToLocal;
public Bounds worldBounds;
public IEnumerable<GameObject> roots;
private CompositeDisposable disposable;
private Dictionary<Type, System.Object> mExtraState;
private bool _disposed;
public T GetExtraState<T>(bool dispose = true) where T : class, new()
{
if (mExtraState == null)
{
mExtraState = new Dictionary<Type, System.Object>();
disposable = new CompositeDisposable();
}
if (!mExtraState.TryGetValue(typeof(T), out System.Object extra))
{
extra = mExtraState[typeof(T)] = new T();
if (dispose)
{
disposable.Add(extra);
}
}
return extra as T;
}
protected virtual void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
if (disposing)
{
// TODO: dispose managed state (managed objects).
disposable?.Dispose();
}
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null.
_disposed = true;
}
public void Dispose()
{
// Dispose of unmanaged resources.
Dispose(true);
// Suppress finalization.
GC.SuppressFinalize(this);
}
}
partial class CompositeDisposable: IDisposable
{
private bool _disposed;
private List<IDisposable> extraStates = new List<IDisposable>();
public void Add(IDisposable dispose)
{
extraStates.Add(dispose);
}
public void Add(object dispose)
{
if(dispose is IDisposable)
{
extraStates.Add((IDisposable)dispose);
}
}
protected virtual void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
if (disposing)
{
// TODO: dispose managed state (managed objects).
foreach (var item in extraStates)
{
item?.Dispose();
}
extraStates.Clear();
}
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null.
_disposed = true;
}
public void Dispose()
{
// Dispose of unmanaged resources.
Dispose(true);
// Suppress finalization.
GC.SuppressFinalize(this);
}
}
}