diff --git a/Assets/GameUIController.cs b/Assets/GameUIController.cs index d5f89d4..b602f67 100644 --- a/Assets/GameUIController.cs +++ b/Assets/GameUIController.cs @@ -17,6 +17,7 @@ public class GameUIController : MonoBehaviour [SerializeField] private Image profileImageB; [SerializeField] private Sprite[] profileImageSprites; //0. 기본 드래곤 1. 기본 호랑이 2.아이보리 드래곤 3. 아이보리 호랑이 [SerializeField] private Sprite[] indicatorSprites; //0. active 1. inactive + private Sprite _originalSpriteA; private Sprite _originalSpriteB; @@ -45,14 +46,7 @@ public class GameUIController : MonoBehaviour { GameManager.Instance.panelManager.OpenSettingsPanel(); } - - public void InitUI() - { - if (UserManager.Instance == null) return; - retryButton.SetActive(false); - playerANameText.text = UserManager.Instance.Nickname; - } - + public void InitPlayersName(string playerNameA, string playerNameB) { playerANameText.text = playerNameA; diff --git a/Assets/LYC/GameLYC.unity.meta b/Assets/LYC/GameLYC.unity.meta index d9e199b..cea0f0a 100644 --- a/Assets/LYC/GameLYC.unity.meta +++ b/Assets/LYC/GameLYC.unity.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b8e3d5d18e544774eb144db419a327d2 +guid: ded4103a87c2de84db5f4ce2675227ef DefaultImporter: externalObjects: {} userData: diff --git a/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab b/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab index 19e269f..c7dccab 100644 --- a/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab +++ b/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab @@ -575,7 +575,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.5882353} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -618,10 +618,9 @@ MonoBehaviour: m_EditorClassIdentifier: bannerObj: {fileID: 7291411618834705046} bannerText: {fileID: 5108301403921453943} + interval: 0.1 dragonOpenEyes: {fileID: 3881260292094838299} dragonCloseEyes: {fileID: 6707373289257723271} tigerOpenEyes: {fileID: 1508819185250841244} tigerCloseEyes: {fileID: 399504369641388738} - fullText: "\uBB34\uC2B9\uBD80 \uC785\uB2C8\uB2E4" - interval: 0.1 flipDuration: 0.3 diff --git a/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab b/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab index 7d9ce05..82b84f5 100644 --- a/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab +++ b/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab @@ -499,7 +499,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.5882353} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -542,8 +542,7 @@ MonoBehaviour: m_EditorClassIdentifier: bannerObj: {fileID: 7291411618834705046} bannerText: {fileID: 5108301403921453943} + interval: 0.1 characterOpenEyes: {fileID: 1632927645355555415} characterCloseEyes: {fileID: 3881260292094838299} depressedEffect: {fileID: 155037671892554820} - fullText: "\uD328\uBC30\uD588\uC2B5\uB2C8\uB2E4" - interval: 0.1 diff --git a/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab b/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab index f0cc93a..c8e9768 100644 --- a/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab +++ b/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab @@ -837,7 +837,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.5882353} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -866,6 +866,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 9b132148519758c42824252ec9a2d3a4, type: 3} m_Name: m_EditorClassIdentifier: + bannerObj: {fileID: 0} + bannerText: {fileID: 5108301403921453943} + interval: 0.1 haloEffectImg: {fileID: 376994097320605198} characterImg: {fileID: 3881260292094838299} shineEffectImg: @@ -875,9 +878,6 @@ MonoBehaviour: circleEffectImg: - {fileID: 1661063685800461951} - {fileID: 5812078995592861983} - bannerText: {fileID: 5108301403921453943} - fullText: "\uC2B9\uB9AC\uD588\uC2B5\uB2C8\uB2E4!" - interval: 0.1 --- !u!225 &4545556044007292713 CanvasGroup: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Prefabs/Panels/Main Panel.prefab b/Assets/Resources/Prefabs/Panels/Main Panel.prefab index 834ee12..ca0fdef 100644 --- a/Assets/Resources/Prefabs/Panels/Main Panel.prefab +++ b/Assets/Resources/Prefabs/Panels/Main Panel.prefab @@ -1713,7 +1713,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: "\uD638\uB7AD\uC774" + m_text: "\uD654\uB791\uB098\uBE44" m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2} diff --git a/Assets/Scenes/Game.unity b/Assets/Scenes/Game.unity index bd4adef..0f450eb 100644 --- a/Assets/Scenes/Game.unity +++ b/Assets/Scenes/Game.unity @@ -328,7 +328,7 @@ Camera: m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_BackGroundColor: {r: 0.5372549, g: 0.654902, b: 0.5803922, a: 1} m_projectionMatrixMode: 1 m_GateFitMode: 2 m_FOVAxisMode: 0 diff --git a/Assets/Script/Common/Constants.cs b/Assets/Script/Common/Constants.cs index 84d60dd..0dda83a 100644 --- a/Assets/Script/Common/Constants.cs +++ b/Assets/Script/Common/Constants.cs @@ -9,8 +9,6 @@ public const int MinCountForDrawCheck = 150; public const int RAING_POINTS = 10; - public string[] AI_NAMIES = { "이세돌", "신사동호랭이","진짜인간임","종로3가짱돌","마스터김춘배","62세황순자","고준일 강사님"}; - public enum MultiplayManagerState { CreateRoom, // 방 생성 diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index 1c70c95..8303a77 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using PimDeWitte.UnityMainThreadDispatcher; +using Random = UnityEngine.Random; public abstract class BasePlayerState { @@ -21,11 +22,9 @@ public abstract class BasePlayerState if (gameLogic.CheckGameWin(playerType, row, col)) { - GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {playerType} Win", () => - { - var gameResult = playerType == Enums.PlayerType.PlayerA? Enums.GameResult.Win:Enums.GameResult.Lose; - gameLogic.EndGame(gameResult); - }); + var gameResult = playerType == Enums.PlayerType.PlayerA? Enums.GameResult.Win:Enums.GameResult.Lose; + GameManager.Instance.panelManager.OpenEffectPanel(gameResult); + gameLogic.EndGame(gameResult); } else { @@ -33,10 +32,8 @@ public abstract class BasePlayerState { if (gameLogic.CheckGameDraw()) { - GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: Draw", () => - { - gameLogic.EndGame(Enums.GameResult.Draw); - }); + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); + gameLogic.EndGame(Enums.GameResult.Draw); } else { @@ -300,20 +297,24 @@ public class GameLogic : MonoBehaviour switch (gameType) { // TODO: 현재 싱글 플레이로 바로 넘어가지 않기 때문에 미사용 중 - case Enums.GameType.SinglePlay: - firstPlayerState = new PlayerState(true); - secondPlayerState = new AIState(); - // AI 난이도 설정(급수 설정) - OmokAI.Instance.SetRating(UserManager.Instance.Rating); - - //유저 이름 사진 초기화 - GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, "AIPlayer"); - GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, 1); - - ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"PlayerAI", UserManager.Instance.imageIndex, 1); - - SetState(firstPlayerState); - break; + // case Enums.GameType.SinglePlay: + // firstPlayerState = new PlayerState(true); + // secondPlayerState = new AIState(); + // // AI 난이도 설정(급수 설정) + // OmokAI.Instance.SetRating(UserManager.Instance.Rating); + // + // //AI닉네임 랜덤생성 + // var aiName = RandomAINickname(); + // var imageIndex = UnityEngine.Random.Range(0, 2); + // + // //유저 이름 사진 초기화 + // GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, aiName); + // GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, imageIndex); + // + // ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,aiName, UserManager.Instance.imageIndex, imageIndex); + // + // SetState(firstPlayerState); + // break; case Enums.GameType.MultiPlay: // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 UnityMainThreadDispatcher.Instance().Enqueue(() => @@ -421,6 +422,17 @@ public class GameLogic : MonoBehaviour } } + //AI닉네임 랜덤 생성 + private string RandomAINickname() + { + string[] AI_NAMIES = { "이세돌", "신사동호랭이","진짜인간임","종로3가짱돌","마스터김춘배","62세황순자","고준일 강사님"}; + + var index = UnityEngine.Random.Range(0, AI_NAMIES.Length); + + return AI_NAMIES[index]; + } + + public void SwitchToSinglePlayer() { _multiplayManager?.Dispose(); @@ -434,18 +446,22 @@ public class GameLogic : MonoBehaviour secondPlayerState = new AIState(); // AI 난이도 설정(급수 설정) OmokAI.Instance.SetRating(UserManager.Instance.Rating); + + //AI닉네임 랜덤생성 + var aiName = RandomAINickname(); + var imageIndex = UnityEngine.Random.Range(0, 2); // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 UnityMainThreadDispatcher.Instance().Enqueue(() => { // 스레드 확인 로그: 추후 디버깅 시 필요할 수 있을 것 같아 남겨둡니다 // Debug.Log($"[UnityMainThreadDispatcher] 실행 스레드: {System.Threading.Thread.CurrentThread.ManagedThreadId}"); - // UI 업데이트 - GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, "AIPlayer"); - GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, 1); - - // 리플레이 데이터 업데이트 - ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, "PlayerAI", UserManager.Instance.imageIndex, 1); + + //유저 이름 사진 초기화 + GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, aiName); + GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, imageIndex); + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,aiName, UserManager.Instance.imageIndex, imageIndex); // 로딩 패널 열려있으면 닫기 GameManager.Instance.panelManager.CloseLoadingPanel(); @@ -564,7 +580,6 @@ public class GameLogic : MonoBehaviour SetState(null); ReplayManager.Instance.SaveReplayDataResult(result); //TODO: 게임 종료 후 행동 구현 - SceneManager.LoadScene("Main"); } //승리 확인 함수 diff --git a/Assets/Script/Game/GameManager.cs b/Assets/Script/Game/GameManager.cs index 677308b..6ebe1f1 100644 --- a/Assets/Script/Game/GameManager.cs +++ b/Assets/Script/Game/GameManager.cs @@ -11,7 +11,7 @@ public class GameManager : Singleton private Enums.GameType _gameType; private GameLogic _gameLogic; private StoneController _stoneController; - private GameObject _omokBoardImage; + private GameObject _camera; private GameUIController _gameUIController; [SerializeField] private GameObject panelManagerPrefab; @@ -46,10 +46,12 @@ public class GameManager : Singleton } else { - if (_stoneController != null && _omokBoardImage != null) + if (_camera != null) { - _stoneController.GetComponent().DOShakePosition(0.5f, 0.5f); - _omokBoardImage.GetComponent().DOShakePosition(0.5f, 0.5f); + _camera.transform.DOShakePosition(0.5f, 0.5f).OnComplete(() => + { + _camera.transform.position = new Vector3(0,0,-10); + }); } } } @@ -76,7 +78,7 @@ public class GameManager : Singleton _stoneController = GameObject.FindObjectOfType(); _stoneController.InitStones(); var fioTimer = FindObjectOfType(); - _omokBoardImage = GameObject.FindObjectOfType().gameObject; + _camera = GameObject.FindObjectOfType().gameObject; _gameUIController = GameObject.FindObjectOfType(); _gameLogic = new GameLogic(_stoneController, _gameType, fioTimer); diff --git a/Assets/Script/UI/PanelController/PanelManager.cs b/Assets/Script/UI/PanelController/PanelManager.cs index f66194f..33400a9 100644 --- a/Assets/Script/UI/PanelController/PanelManager.cs +++ b/Assets/Script/UI/PanelController/PanelManager.cs @@ -17,6 +17,7 @@ public class PanelManager : MonoBehaviour private GameObject loadingPanelObject; private Dictionary panelPrefabs = new Dictionary(); + private Dictionary effectPanelPrefabs = new Dictionary(); private void Awake() { @@ -28,6 +29,13 @@ public class PanelManager : MonoBehaviour { panelPrefabs[prefab.name] = prefab; } + + //게임결과 이펙트 패널 + GameObject[] effectPrefabs = Resources.LoadAll("Prefabs/Effects"); + foreach (GameObject effect in effectPrefabs) + { + effectPanelPrefabs[effect.name] = effect; + } Debug.Log($"총 {panelPrefabs.Count}개의 패널이 로드됨."); } @@ -53,6 +61,48 @@ public class PanelManager : MonoBehaviour return null; } + + #region 게임결과 이펙트 패널 관련 + + public GameObject GetEffectPanel(string panelName) + { + if (effectPanelPrefabs.TryGetValue(panelName, out GameObject prefab)) + { + return Instantiate(prefab, _canvas.transform); + } + else + { + Debug.LogError($"패널 '{panelName}'을 찾을 수 없습니다."); + } + + return null; + } + + public void OpenEffectPanel(Enums.GameResult gameResult) + { + switch (gameResult) + { + case Enums.GameResult.Win: + if (_canvas != null) + { + var winEffectPanelObject = GetEffectPanel("Win Effect Panel"); + } + break; + case Enums.GameResult.Lose: + if (_canvas != null) + { + var winEffectPanelObject = GetEffectPanel("Lose Effect Panel"); + } + break; + case Enums.GameResult.Draw: + if (_canvas != null) + { + var winEffectPanelObject = GetEffectPanel("Draw Effect Panel"); + } + break; + } + } + #endregion public void OpenMainPanel() {