using System.Collections.Generic; using Gameplay.Common; using PhxhSDK; using UnityEngine; namespace Gameplay.Area.BoardView { public class BoardLineObjPool { private Dictionary> _boardLineObjPool = new Dictionary>(); private Dictionary> _showingBoardLineObj = new Dictionary>(); 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(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()); } _boardLineObjPool[boardIndex].Push(newObj); } _showingBoardLineObj.Add(i + 1, new Stack()); } } 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(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; } } } }