diff --git a/Assets/Scenes/Stage_Single.unity b/Assets/Scenes/Stage_Single.unity index c8632da..4301410 100644 --- a/Assets/Scenes/Stage_Single.unity +++ b/Assets/Scenes/Stage_Single.unity @@ -12526,6 +12526,11 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 9161262214850749213, guid: 00e97690e9831f84e85295dd8972cd3e, + type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} - target: {fileID: 9215673432559229180, guid: 00e97690e9831f84e85295dd8972cd3e, type: 3} propertyPath: m_Name diff --git a/Assets/Scripts/Etc/Enums.cs b/Assets/Scripts/Etc/Enums.cs index d01c013..16603d7 100644 --- a/Assets/Scripts/Etc/Enums.cs +++ b/Assets/Scripts/Etc/Enums.cs @@ -3,4 +3,25 @@ public enum E_TEAM None, Red, Blue, -} \ No newline at end of file +} + +public enum E_STAGE_TYPE +{ + Single_Adventure, + Single_TimeAttack, +} + +public enum E_STAGE_STATE +{ + Ready, + Playing, + Pause, + End, +} + +#region Table +public enum E_TABLE +{ + JPropInfo, +} +#endregion Table \ No newline at end of file diff --git a/Assets/Scripts/Stage/Controller/PlayerController.cs b/Assets/Scripts/Stage/Controller/PlayerController.cs index 364b5d4..2df288a 100644 --- a/Assets/Scripts/Stage/Controller/PlayerController.cs +++ b/Assets/Scripts/Stage/Controller/PlayerController.cs @@ -5,31 +5,35 @@ using UnityEngine; public class PlayerController : MonoBehaviour { - [SerializeField] private MinigameController _minigameController; - - + [SerializeField] private Renderer _characterRenderer; private bool _isPushed = false; - //Move values - - - //private Rigidbody _rigidBody; - private PlayerMove _playerMove; - - + private E_TEAM _currentTeam = E_TEAM.None; + private PlayerInfo _tableData; public bool IsBlock { get; private set; } - void Start() + private void Start() { _playerMove = GetComponent(); EventBus.Instance.Subscribe(OnGetMinigamePoint); } + private void OnDestroy() + { + EventBus.Instance.Unsubscribe(OnGetMinigamePoint); + } + + public void SetData() + { + _currentTeam = E_TEAM.Red; + _tableData = new PlayerInfo(); + } + // Update is called once per frame - void Update() + private void Update() { if(IsBlock) { @@ -79,7 +83,7 @@ public class PlayerController : MonoBehaviour var prop = collider.GetComponent(); if(prop != null) { - prop.Explode(new PlayerInfo(), transform.position, E_TEAM.Blue); + prop.Explode(_tableData, transform.position, _currentTeam); } } @@ -93,14 +97,26 @@ public class PlayerController : MonoBehaviour Push(e.MinigamePoint); } + public void Respawn() + { + IsBlock = false; + _characterRenderer.enabled = true; + } + + public void Block() + { + _characterRenderer.enabled = false; + IsBlock = true; + } + #region Collision - private void OnCollisionExit(Collision collision) + private void OnTriggerExit(Collider other) { - if(collision.gameObject.layer == LayerMask.NameToLayer("Remove")) + if (other.gameObject.layer == LayerMask.NameToLayer("Remove")) { + Block(); StageManager.Instance.PlayerFall(this); - IsBlock = true; } } diff --git a/Assets/Scripts/Stage/Controller/PropController.cs b/Assets/Scripts/Stage/Controller/PropController.cs index 826f57f..729f0be 100644 --- a/Assets/Scripts/Stage/Controller/PropController.cs +++ b/Assets/Scripts/Stage/Controller/PropController.cs @@ -1,3 +1,4 @@ +using FirstVillain.Entities; using FirstVillain.EventBus; using System.Collections; using System.Collections.Generic; @@ -8,17 +9,28 @@ public class PropController : MonoBehaviour //»ý¼º ½Ã FX private E_TEAM _hitTeam = E_TEAM.None; - private CharacterController _controller; - private Rigidbody _rigidBody; + + private JPropInfoData _data; private void Start() { - _rigidBody = GetComponent(); + } - public void SetData() + public void SetData(JPropInfoData data, Bounds bound) { - //¸îÁ¡ÀÎÁö.. Å×À̺íÀÌ ³´°ÚÁö? + _rigidBody = GetComponent(); + + _data = data; + + _rigidBody.mass = _data.Mass; + + var randomPos = new Vector3( + Random.Range(bound.min.x, bound.max.y), + Random.Range(bound.min.y, bound.max.z), + Random.Range(bound.min.z, bound.max.z)); + + transform.position = randomPos; } public void Explode(PlayerInfo info, Vector3 position, E_TEAM team) @@ -30,19 +42,18 @@ public class PropController : MonoBehaviour _rigidBody.AddExplosionForce(power, position, range); _hitTeam = team; - - //Ã߶ô À½... ¹Ù´Ú¿¡ ÄݶóÀÌ´õ¸¦ µÑ±î } private void OnTriggerExit(Collider other) { if (other.gameObject.layer == LayerMask.NameToLayer("Remove")) { - //StageManager¿¡ ÆÀ º¸³»¼­ Á¡¼ö ȹµæ ¿äû - Debug.Log("Á¡¼ö ȹµæ"); - EventBus.Instance.Publish(new EventPropRemoved()); - AddressableManager.Instance.Release(gameObject); - //Á¦°Å + if(_hitTeam != E_TEAM.None) + { + StageManager.Instance.UpdateScore(_hitTeam, _data.Point); + EventBus.Instance.Publish(new EventPropRemoved()); + AddressableManager.Instance.Release(gameObject); + } } } } diff --git a/Assets/Scripts/Stage/Controller/SpawnController.cs b/Assets/Scripts/Stage/Controller/SpawnController.cs index 6c725c6..04fb6cc 100644 --- a/Assets/Scripts/Stage/Controller/SpawnController.cs +++ b/Assets/Scripts/Stage/Controller/SpawnController.cs @@ -1,3 +1,4 @@ +using FirstVillain.Entities; using FirstVillain.EventBus; using System.Collections; using System.Collections.Generic; @@ -12,8 +13,11 @@ public class SpawnController : MonoBehaviour private int _maxPropCount = 50; private int _curPropCount = 0; + private List _PropDataList = new(); + private void Start() { + EventBus.Instance.Subscribe(OnPropRemoved); } @@ -21,65 +25,87 @@ public class SpawnController : MonoBehaviour { EventBus.Instance.Unsubscribe(OnPropRemoved); } + //ÃÖÃÊ Ç÷¹À̾î ÇÁ¸®ÆÕ ·Îµå ¹× »ý¼º - public PlayerController SpawnPlayer() + //TODO : ¾À ¿ÜºÎ¿¡¼­ ¼±ÅÃµÈ Ç÷¹À̾î Á¤º¸¸¦ ³Ñ°ÜÁÖ°í ÇØ´ç µ¥ÀÌÅ͸¦ ¹Þ¾Æ »ý¼ºÇÑ´Ù. + public void SpawnPlayer(string prefab/*ÃßÈÄ µ¥ÀÌÅÍ·Î ±³Ã¼*/, System.Action result) { - //ÇÁ¸®ÆÕ ·Îµå - - //Instantiate - - //À§Ä¡ Á¶Á¤ - return new PlayerController(); + TableManager.Instance.GetPropInfoList(E_TABLE.JPropInfo, propList => + { + _PropDataList = propList; + AddressableManager.Instance.Spawn(prefab, null, onComplete => + { + var controller = onComplete.GetComponent(); + controller.SetData(); + controller.Block(); + RespawnPlayer(controller); + result(controller); + }); + }); } public void RespawnPlayer(PlayerController player) { player.transform.position = _playerSpawnPos.position; player.transform.rotation = _playerSpawnPos.rotation; + + StartCoroutine(RespawnDelay(player)); } //ŸÀÔº°·Î ¸¸µé¾î¾ß ÇÒ±î..? - public void SpawnProp() + public void StartSpawnProp() { - StartCoroutine(StartSpawnProps()); + StartCoroutine(SpawnPropsCoroutine()); } - private IEnumerator StartSpawnProps() + private IEnumerator SpawnPropsCoroutine() { - //TODO : °ÔÀÓ Ç÷¹ÀÌ ÁßÀ¸·Î º¯°æÇÊ¿ä - while(true) + //TODO : ÀϽà Á¤Áö »óÅ°¡ ÀÖÀ¸¸é º¯°æÇÊ¿ä + while(StageManager.Instance.IsPlaying) { yield return new WaitForSeconds(1f); if (_curPropCount < _maxPropCount) { - AddressableManager.Instance.Spawn("Crate_01", null, OnSpawnedProp); - _curPropCount++; + SelectProp(); } } } - public void OnSpawnedProp(GameObject obj) + private void SelectProp() { - int rnd = Random.Range(0, _propGenerateArea.Count); - var bound = _propGenerateArea[rnd]; - var randomPos = new Vector3( - Random.Range(bound.min.x, bound.max.y), - Random.Range(bound.min.y, bound.max.z), - Random.Range(bound.min.z, bound.max.z)); + //È®·ü·Î? + //°íÁ¤? + //¿ì¼± ÇØ´ç Å×À̺íÀ» °¡Á®¿Í¼­ °í¸£´Â ÇüÅ + var targetProp = _PropDataList.Find(arg => arg.PrefabName == "Crate_01"); - obj.transform.position = randomPos; + //¿ì¼± È®·ü·Î °¡Á®¿Ô´Ù°í °¡Á¤ + GenerateProp(targetProp); + } + + private void GenerateProp(JPropInfoData data) + { + AddressableManager.Instance.Spawn(data.PrefabName, null, prop => + { + var controller = prop.GetComponent(); + + int rnd = Random.Range(0, _propGenerateArea.Count); + var bound = _propGenerateArea[rnd]; + controller.SetData(data, bound); + + _curPropCount++; + }); } private void OnPropRemoved(EventPropRemoved e) { _curPropCount--; } - //ij¸¯ÅÍ ³«ÇÏ ½Ã Àç»ý¼º + private IEnumerator RespawnDelay(PlayerController controller) + { + //TODO : UI¿¡ Àç»ý¼º ½Ã°£ Ç¥±â + yield return new WaitForSeconds(3f); - //¾ÆÀÌÅÛ Àç»ý¼º(30Ãʸ¶´Ù ¾ø´Â °÷¿¡ »ý¼º) - - //¹°Ã¼ ÃÖÃÊ ¿©±â¼­ »ý¼º - //Å×ÀÌºí µ¥ÀÌÅÍ¿¡ ¸Â°Ô °íÁ¤»ý¼º? - //»ý¼º µ¥ÀÌÅÍ ¾îµð¼­ °ü¸®ÇÒÁö? + controller.Respawn(); + } } diff --git a/Assets/Scripts/Stage/Manage/StageManager.cs b/Assets/Scripts/Stage/Manage/StageManager.cs index b143eb9..aed7fd8 100644 --- a/Assets/Scripts/Stage/Manage/StageManager.cs +++ b/Assets/Scripts/Stage/Manage/StageManager.cs @@ -1,11 +1,20 @@ +using FirstVillain.Entities; using FirstVillain.Singleton; +using Newtonsoft.Json; using System; using System.Collections; using System.Collections.Generic; +using System.IO; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; +[Serializable] +public class Wrapper +{ + public List list; +} + public class StageManager : UnitySingletonOnce { [SerializeField] private SpawnController _spawnController; @@ -13,28 +22,67 @@ public class StageManager : UnitySingletonOnce private PlayerController _currentPlayer; private Dictionary _teamScoreDict = new(); + private E_STAGE_TYPE _currentStageType; + private E_STAGE_STATE _state; + + public bool IsPlaying { get { return _state == E_STAGE_STATE.Playing; } } + private void Start() { - //AddressableManager.Instance.Spawn("Crate_02", null, OnCompleteLoad); - _spawnController.SpawnProp(); + //Àӽà ȣÃâ + Init(E_STAGE_TYPE.Single_TimeAttack, "Player_Cop"); + } + + private void Init(E_STAGE_TYPE type, string prefab/*ÃßÈÄ Å×À̺í*/) + { + _currentStageType = type; + _state = E_STAGE_STATE.Ready; + InitScore(); + //TODO : UIÃʱâÈ­ + _spawnController.SpawnPlayer(prefab, result => + { + //½ÃÀÛ ½Ã°£Ç¥±â? + StartGame(); + }); + } + + private void InitScore() + { + switch(_currentStageType) + { + case E_STAGE_TYPE.Single_Adventure: + case E_STAGE_TYPE.Single_TimeAttack: + _teamScoreDict.Add(E_TEAM.Red, 0); + break; + } } public void StartGame() { + _state = E_STAGE_STATE.Playing; StartCoroutine(PlayTimer(Constants.PLAY_TIME)); + _spawnController.StartSpawnProp(); + } + + public void UpdateScore(E_TEAM team, int score) + { + if (_teamScoreDict.ContainsKey(team)) + { + _teamScoreDict[team] += score; + //TODO : UI Ç¥±â + Debug.Log($"Current Score : {_teamScoreDict[team]}"); + } } //³«ÇÏÇßÀ» ¶§ public void PlayerFall(PlayerController player) { - player.gameObject.SetActive(false); _spawnController.RespawnPlayer(player); - //À½... - //_spawnController.RespawnPlayer(_currentPlayer); } public void GameOver() { + _state = E_STAGE_STATE.End; //°ÔÀÓ Á¾·á UI È£Ãâ } @@ -42,9 +90,16 @@ public class StageManager : UnitySingletonOnce private IEnumerator PlayTimer(float time) { float timer = 0; + float secTimer = 0; while(timer < time) { timer += Time.deltaTime; + secTimer += Time.deltaTime; + if(secTimer >= 1f) + { + secTimer = 0; + //UI¿¡ Ç¥±â ½Ã°£ °¨¼Ò(ÃÊ) + } yield return null; }