MiniGame-PushPush/Assets/SpawnController.cs
villaingames 8701cac907 Addressable 로드 비동기 -> 동기식으로 수정, 플레이 루틴 추가
- 결과 화면 임시 추가
- 종료 후 로비 연결 추가
2023-10-18 20:45:27 +09:00

142 lines
3.8 KiB
C#

using FirstVillain.Entities;
using FirstVillain.EventBus;
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;
private int _maxPropCount = 50;
private int _curPropCount = 0;
private List<JPropInfoData> _propDataList = new();
private void Start()
{
EventBus.Instance.Subscribe<EventPropRemoved>(OnPropRemoved);
}
private void OnDestroy()
{
EventBus.Instance.Unsubscribe<EventPropRemoved>(OnPropRemoved);
}
//최초 플레이어 프리팹 로드 및 생성
//TODO : 씬 외부에서 선택된 플레이어 정보를 넘겨주고 해당 데이터를 받아 생성한다.
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()
{
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<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)
{
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++;
}
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());
}
}
}