8701cac907
- 결과 화면 임시 추가 - 종료 후 로비 연결 추가
142 lines
3.8 KiB
C#
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());
|
|
}
|
|
}
|
|
}
|