You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.7 KiB
C#
56 lines
1.7 KiB
C#
3 weeks ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using Unity.BossRoom.Gameplay.GameplayObjects;
|
||
|
using UnityEngine.Pool;
|
||
|
using Object = UnityEngine.Object;
|
||
|
|
||
|
namespace Unity.BossRoom.Gameplay.Actions
|
||
|
{
|
||
|
public static class ActionFactory
|
||
|
{
|
||
|
private static Dictionary<ActionID, ObjectPool<Action>> s_ActionPools = new Dictionary<ActionID, ObjectPool<Action>>();
|
||
|
|
||
|
private static ObjectPool<Action> GetActionPool(ActionID actionID)
|
||
|
{
|
||
|
if (!s_ActionPools.TryGetValue(actionID, out var actionPool))
|
||
|
{
|
||
|
actionPool = new ObjectPool<Action>(
|
||
|
createFunc: () => Object.Instantiate(GameDataSource.Instance.GetActionPrototypeByID(actionID)),
|
||
|
actionOnRelease: action => action.Reset(),
|
||
|
actionOnDestroy: Object.Destroy);
|
||
|
|
||
|
s_ActionPools.Add(actionID, actionPool);
|
||
|
}
|
||
|
|
||
|
return actionPool;
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// Factory method that creates Actions from their request data.
|
||
|
/// </summary>
|
||
|
/// <param name="data">the data to instantiate this skill from. </param>
|
||
|
/// <returns>the newly created action. </returns>
|
||
|
public static Action CreateActionFromData(ref ActionRequestData data)
|
||
|
{
|
||
|
var ret = GetActionPool(data.ActionID).Get();
|
||
|
ret.Initialize(ref data);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
public static void ReturnAction(Action action)
|
||
|
{
|
||
|
var pool = GetActionPool(action.ActionID);
|
||
|
pool.Release(action);
|
||
|
}
|
||
|
|
||
|
public static void PurgePooledActions()
|
||
|
{
|
||
|
foreach (var actionPool in s_ActionPools.Values)
|
||
|
{
|
||
|
actionPool.Clear();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|