EditorTool3D/Assets/TriLib/TriLibCore/Scripts/AssetUnloader.cs

83 lines
2.1 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace TriLibCore
{
/// <summary>Represents a Class to destroy every Asset (Textures, Materials, Meshes) loaded by TriLib for this GameObject.</summary>
public class AssetUnloader : MonoBehaviour
{
/// <summary>
/// Assets Allocation List.
/// </summary>
public List<Object> Allocations;
/// <summary>The Asset Unloader unique identifier.</summary>
public int Id
{
get => _id;
set
{
_id = value;
Register();
}
}
[SerializeField]
[HideInInspector]
private int _id;
private static int _lastId;
private static readonly Dictionary<int, int> AssetUnloaders = new Dictionary<int, int>();
/// <summary>Gets the next allocation Identifier.</summary>
/// <returns>The Allocation Identifier.</returns>
public static int GetNextId()
{
return _lastId++;
}
private void Register()
{
if (!AssetUnloaders.ContainsKey(_id))
{
AssetUnloaders[_id] = 0;
}
else
{
AssetUnloaders[_id]++;
}
}
private void Start()
{
Register();
}
private void OnDestroy()
{
if (AssetUnloaders.TryGetValue(_id, out var value))
{
if (--value <= 0)
{
for (var i = 0; i < Allocations.Count; i++)
{
var allocation = Allocations[i];
if (allocation == null)
{
continue;
}
Destroy(allocation);
}
AssetUnloaders.Remove(_id);
}
else
{
AssetUnloaders[_id] = value;
}
}
}
}
}