NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Area/BoardView/BoardLineObjPool.cs

105 lines
3.6 KiB
C#

using System.Collections.Generic;
using Gameplay.Common;
using PhxhSDK;
using UnityEngine;
namespace Gameplay.Area.BoardView
{
public class BoardLineObjPool
{
private Dictionary<int, Stack<GameObject>> _boardLineObjPool = new Dictionary<int, Stack<GameObject>>();
private Dictionary<int, Stack<GameObject>> _showingBoardLineObj = new Dictionary<int, Stack<GameObject>>();
private Transform _rootTrans;
public void Init()
{
var rootObj = new GameObject("[BoardLineObjPool]");
_rootTrans = rootObj.transform;
var initPoolCount = 10;
for (int i = 0; i < 6; i++)
{
var sidePath = PathDefine.BoardSide.SIDE_PATHS[i];
var sampleObj = AssetManager.Instance.GetPreLoadResult<GameObject>(sidePath);
for (int j = 0; j < initPoolCount; j++)
{
var newObj = Object.Instantiate(sampleObj, _rootTrans);
newObj.SetActive(false);
var boardIndex = i + 1;
if (!_boardLineObjPool.ContainsKey(boardIndex))
{
_boardLineObjPool.Add(boardIndex, new Stack<GameObject>());
}
_boardLineObjPool[boardIndex].Push(newObj);
}
_showingBoardLineObj.Add(i + 1, new Stack<GameObject>());
}
}
public void Dispose()
{
for (int i = 0; i < 6; i++)
{
var showStack = _showingBoardLineObj[i + 1];
while (showStack.Count > 0)
{
var obj = showStack.Pop();
Object.Destroy(obj);
}
var poolStack = _boardLineObjPool[i + 1];
while (poolStack.Count > 0)
{
var obj = poolStack.Pop();
Object.Destroy(obj);
}
}
}
public void CreateBoardAt(int boardIndex)
{
var centerCellIndex = boardIndex / 10;
var centerPos = AreaManager.instance.GetWorldPosByIndex(centerCellIndex);
var side = boardIndex % 10;
var newObj = _CreateBoardSideObj(side, centerPos);
var stack = _showingBoardLineObj[side];
stack.Push(newObj);
}
public void ReturnAll()
{
for (int i = 0; i < 6; i++)
{
var sideIndex = i + 1;
var stack = _showingBoardLineObj[sideIndex];
while (stack.Count > 0)
{
var obj = stack.Pop();
obj.SetActive(false);
_boardLineObjPool[sideIndex].Push(obj);
}
}
}
private GameObject _CreateBoardSideObj(int side, Vector3 centerPos)
{
var poolStack = _boardLineObjPool[side];
if (poolStack.Count == 0)
{
var sidePath = PathDefine.BoardSide.SIDE_PATHS[side - 1];
var sampleObj = AssetManager.Instance.GetPreLoadResult<GameObject>(sidePath);
var newObj = Object.Instantiate(sampleObj, _rootTrans);
newObj.transform.position = centerPos;
return newObj;
}
else
{
var newObj = poolStack.Pop();
newObj.transform.position = centerPos;
newObj.SetActive(true);
return newObj;
}
}
}
}