MiniGame-PushPush/Assets/SpawnController.cs

142 lines
3.8 KiB
C#
Raw Normal View History

using FirstVillain.Entities;
2023-10-07 18:09:24 +09:00
using FirstVillain.EventBus;
2023-10-04 20:20:04 +09:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnController : MonoBehaviour
{
[SerializeField] private List<Transform> _itemSpawnPosList;
[SerializeField] private Transform _playerSpawnPos;
[SerializeField] private List<BoxCollider> _propGenerateArea;
2023-10-04 20:20:04 +09:00
2023-10-07 18:09:24 +09:00
private int _maxPropCount = 50;
private int _curPropCount = 0;
private List<JPropInfoData> _propDataList = new();
2023-10-07 18:09:24 +09:00
private void Start()
{
2023-10-07 18:09:24 +09:00
EventBus.Instance.Subscribe<EventPropRemoved>(OnPropRemoved);
}
private void OnDestroy()
{
EventBus.Instance.Unsubscribe<EventPropRemoved>(OnPropRemoved);
}
2023-10-04 20:20:04 +09:00
//<2F><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
//TODO : <20><> <20>ܺο<DCBA><CEBF><EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0>ְ<EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>޾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
public PlayerController SpawnPlayer(PlayerInfo info)
{
var player = AddressableManager.Instance.Spawn(info.PrefapName, null);
var controller = player.GetComponent<PlayerController>();
controller.SetData(info);
controller.Block();
RespawnPlayer(controller, true);
return controller;
}
public void SpawnProps()
2023-10-04 20:20:04 +09:00
{
var propList = TableManager.Instance.GetPropInfoList(E_TABLE.JPropInfo);
_propDataList = propList;
StartSpawnProp();
2023-10-04 20:20:04 +09:00
}
public void RespawnPlayer(PlayerController player, bool isStart = false)
2023-10-04 20:20:04 +09:00
{
player.transform.position = _playerSpawnPos.position;
player.transform.rotation = _playerSpawnPos.rotation;
StartCoroutine(RespawnDelay(player, isStart));
2023-10-04 20:20:04 +09:00
}
2023-10-07 18:09:24 +09:00
//Ÿ<>Ժ<EFBFBD><D4BA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ұ<EFBFBD>..?
private void StartSpawnProp()
2023-10-07 18:09:24 +09:00
{
StartCoroutine(SpawnPropsCoroutine());
2023-10-07 18:09:24 +09:00
}
private IEnumerator SpawnPropsCoroutine()
2023-10-07 18:09:24 +09:00
{
//TODO : <20>Ͻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD>
while(StageManager.Instance.IsSpawnable)
2023-10-07 18:09:24 +09:00
{
yield return new WaitForSeconds(1f);
if (_curPropCount < _maxPropCount)
{
SelectProp();
2023-10-07 18:09:24 +09:00
}
}
}
private void SelectProp()
{
var rateTable = TableManager.Instance.LoadTable<JPropRateData>(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)
2023-10-07 18:09:24 +09:00
{
var prop = AddressableManager.Instance.Spawn(data.PrefabName, null);
var controller = prop.GetComponent<PropController>();
int rnd = Random.Range(0, _propGenerateArea.Count);
var bound = _propGenerateArea[rnd].bounds;
controller.SetData(data, bound);
_curPropCount++;
2023-10-07 18:09:24 +09:00
}
private void OnPropRemoved(EventPropRemoved e)
{
_curPropCount--;
}
2023-10-04 20:20:04 +09:00
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;
}
2023-10-04 20:20:04 +09:00
controller.Respawn();
if (isStart)
{
EventBus.Instance.Publish(new EventStartGame());
}
}
2023-10-04 20:20:04 +09:00
}