2023-10-09 19:31:57 +09:00
|
|
|
|
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;
|
2023-10-18 20:45:27 +09:00
|
|
|
|
[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;
|
|
|
|
|
|
2023-10-18 20:45:27 +09:00
|
|
|
|
private List<JPropInfoData> _propDataList = new();
|
2023-10-09 19:31:57 +09:00
|
|
|
|
|
2023-10-07 18:09:24 +09:00
|
|
|
|
private void Start()
|
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
|
2023-10-07 18:09:24 +09:00
|
|
|
|
EventBus.Instance.Subscribe<EventPropRemoved>(OnPropRemoved);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnDestroy()
|
|
|
|
|
{
|
|
|
|
|
EventBus.Instance.Unsubscribe<EventPropRemoved>(OnPropRemoved);
|
|
|
|
|
}
|
2023-10-09 19:31:57 +09:00
|
|
|
|
|
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>
|
2023-10-09 19:31:57 +09:00
|
|
|
|
//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>.
|
2023-10-18 20:45:27 +09:00
|
|
|
|
public PlayerController SpawnPlayer(PlayerInfo info)
|
2023-10-16 18:47:52 +09:00
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
var player = AddressableManager.Instance.Spawn(info.PrefapName, null);
|
|
|
|
|
var controller = player.GetComponent<PlayerController>();
|
|
|
|
|
controller.SetData(info);
|
|
|
|
|
controller.Block();
|
|
|
|
|
RespawnPlayer(controller, true);
|
|
|
|
|
return controller;
|
2023-10-16 18:47:52 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SpawnProps()
|
2023-10-04 20:20:04 +09:00
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
var propList = TableManager.Instance.GetPropInfoList(E_TABLE.JPropInfo);
|
|
|
|
|
_propDataList = propList;
|
|
|
|
|
StartSpawnProp();
|
2023-10-04 20:20:04 +09:00
|
|
|
|
}
|
|
|
|
|
|
2023-10-16 18:47:52 +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;
|
2023-10-09 19:31:57 +09:00
|
|
|
|
|
2023-10-16 18:47:52 +09:00
|
|
|
|
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>..?
|
2023-10-16 18:47:52 +09:00
|
|
|
|
private void StartSpawnProp()
|
2023-10-07 18:09:24 +09:00
|
|
|
|
{
|
2023-10-09 19:31:57 +09:00
|
|
|
|
StartCoroutine(SpawnPropsCoroutine());
|
2023-10-07 18:09:24 +09:00
|
|
|
|
}
|
|
|
|
|
|
2023-10-09 19:31:57 +09:00
|
|
|
|
private IEnumerator SpawnPropsCoroutine()
|
2023-10-07 18:09:24 +09:00
|
|
|
|
{
|
2023-10-09 19:31:57 +09:00
|
|
|
|
//TODO : <20>Ͻ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD>
|
2023-10-18 20:45:27 +09:00
|
|
|
|
while(StageManager.Instance.IsSpawnable)
|
2023-10-07 18:09:24 +09:00
|
|
|
|
{
|
|
|
|
|
yield return new WaitForSeconds(1f);
|
|
|
|
|
if (_curPropCount < _maxPropCount)
|
|
|
|
|
{
|
2023-10-09 19:31:57 +09:00
|
|
|
|
SelectProp();
|
2023-10-07 18:09:24 +09:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-09 19:31:57 +09:00
|
|
|
|
private void SelectProp()
|
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
var rateTable = TableManager.Instance.LoadTable<JPropRateData>(E_TABLE.JPropRate);
|
2023-10-09 19:31:57 +09:00
|
|
|
|
|
2023-10-18 20:45:27 +09:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-10-09 19:31:57 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void GenerateProp(JPropInfoData data)
|
2023-10-07 18:09:24 +09:00
|
|
|
|
{
|
2023-10-18 20:45:27 +09:00
|
|
|
|
var prop = AddressableManager.Instance.Spawn(data.PrefabName, null);
|
|
|
|
|
var controller = prop.GetComponent<PropController>();
|
2023-10-09 19:31:57 +09:00
|
|
|
|
|
2023-10-18 20:45:27 +09:00
|
|
|
|
int rnd = Random.Range(0, _propGenerateArea.Count);
|
|
|
|
|
var bound = _propGenerateArea[rnd].bounds;
|
|
|
|
|
controller.SetData(data, bound);
|
2023-10-09 19:31:57 +09:00
|
|
|
|
|
2023-10-18 20:45:27 +09:00
|
|
|
|
_curPropCount++;
|
2023-10-07 18:09:24 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnPropRemoved(EventPropRemoved e)
|
|
|
|
|
{
|
|
|
|
|
_curPropCount--;
|
|
|
|
|
}
|
2023-10-04 20:20:04 +09:00
|
|
|
|
|
2023-10-16 18:47:52 +09:00
|
|
|
|
private IEnumerator RespawnDelay(PlayerController controller, bool isStart)
|
2023-10-09 19:31:57 +09:00
|
|
|
|
{
|
2023-10-16 18:47:52 +09:00
|
|
|
|
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
|
|
|
|
|
2023-10-09 19:31:57 +09:00
|
|
|
|
controller.Respawn();
|
2023-10-16 18:47:52 +09:00
|
|
|
|
if (isStart)
|
|
|
|
|
{
|
|
|
|
|
EventBus.Instance.Publish(new EventStartGame());
|
|
|
|
|
}
|
2023-10-09 19:31:57 +09:00
|
|
|
|
}
|
2023-10-04 20:20:04 +09:00
|
|
|
|
}
|