HartoukChartEditor/Assets/Script/Manager/NotePoolManager.cs

132 lines
3.8 KiB
C#
Raw Normal View History

using System.Collections.Generic;
using System.Diagnostics;
public class NotePoolManager : BasePool<BaseNote>
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD>ɳ<EFBFBD><C9B3><EFBFBD><EFBFBD><EFBFBD>Ծ<EFBFBD><D4BE><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
/// </summary>
private Dictionary<RuntimeBaseNoteData, BaseNote> _dataToNoteCache = new Dictionary<RuntimeBaseNoteData, BaseNote>();
/// <summary>
/// <20><>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>󱻴<EFBFBD><F3B1BBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>򶼻<EFBFBD><F2B6BCBB>Զ<EFBFBD>Ϊ<EFBFBD><CEAA>ע<EFBFBD><EFBFBD><E1B7B5><EFBFBD>¼<EFBFBD>
/// </summary>
protected override void OnCreate(BaseNote obj)
{
obj.OnNoteUesd += ReturnBaseNoteToPool;
}
/// <summary>
/// <20>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD>µĶ<C2B5><C4B6><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д洢<D0B4>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڿ<EFBFBD><DABF>ٲ<EFBFBD><D9B2><EFBFBD>
/// </summary>
protected override void OnGet(BaseNote obj)
{
base.OnGet(obj);
// <20><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD>ϵ
if (obj.SelfRef != null)
{
_dataToNoteCache.Add(obj.SelfRef, obj);
}
}
/// <summary>
/// <20>ڶ<EFBFBD><DAB6>󱻻<EFBFBD><F3B1BBBB>յ<EFBFBD>ʱ<EFBFBD><CAB1>,<2C>ӻ<EFBFBD>Ծ<EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3>ö<EFBFBD><C3B6><EFBFBD>
/// </summary>
protected override void OnRelease(BaseNote obj)
{
base.OnRelease(obj);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (obj.SelfRef != null && _dataToNoteCache.ContainsKey(obj.SelfRef))
{
_dataToNoteCache.Remove(obj.SelfRef);
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>Note<74><65><EFBFBD>շ<EFBFBD><D5B7><EFBFBD>
/// </summary>
public void ReturnBaseNoteToPool(BaseNote note)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>û<EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>,<2C>򴴽<EFBFBD>һ<EFBFBD><D2BB>
var type = note.GetType();
if (!Pools.ContainsKey(type)) Pools[type] = new Stack<BaseNote>();
Pools[type].Push(note);
note.gameObject.SetActive(false);
}
public override void ClearPool()
{
foreach (var list in ActiveObjectList)
{
foreach (var note in list.Value)
{
ReturnBaseNoteToPool(note);
}
}
}
/// <summary>
/// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD>ķ<EFBFBD>ʽ<EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public BaseNote GetNoteByRuntimeData(RuntimeBaseNoteData data)
{
if (data == null)
{
UnityEngine.Debug.LogError("NotePoolManager" + "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Null");
return null;
}
BaseNote note = null;
switch (data)
{
case RuntimeTapData:
{
ForEach((TapController n) =>
{
if (n.SelfRef == data) note = n;
});
break;
}
case RuntimeDragData:
{
ForEach((DragController n) =>
{
if (n.SelfRef == data) note = n;
});
break;
}
case RuntimeFlickData:
{
ForEach((FlickController n) =>
{
if (n.SelfRef == data) note = n;
});
break;
}
case RuntimeSnakeData:
{
ForEach((DataFlowController n) =>
{
if (n.SelfRef == data) note = n;
});
break;
}
}
UnityEngine.Debug.LogError("NotePoolManager" + ":<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ݲ<EFBFBD><DDB2>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>صļ<D8B5><C4BC><EFBFBD><><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>");
return note;
}
/// <summary>
/// <20><>Note<74>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ֵ伯<D6B5><E4BCAF><EFBFBD>в<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD><E1B7B5>Null,<2C>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public BaseNote GetNoteByRuntimeDataInPool(RuntimeBaseNoteData data)
{
if (data == null)
{
UnityEngine.Debug.LogError("NotePoolManager" + ":<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Null");
return null;
}
if (_dataToNoteCache.TryGetValue(data, out BaseNote result))
{
return result;
}
return null;
}
}