using FirstVillain.Entities; using FirstVillain.EventBus; using System.Collections; using System.Collections.Generic; using UnityEngine; public class SpawnController : MonoBehaviour { [SerializeField] private List _itemSpawnPosList; [SerializeField] private Transform _playerSpawnPos; [SerializeField] private List _propGenerateArea; private int _maxPropCount = 50; private int _curPropCount = 0; private List _propDataList = new(); private void Start() { EventBus.Instance.Subscribe(OnPropRemoved); } private void OnDestroy() { EventBus.Instance.Unsubscribe(OnPropRemoved); } //ÃÖÃÊ Ç÷¹À̾î ÇÁ¸®ÆÕ ·Îµå ¹× »ý¼º //TODO : ¾À ¿ÜºÎ¿¡¼­ ¼±ÅÃµÈ Ç÷¹À̾î Á¤º¸¸¦ ³Ñ°ÜÁÖ°í ÇØ´ç µ¥ÀÌÅ͸¦ ¹Þ¾Æ »ý¼ºÇÑ´Ù. public PlayerController SpawnPlayer(PlayerInfo info) { var player = AddressableManager.Instance.Spawn(info.PrefapName, null); var controller = player.GetComponent(); controller.SetData(info); controller.Block(); RespawnPlayer(controller, true); return controller; } public void SpawnProps() { var propList = TableManager.Instance.GetPropInfoList(E_TABLE.JPropInfo); _propDataList = propList; StartSpawnProp(); } public void RespawnPlayer(PlayerController player, bool isStart = false) { player.transform.position = _playerSpawnPos.position; player.transform.rotation = _playerSpawnPos.rotation; StartCoroutine(RespawnDelay(player, isStart)); } //ŸÀÔº°·Î ¸¸µé¾î¾ß ÇÒ±î..? private void StartSpawnProp() { StartCoroutine(SpawnPropsCoroutine()); } private IEnumerator SpawnPropsCoroutine() { //TODO : ÀϽà Á¤Áö »óÅ°¡ ÀÖÀ¸¸é º¯°æÇÊ¿ä while(StageManager.Instance.IsSpawnable) { yield return new WaitForSeconds(1f); if (_curPropCount < _maxPropCount) { SelectProp(); } } } private void SelectProp() { var rateTable = TableManager.Instance.LoadTable(E_TABLE.JPropRate); int curProb = 0; int rnd = Random.Range(0, 10000); int groupId = 0; foreach (var rate in rateTable.list) { curProb += rate.Prob; if (rnd < curProb) { groupId = rate.GroupId; break; } } var targets = TableManager.Instance.GetPropGroupList(groupId); curProb = 0; rnd = Random.Range(0, 10000); foreach (var prop in targets) { curProb += prop.GenRate; if (rnd < curProb) { GenerateProp(prop); break; } } } private void GenerateProp(JPropInfoData data) { var prop = AddressableManager.Instance.Spawn(data.PrefabName, null); var controller = prop.GetComponent(); int rnd = Random.Range(0, _propGenerateArea.Count); var bound = _propGenerateArea[rnd].bounds; controller.SetData(data, bound); _curPropCount++; } private void OnPropRemoved(EventPropRemoved e) { _curPropCount--; } private IEnumerator RespawnDelay(PlayerController controller, bool isStart) { int timer = Constants.PLAYER_SPAWN_TIME; var sec = new WaitForSeconds(1f); while (timer >= 0) { EventBus.Instance.Publish(new EventSpawnTimer(timer)); timer--; yield return sec; } controller.Respawn(); if (isStart) { EventBus.Instance.Publish(new EventStartGame()); } } }