From 75e715340f41518dfab8589b46db3e90860c0469 Mon Sep 17 00:00:00 2001 From: villaingames Date: Mon, 9 Oct 2023 19:31:57 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AC=BC=EC=B2=B4=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A0=90=EC=88=98=20=EC=84=B8=ED=8C=85=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 테이블에 해당하는 데이터 세팅 및 점수획득 로직 추가 --- Assets/Scenes/Stage_Single.unity | 5 ++ Assets/Scripts/Etc/Enums.cs | 23 +++++- .../Stage/Controller/PlayerController.cs | 48 +++++++---- .../Stage/Controller/PropController.cs | 35 +++++--- .../Stage/Controller/SpawnController.cs | 82 ++++++++++++------- Assets/Scripts/Stage/Manage/StageManager.cs | 65 +++++++++++++-- 6 files changed, 196 insertions(+), 62 deletions(-) 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; }