From d84b5fa1d89d489c4c473732cfbe05cc9b4b8808 Mon Sep 17 00:00:00 2001 From: Lim0_C Date: Wed, 26 Mar 2025 16:52:23 +0900 Subject: [PATCH 01/15] =?UTF-8?q?DO-46=20[Fix]=20=EB=A9=80=ED=8B=B0=20?= =?UTF-8?q?=EC=8B=9C=20=ED=84=B4=20=EA=B0=95=EC=A1=B0=20=EB=B2=84=EA=B7=B8?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Game/GameLogic.cs | 50 ++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index 497eb19..6e67408 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -341,9 +341,29 @@ public class GameLogic : MonoBehaviour Debug.Log("해당 플레이어가 선공 입니다"); firstPlayerState = new PlayerState(true, _multiplayManager, joinRoomData.roomId); secondPlayerState = new MultiPlayerState(false, _multiplayManager); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, joinRoomData.opponentNickname); + GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, joinRoomData.opponentImageIndex); + + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, joinRoomData.opponentNickname, UserManager.Instance.imageIndex, joinRoomData.opponentImageIndex); + }); } else { + Debug.Log("해당 플레이어가 후공 입니다"); + firstPlayerState = new MultiPlayerState(true, _multiplayManager); + secondPlayerState = new PlayerState(false, _multiplayManager, _roomId); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.InitPlayersName(joinRoomData.opponentNickname, UserManager.Instance.Nickname); + GameManager.Instance.InitProfileImages(joinRoomData.opponentImageIndex, UserManager.Instance.imageIndex); + + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(joinRoomData.opponentNickname, UserManager.Instance.Nickname, joinRoomData.opponentImageIndex, UserManager.Instance.imageIndex); + }); + Debug.Log("해당 플레이어가 후공 입니다"); firstPlayerState = new MultiPlayerState(true, _multiplayManager); secondPlayerState = new PlayerState(false, _multiplayManager, joinRoomData.roomId); @@ -352,12 +372,6 @@ public class GameLogic : MonoBehaviour // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 UnityMainThreadDispatcher.Instance().Enqueue(() => { - GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, joinRoomData.opponentNickname); - GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, joinRoomData.opponentImageIndex); - - // 리플레이 데이터 업데이트 - ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, joinRoomData.opponentNickname, UserManager.Instance.imageIndex, joinRoomData.opponentImageIndex); - // 로딩 패널 열려있으면 닫기 GameManager.Instance.panelManager.CloseLoadingPanel(); @@ -386,24 +400,34 @@ public class GameLogic : MonoBehaviour { Debug.Log("해당 플레이어가 선공 입니다"); firstPlayerState = new PlayerState(true, _multiplayManager, _roomId); - secondPlayerState = new MultiPlayerState(false, _multiplayManager); + secondPlayerState = new MultiPlayerState(false, _multiplayManager); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, startGameData.opponentNickname); + GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, startGameData.opponentImageIndex); + + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, startGameData.opponentNickname, UserManager.Instance.imageIndex, startGameData.opponentImageIndex); + }); } else { Debug.Log("해당 플레이어가 후공 입니다"); firstPlayerState = new MultiPlayerState(true, _multiplayManager); secondPlayerState = new PlayerState(false, _multiplayManager, _roomId); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.InitPlayersName(startGameData.opponentNickname, UserManager.Instance.Nickname); + GameManager.Instance.InitProfileImages(startGameData.opponentImageIndex, UserManager.Instance.imageIndex); + + // 리플레이 데이터 업데이트 + ReplayManager.Instance.InitReplayData(startGameData.opponentNickname, UserManager.Instance.Nickname, startGameData.opponentImageIndex, UserManager.Instance.imageIndex); + }); } // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 UnityMainThreadDispatcher.Instance().Enqueue(() => { - GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, startGameData.opponentNickname); - GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, startGameData.opponentImageIndex); - - // 리플레이 데이터 업데이트 - ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, startGameData.opponentNickname, UserManager.Instance.imageIndex, startGameData.opponentImageIndex); - // 로딩 패널 열려있으면 닫기 GameManager.Instance.panelManager.CloseLoadingPanel(); From 5ca832c9f9d311b6a7d8e0086cfb44270330084f Mon Sep 17 00:00:00 2001 From: Lim0_C Date: Wed, 26 Mar 2025 17:46:58 +0900 Subject: [PATCH 02/15] =?UTF-8?q?DO-46=20[Fix]=20=EB=A9=80=ED=8B=B0?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=20=ED=84=B4=20=ED=91=9C=EC=8B=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=8A=B9=ED=8C=A8=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Game/GameLogic.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index 6e67408..b0977f1 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -20,7 +20,6 @@ public abstract class BasePlayerState public void ProcessMove(GameLogic gameLogic, Enums.PlayerType playerType, int row, int col) { gameLogic.fioTimer.PauseTimer(); - gameLogic.SetNewBoardValue(playerType, row, col); gameLogic.CountStoneCounter(); @@ -32,6 +31,13 @@ public abstract class BasePlayerState if (gameLogic.CheckGameWin(playerType, row, col)) { var gameResult = playerType == Enums.PlayerType.PlayerA? Enums.GameResult.Win:Enums.GameResult.Lose; + if (gameLogic.gameType == Enums.GameType.MultiPlay) + { + if (gameLogic.firstPlayerState.GetType() != typeof(PlayerState)) + { + gameResult = gameResult == Enums.GameResult.Win ? Enums.GameResult.Lose : Enums.GameResult.Win; + } + } GameManager.Instance.panelManager.OpenEffectPanel(gameResult); gameLogic.EndGame(gameResult); } @@ -354,7 +360,8 @@ public class GameLogic : MonoBehaviour { Debug.Log("해당 플레이어가 후공 입니다"); firstPlayerState = new MultiPlayerState(true, _multiplayManager); - secondPlayerState = new PlayerState(false, _multiplayManager, _roomId); + secondPlayerState = new PlayerState(false, _multiplayManager, joinRoomData.roomId); + UnityMainThreadDispatcher.Instance().Enqueue(() => { GameManager.Instance.InitPlayersName(joinRoomData.opponentNickname, UserManager.Instance.Nickname); @@ -363,10 +370,6 @@ public class GameLogic : MonoBehaviour // 리플레이 데이터 업데이트 ReplayManager.Instance.InitReplayData(joinRoomData.opponentNickname, UserManager.Instance.Nickname, joinRoomData.opponentImageIndex, UserManager.Instance.imageIndex); }); - - Debug.Log("해당 플레이어가 후공 입니다"); - firstPlayerState = new MultiPlayerState(true, _multiplayManager); - secondPlayerState = new PlayerState(false, _multiplayManager, joinRoomData.roomId); } // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 From f3af9c86e65e730ef0c4cf358a1f98208b42eff1 Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Wed, 26 Mar 2025 18:35:15 +0900 Subject: [PATCH 03/15] =?UTF-8?q?DO-64=20[Feat]=20=ED=95=AD=EB=B3=B5=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/GameUIController.cs | 12 +++++-- Assets/Script/Common/Constants.cs | 4 ++- Assets/Script/Game/GameLogic.cs | 18 ++++++++++- Assets/Script/Game/GameManager.cs | 11 ++++++- Assets/Script/Game/MultiplayManager.cs | 43 ++++++++++++++++++++++++-- 5 files changed, 79 insertions(+), 9 deletions(-) diff --git a/Assets/GameUIController.cs b/Assets/GameUIController.cs index b602f67..b564b96 100644 --- a/Assets/GameUIController.cs +++ b/Assets/GameUIController.cs @@ -17,11 +17,17 @@ 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; + private MultiplayManager _multiplayManager; + + private void Start() + { + _multiplayManager = GameManager.Instance.GetMultiplayManager(); + } + public void OnClickConfirmButton() { GameManager.Instance.OnClickConfirmButton(); @@ -37,8 +43,8 @@ public class GameUIController : MonoBehaviour GameManager.Instance.panelManager.OpenConfirmPanel("항복 하시겠습니까?", () => { //TODO: 서버에 항복 전달 및 기타 등등 - - GameManager.Instance.ChangeToMainScene(); + _multiplayManager.RequestSurrender(); + // GameManager.Instance.ChangeToMainScene(); }); } diff --git a/Assets/Script/Common/Constants.cs b/Assets/Script/Common/Constants.cs index 0dda83a..328ac54 100644 --- a/Assets/Script/Common/Constants.cs +++ b/Assets/Script/Common/Constants.cs @@ -16,6 +16,8 @@ StartGame, // 생성한 방에 다른 유저가 참여해서 게임 시작 SwitchAI, // 15초 후 매칭 실패 시 AI 플레이로 전환 알림 ExitRoom, // 자신이 방을 빠져 나왔을 때 - EndGame // 상대방이 접속을 끊거나 방을 나갔을 때 + EndGame, // 상대방이 접속을 끊거나 방을 나갔을 때 + DoSurrender, // 상대방이 항복했을 때 + SurrenderConfirmed // 항복 요청이 성공적으로 전송되었을 때 }; } \ No newline at end of file diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index 497eb19..0c1159f 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -235,7 +235,7 @@ public class GameLogic : MonoBehaviour private int _lastRow; private int _lastCol; - private MultiplayManager _multiplayManager; + public MultiplayManager _multiplayManager; private string _roomId; #region Renju Members @@ -419,6 +419,22 @@ public class GameLogic : MonoBehaviour Debug.Log("## End Game"); // TODO: End Room 처리 break; + case Constants.MultiplayManagerState.DoSurrender: + Debug.Log("상대방의 항복 요청 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Win); + EndGame(Enums.GameResult.Win); + }); + break; + case Constants.MultiplayManagerState.SurrenderConfirmed: + Debug.Log("항복 요청 전송 완료"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Lose); + EndGame(Enums.GameResult.Lose); + }); + break; } ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB"); diff --git a/Assets/Script/Game/GameManager.cs b/Assets/Script/Game/GameManager.cs index 6ebe1f1..90bacf5 100644 --- a/Assets/Script/Game/GameManager.cs +++ b/Assets/Script/Game/GameManager.cs @@ -19,13 +19,22 @@ public class GameManager : Singleton [NonSerialized] public PanelManager panelManager; [NonSerialized] public AudioManager audioManager; + + private MultiplayManager _multiplayManager; protected override void Awake() { base.Awake(); InitPanels(); } - + + public MultiplayManager GetMultiplayManager() + { + _multiplayManager = _gameLogic._multiplayManager; + if (_multiplayManager == null) Debug.Log("MultiplayManager가 null입니다"); + return _multiplayManager; + } + private void InitPanels() { if (panelManager == null) diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs index 4c81e88..da8556d 100644 --- a/Assets/Script/Game/MultiplayManager.cs +++ b/Assets/Script/Game/MultiplayManager.cs @@ -67,6 +67,8 @@ public class MultiplayManager : IDisposable private event Action _onMultiplayStateChanged; public Action OnOpponentMove; + private string _roomId; + public MultiplayManager(Action onMultiplayStateChanged) { _onMultiplayStateChanged = onMultiplayStateChanged; @@ -86,6 +88,8 @@ public class MultiplayManager : IDisposable _socket.On("exitRoom", ExitRoom); _socket.On("endGame", EndGame); _socket.On("doOpponent", DoOpponent); + _socket.On("doSurrender", DoSurrender); + _socket.On("surrenderConfirmed", SurrenderConfirmed); _socket.Connect(); } @@ -109,6 +113,8 @@ public class MultiplayManager : IDisposable private void CreateRoom(SocketIOResponse response) { var data = response.GetValue(); + _roomId = data.roomId; + Debug.Log("roomId CreateRoom할 때 저장? " + _roomId); _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.CreateRoom, data.roomId); } @@ -116,8 +122,8 @@ public class MultiplayManager : IDisposable { var data = response.GetValue(); Debug.Log($"룸에 참여: 룸 ID - {data.roomId}, 상대방 등급 - {data.opponentRating}, 상대방 이름 - {data.opponentNickname}, 흑/백 여부 - {data.isBlack}, 상대방 이미지 인덱스 - {data.opponentImageIndex}"); - - // 필요한 데이터 사용 + _roomId = data.roomId; + Debug.Log("roomId JoinRoom할 때 저장? " + _roomId); _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.JoinRoom, data); } @@ -180,7 +186,38 @@ public class MultiplayManager : IDisposable public void LeaveRoom(string roomId) { - _socket.Emit("leaveRoom", new { roomId }); + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("LeaveRoom 호출 실패: _roomId가 설정되지 않음"); + return; + } + + _socket.Emit("leaveRoom", new { roomId = _roomId }); + _roomId = null; // 방 나가면 roomId 초기화 + } + + public void RequestSurrender() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("LeaveRoom 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("requestSurrender",new { roomId = _roomId }); + } + + private void DoSurrender(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DoSurrender, data.message); + } + + private void SurrenderConfirmed(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.SurrenderConfirmed, data.message); } public void Dispose() From e7c66d49d9cd69672f16954c61a6224059e420bc Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Wed, 26 Mar 2025 18:36:37 +0900 Subject: [PATCH 04/15] =?UTF-8?q?DO-64=20[Style]=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A1=9C=EA=B7=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/GameUIController.cs | 2 -- Assets/Script/Game/MultiplayManager.cs | 2 -- 2 files changed, 4 deletions(-) diff --git a/Assets/GameUIController.cs b/Assets/GameUIController.cs index b564b96..14d15b5 100644 --- a/Assets/GameUIController.cs +++ b/Assets/GameUIController.cs @@ -42,9 +42,7 @@ public class GameUIController : MonoBehaviour { GameManager.Instance.panelManager.OpenConfirmPanel("항복 하시겠습니까?", () => { - //TODO: 서버에 항복 전달 및 기타 등등 _multiplayManager.RequestSurrender(); - // GameManager.Instance.ChangeToMainScene(); }); } diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs index da8556d..c5a8eab 100644 --- a/Assets/Script/Game/MultiplayManager.cs +++ b/Assets/Script/Game/MultiplayManager.cs @@ -114,7 +114,6 @@ public class MultiplayManager : IDisposable { var data = response.GetValue(); _roomId = data.roomId; - Debug.Log("roomId CreateRoom할 때 저장? " + _roomId); _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.CreateRoom, data.roomId); } @@ -123,7 +122,6 @@ public class MultiplayManager : IDisposable var data = response.GetValue(); Debug.Log($"룸에 참여: 룸 ID - {data.roomId}, 상대방 등급 - {data.opponentRating}, 상대방 이름 - {data.opponentNickname}, 흑/백 여부 - {data.isBlack}, 상대방 이미지 인덱스 - {data.opponentImageIndex}"); _roomId = data.roomId; - Debug.Log("roomId JoinRoom할 때 저장? " + _roomId); _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.JoinRoom, data); } From de254f17edb6423d364e5da3812c28af5731afe6 Mon Sep 17 00:00:00 2001 From: 99jamin <99jamin56@gmail.com> Date: Thu, 27 Mar 2025 01:41:09 +0900 Subject: [PATCH 05/15] =?UTF-8?q?Do-59=20[Fix]=20=EC=98=A4=EB=94=94?= =?UTF-8?q?=EC=98=A4=ED=8C=8C=EC=9D=BC=20=EB=A6=AC=EC=86=8C=EC=8A=A4=20?= =?UTF-8?q?=ED=8F=B4=EB=8D=94=EC=97=90=EC=84=9C=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=A1=9C=EB=93=9C,=20=EC=BD=94=EC=9D=B8=20?= =?UTF-8?q?=EA=B5=AC=EC=9E=85=20=EC=8B=9C=20=ED=95=9C=EB=B2=88=EC=97=90=20?= =?UTF-8?q?=EC=A6=9D=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Resources/Sounds.meta | 8 +++ Assets/Resources/{ => Sounds}/Click Sound.mp3 | Bin .../{ => Sounds}/Click Sound.mp3.meta | 0 Assets/Resources/{ => Sounds}/Close Sound.mp3 | Bin .../{ => Sounds}/Close Sound.mp3.meta | 0 .../Coins ADD Sound.wav} | Bin .../Coins ADD Sound.wav.meta} | 0 .../Coins Empty Sound.wav} | Bin .../Coins Empty Sound.wav.meta} | 0 .../Coins Remove Sound.wav} | Bin .../Coins Remove Sound.wav.meta} | 0 Assets/Resources/{ => Sounds}/Game bgm2.mp3 | Bin .../Resources/{ => Sounds}/Game bgm2.mp3.meta | 0 Assets/Resources/{ => Sounds}/lose sound.mp3 | Bin .../{ => Sounds}/lose sound.mp3.meta | 0 Assets/Resources/{ => Sounds}/main bgm.mp3 | Bin .../Resources/{ => Sounds}/main bgm.mp3.meta | 0 .../Resources/{ => Sounds}/stone sound 3.mp3 | Bin .../{ => Sounds}/stone sound 3.mp3.meta | 0 Assets/Resources/{ => Sounds}/win sound.mp3 | Bin .../Resources/{ => Sounds}/win sound.mp3.meta | 0 Assets/Script/Common/AudioManager.cs | 66 ++++++++++++------ Assets/Script/Common/CoinsPanelController.cs | 31 ++++---- .../Script/UI/PanelController/PanelManager.cs | 2 +- 24 files changed, 67 insertions(+), 40 deletions(-) create mode 100644 Assets/Resources/Sounds.meta rename Assets/Resources/{ => Sounds}/Click Sound.mp3 (100%) rename Assets/Resources/{ => Sounds}/Click Sound.mp3.meta (100%) rename Assets/Resources/{ => Sounds}/Close Sound.mp3 (100%) rename Assets/Resources/{ => Sounds}/Close Sound.mp3.meta (100%) rename Assets/Resources/{Coins_ADD_Sound.wav => Sounds/Coins ADD Sound.wav} (100%) rename Assets/Resources/{Coins_ADD_Sound.wav.meta => Sounds/Coins ADD Sound.wav.meta} (100%) rename Assets/Resources/{Coins_Empty_Sound.wav => Sounds/Coins Empty Sound.wav} (100%) rename Assets/Resources/{Coins_Empty_Sound.wav.meta => Sounds/Coins Empty Sound.wav.meta} (100%) rename Assets/Resources/{Coins_Remove_Sound.wav => Sounds/Coins Remove Sound.wav} (100%) rename Assets/Resources/{Coins_Remove_Sound.wav.meta => Sounds/Coins Remove Sound.wav.meta} (100%) rename Assets/Resources/{ => Sounds}/Game bgm2.mp3 (100%) rename Assets/Resources/{ => Sounds}/Game bgm2.mp3.meta (100%) rename Assets/Resources/{ => Sounds}/lose sound.mp3 (100%) rename Assets/Resources/{ => Sounds}/lose sound.mp3.meta (100%) rename Assets/Resources/{ => Sounds}/main bgm.mp3 (100%) rename Assets/Resources/{ => Sounds}/main bgm.mp3.meta (100%) rename Assets/Resources/{ => Sounds}/stone sound 3.mp3 (100%) rename Assets/Resources/{ => Sounds}/stone sound 3.mp3.meta (100%) rename Assets/Resources/{ => Sounds}/win sound.mp3 (100%) rename Assets/Resources/{ => Sounds}/win sound.mp3.meta (100%) diff --git a/Assets/Resources/Sounds.meta b/Assets/Resources/Sounds.meta new file mode 100644 index 0000000..faa8993 --- /dev/null +++ b/Assets/Resources/Sounds.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9fc9c29bf8c5aa040aaeace773096d1b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Click Sound.mp3 b/Assets/Resources/Sounds/Click Sound.mp3 similarity index 100% rename from Assets/Resources/Click Sound.mp3 rename to Assets/Resources/Sounds/Click Sound.mp3 diff --git a/Assets/Resources/Click Sound.mp3.meta b/Assets/Resources/Sounds/Click Sound.mp3.meta similarity index 100% rename from Assets/Resources/Click Sound.mp3.meta rename to Assets/Resources/Sounds/Click Sound.mp3.meta diff --git a/Assets/Resources/Close Sound.mp3 b/Assets/Resources/Sounds/Close Sound.mp3 similarity index 100% rename from Assets/Resources/Close Sound.mp3 rename to Assets/Resources/Sounds/Close Sound.mp3 diff --git a/Assets/Resources/Close Sound.mp3.meta b/Assets/Resources/Sounds/Close Sound.mp3.meta similarity index 100% rename from Assets/Resources/Close Sound.mp3.meta rename to Assets/Resources/Sounds/Close Sound.mp3.meta diff --git a/Assets/Resources/Coins_ADD_Sound.wav b/Assets/Resources/Sounds/Coins ADD Sound.wav similarity index 100% rename from Assets/Resources/Coins_ADD_Sound.wav rename to Assets/Resources/Sounds/Coins ADD Sound.wav diff --git a/Assets/Resources/Coins_ADD_Sound.wav.meta b/Assets/Resources/Sounds/Coins ADD Sound.wav.meta similarity index 100% rename from Assets/Resources/Coins_ADD_Sound.wav.meta rename to Assets/Resources/Sounds/Coins ADD Sound.wav.meta diff --git a/Assets/Resources/Coins_Empty_Sound.wav b/Assets/Resources/Sounds/Coins Empty Sound.wav similarity index 100% rename from Assets/Resources/Coins_Empty_Sound.wav rename to Assets/Resources/Sounds/Coins Empty Sound.wav diff --git a/Assets/Resources/Coins_Empty_Sound.wav.meta b/Assets/Resources/Sounds/Coins Empty Sound.wav.meta similarity index 100% rename from Assets/Resources/Coins_Empty_Sound.wav.meta rename to Assets/Resources/Sounds/Coins Empty Sound.wav.meta diff --git a/Assets/Resources/Coins_Remove_Sound.wav b/Assets/Resources/Sounds/Coins Remove Sound.wav similarity index 100% rename from Assets/Resources/Coins_Remove_Sound.wav rename to Assets/Resources/Sounds/Coins Remove Sound.wav diff --git a/Assets/Resources/Coins_Remove_Sound.wav.meta b/Assets/Resources/Sounds/Coins Remove Sound.wav.meta similarity index 100% rename from Assets/Resources/Coins_Remove_Sound.wav.meta rename to Assets/Resources/Sounds/Coins Remove Sound.wav.meta diff --git a/Assets/Resources/Game bgm2.mp3 b/Assets/Resources/Sounds/Game bgm2.mp3 similarity index 100% rename from Assets/Resources/Game bgm2.mp3 rename to Assets/Resources/Sounds/Game bgm2.mp3 diff --git a/Assets/Resources/Game bgm2.mp3.meta b/Assets/Resources/Sounds/Game bgm2.mp3.meta similarity index 100% rename from Assets/Resources/Game bgm2.mp3.meta rename to Assets/Resources/Sounds/Game bgm2.mp3.meta diff --git a/Assets/Resources/lose sound.mp3 b/Assets/Resources/Sounds/lose sound.mp3 similarity index 100% rename from Assets/Resources/lose sound.mp3 rename to Assets/Resources/Sounds/lose sound.mp3 diff --git a/Assets/Resources/lose sound.mp3.meta b/Assets/Resources/Sounds/lose sound.mp3.meta similarity index 100% rename from Assets/Resources/lose sound.mp3.meta rename to Assets/Resources/Sounds/lose sound.mp3.meta diff --git a/Assets/Resources/main bgm.mp3 b/Assets/Resources/Sounds/main bgm.mp3 similarity index 100% rename from Assets/Resources/main bgm.mp3 rename to Assets/Resources/Sounds/main bgm.mp3 diff --git a/Assets/Resources/main bgm.mp3.meta b/Assets/Resources/Sounds/main bgm.mp3.meta similarity index 100% rename from Assets/Resources/main bgm.mp3.meta rename to Assets/Resources/Sounds/main bgm.mp3.meta diff --git a/Assets/Resources/stone sound 3.mp3 b/Assets/Resources/Sounds/stone sound 3.mp3 similarity index 100% rename from Assets/Resources/stone sound 3.mp3 rename to Assets/Resources/Sounds/stone sound 3.mp3 diff --git a/Assets/Resources/stone sound 3.mp3.meta b/Assets/Resources/Sounds/stone sound 3.mp3.meta similarity index 100% rename from Assets/Resources/stone sound 3.mp3.meta rename to Assets/Resources/Sounds/stone sound 3.mp3.meta diff --git a/Assets/Resources/win sound.mp3 b/Assets/Resources/Sounds/win sound.mp3 similarity index 100% rename from Assets/Resources/win sound.mp3 rename to Assets/Resources/Sounds/win sound.mp3 diff --git a/Assets/Resources/win sound.mp3.meta b/Assets/Resources/Sounds/win sound.mp3.meta similarity index 100% rename from Assets/Resources/win sound.mp3.meta rename to Assets/Resources/Sounds/win sound.mp3.meta diff --git a/Assets/Script/Common/AudioManager.cs b/Assets/Script/Common/AudioManager.cs index 017cccf..0395904 100644 --- a/Assets/Script/Common/AudioManager.cs +++ b/Assets/Script/Common/AudioManager.cs @@ -1,21 +1,12 @@ -using UnityEngine; +using System.Collections.Generic; +using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.Timeline; public class AudioManager : Singleton { - [Header("BGM")] - [SerializeField] private AudioClip mainBgm; - [SerializeField] private AudioClip gameBgm; - [Header("SFX")] - [SerializeField] private AudioClip clickSound; - [SerializeField] private AudioClip closeSound; - [SerializeField] private AudioClip coinsAddSound; - [SerializeField] private AudioClip coinsEmptySound; - [SerializeField] private AudioClip coinsRemoveSound; - [SerializeField] private AudioClip winSound; - [SerializeField] private AudioClip loseSound; - [SerializeField] private AudioClip stoneSound; + private AudioClip mainBgm; + private AudioClip gameBgm; [HideInInspector] public AudioSource bgmAudioSource; // BGM을 위한 AudioSource private AudioSource sfxAudioSource; // SFX를 위한 AudioSource @@ -25,6 +16,9 @@ public class AudioManager : Singleton [HideInInspector]public bool isPlayBGM; [HideInInspector]public bool isPlaySFX; + private Dictionary audioClips = new Dictionary(); + + private void Awake() { base.Awake(); // 부모 클래스의 Awake 호출 @@ -32,6 +26,30 @@ public class AudioManager : Singleton // BGM과 SFX를 위한 별도의 AudioSource 생성 bgmAudioSource = gameObject.AddComponent(); sfxAudioSource = gameObject.AddComponent(); + + //Sounds폴더 내의 모든 오디오클립 로드 + AudioClip[] clips = Resources.LoadAll("Sounds"); + + foreach (AudioClip clip in clips) + { + audioClips[clip.name] = clip; + } + + Debug.Log($"총 {audioClips.Count}개의 오디오클립이 로드됨."); + + } + + public AudioClip GetAudioClip(string clipName) + { + if (audioClips.TryGetValue(clipName, out AudioClip clip)) + { + return clip; + } + else + { + Debug.LogError($"패널 '{clipName}'을 찾을 수 없습니다."); + } + return null; } // 시작 시 BGM을 자동으로 재생 @@ -39,12 +57,15 @@ public class AudioManager : Singleton { isPlayBGM = UserManager.IsPlayBGM; isPlaySFX = UserManager.IsPlaySFX; + PlayBGM(); } // 메인 BGM을 재생하는 함수 public void PlayMainBGM() { + mainBgm = GetAudioClip("main bgm"); + if (bgmAudioSource != null && mainBgm != null && !bgmAudioSource.isPlaying) { bgmAudioSource.clip = mainBgm; @@ -56,6 +77,8 @@ public class AudioManager : Singleton public void PlayGameBGM() { + gameBgm = GetAudioClip("Game bgm2"); + if (bgmAudioSource != null && gameBgm != null && !bgmAudioSource.isPlaying) { bgmAudioSource.clip = gameBgm; @@ -101,10 +124,9 @@ public class AudioManager : Singleton // 클릭 사운드(SFX) 재생 public void PlayClickSound() { - if (isPlaySFX && sfxAudioSource != null) { - sfxAudioSource.PlayOneShot(clickSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("Click Sound"), sfxVolume); } } @@ -113,7 +135,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource != null) { - sfxAudioSource.PlayOneShot(closeSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("Close Sound"), sfxVolume); } } @@ -121,7 +143,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(coinsAddSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("Coins ADD Sound"), sfxVolume); } } @@ -129,7 +151,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(coinsEmptySound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("Coins Empty Sound"), sfxVolume); } } @@ -137,7 +159,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(coinsRemoveSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("Coins Remove Sound"), sfxVolume); } } @@ -145,7 +167,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(loseSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("lose sound"), sfxVolume); } } @@ -153,7 +175,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(winSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("win sound"), sfxVolume); } } @@ -161,7 +183,7 @@ public class AudioManager : Singleton { if (isPlaySFX && sfxAudioSource!=null) { - sfxAudioSource.PlayOneShot(stoneSound, sfxVolume); + sfxAudioSource.PlayOneShot(GetAudioClip("stone sound3"), sfxVolume); } } } \ No newline at end of file diff --git a/Assets/Script/Common/CoinsPanelController.cs b/Assets/Script/Common/CoinsPanelController.cs index 7d3c38e..1c61cb3 100644 --- a/Assets/Script/Common/CoinsPanelController.cs +++ b/Assets/Script/Common/CoinsPanelController.cs @@ -53,7 +53,7 @@ public class CoinsPanelController : MonoBehaviour _coinsRect.sizeDelta = new Vector2(100 + textLength * 30f, 100f); } - private void ChangeTextAnimation(bool isAdd, Action action) + private void ChangeTextAnimation(int coinAdd,bool isAdd, Action action) { float duration = 0.2f; float yPos = 40f; @@ -64,8 +64,8 @@ public class CoinsPanelController : MonoBehaviour if (isAdd) { var currentHeartCount = coinsCountText.text; - coinsCountText.text = (int.Parse(currentHeartCount) + 500).ToString(); - // 코인 텍스트 100씩 증가 + coinsCountText.text = (int.Parse(currentHeartCount) + coinAdd).ToString(); + // 코인 텍스트 증가 } else { @@ -98,22 +98,19 @@ public class CoinsPanelController : MonoBehaviour _canvasGroup.blocksRaycasts = false; //코인 중복 추가 방지 코드 Sequence sequence = DOTween.Sequence(); - // i += a 반복 횟수 조절, 100개 단위로 상승 차감 시 100으로 설정 - for (int i = 0; i < coinsCount; i+=500) + sequence.AppendCallback(() => { - sequence.AppendCallback(() => + ChangeTextAnimation(coinsCount,true, ()=> { - ChangeTextAnimation(true, ()=> - { - _coinsCount += 500; - action?.Invoke(); - }); - - // 효과음 재생 - AudioManager.Instance.PlayCoinsAddSound(); + _coinsCount += coinsCount; + action?.Invoke(); }); - sequence.AppendInterval(0.5f); - } + + // 효과음 재생 + AudioManager.Instance.PlayCoinsAddSound(); + }); + sequence.AppendInterval(0.5f); + sequence.OnComplete(() => { _canvasGroup.blocksRaycasts = true; //구매 후 클릭 활성화 @@ -152,7 +149,7 @@ public class CoinsPanelController : MonoBehaviour coinsRemoveImageObject.transform.DOScale(3f, 1f); coinsRemoveImageObject.GetComponent().DOFade(0f, 1f) - .OnComplete( ()=>ChangeTextAnimation(false, ()=> + .OnComplete( ()=>ChangeTextAnimation(0,false, ()=> { //감소된 코인 적용 _coinsCount -= 100; diff --git a/Assets/Script/UI/PanelController/PanelManager.cs b/Assets/Script/UI/PanelController/PanelManager.cs index cbfc844..6aada1c 100644 --- a/Assets/Script/UI/PanelController/PanelManager.cs +++ b/Assets/Script/UI/PanelController/PanelManager.cs @@ -262,7 +262,7 @@ public class PanelManager : MonoBehaviour shopItems.Add(shopItem); } } - GameManager.Instance.panelManager.OpenShopPanel(shopItems); + OpenShopPanel(shopItems); } //승급 패널 생성 From 0858dab05bf98170dc0b394a25d15278a7247135 Mon Sep 17 00:00:00 2001 From: 99jamin <99jamin56@gmail.com> Date: Thu, 27 Mar 2025 09:56:38 +0900 Subject: [PATCH 06/15] =?UTF-8?q?DO-59=20[Style]=20=EB=9D=84=EC=96=B4?= =?UTF-8?q?=EC=93=B0=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Common/CoinsPanelController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/Script/Common/CoinsPanelController.cs b/Assets/Script/Common/CoinsPanelController.cs index 1c61cb3..b184828 100644 --- a/Assets/Script/Common/CoinsPanelController.cs +++ b/Assets/Script/Common/CoinsPanelController.cs @@ -53,7 +53,7 @@ public class CoinsPanelController : MonoBehaviour _coinsRect.sizeDelta = new Vector2(100 + textLength * 30f, 100f); } - private void ChangeTextAnimation(int coinAdd,bool isAdd, Action action) + private void ChangeTextAnimation(int coinAdd, bool isAdd, Action action) { float duration = 0.2f; float yPos = 40f; From 677b3a0d9fa0d812742e387c11f40b5c35497d35 Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Thu, 27 Mar 2025 10:01:28 +0900 Subject: [PATCH 07/15] =?UTF-8?q?DO-65=20[Fix]=20=EC=8A=B9=EB=A6=AC?= =?UTF-8?q?=ED=8C=A8=EB=84=90=20=EB=82=98=ED=83=80=EB=82=A0=20=EB=95=8C=20?= =?UTF-8?q?=EB=B0=B0=EA=B2=BD=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resources/Prefabs/Effects/Win Effect Panel.prefab | 2 +- Assets/Script/UI/Effect/WinEffectController.cs | 10 ++++++++++ Assets/Script/UI/PanelController/PanelManager.cs | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab b/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab index a1f88a4..75a7c3f 100644 --- a/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab +++ b/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab @@ -867,7 +867,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 9b132148519758c42824252ec9a2d3a4, type: 3} m_Name: m_EditorClassIdentifier: - bannerObj: {fileID: 0} + bannerObj: {fileID: 7291411618834705046} bannerText: {fileID: 5108301403921453943} interval: 0.1 haloEffectImg: {fileID: 376994097320605198} diff --git a/Assets/Script/UI/Effect/WinEffectController.cs b/Assets/Script/UI/Effect/WinEffectController.cs index 76c09a5..1948fc9 100644 --- a/Assets/Script/UI/Effect/WinEffectController.cs +++ b/Assets/Script/UI/Effect/WinEffectController.cs @@ -27,6 +27,16 @@ public class WinEffectController : EffectController Invoke(nameof(PopupObject), 0.3f); } + protected override void ShowPanel() + { + CanvasGroup canvasGroup = gameObject.GetComponent() ?? gameObject.AddComponent(); + + canvasGroup.alpha = 0f; + canvasGroup.DOFade(1f, 1f); + bannerObj.transform.DOScale(Vector3.zero, 0f); + bannerObj.transform.DOScale(Vector3.one, 1f); + } + private void RotateHaloObject() { // 무한 회전 효과 diff --git a/Assets/Script/UI/PanelController/PanelManager.cs b/Assets/Script/UI/PanelController/PanelManager.cs index cbfc844..c7db20b 100644 --- a/Assets/Script/UI/PanelController/PanelManager.cs +++ b/Assets/Script/UI/PanelController/PanelManager.cs @@ -38,6 +38,8 @@ public class PanelManager : MonoBehaviour } Debug.Log($"총 {panelPrefabs.Count}개의 패널이 로드됨."); + + OpenEffectPanel(Enums.GameResult.Win); } void SetCanvas() From b50505d051dc122cc9cca21157f8c2b68e484c25 Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Thu, 27 Mar 2025 10:04:03 +0900 Subject: [PATCH 08/15] =?UTF-8?q?DO-65=20[Style]=20=EC=95=88=EC=93=B0?= =?UTF-8?q?=EB=8A=94=20=ED=98=B8=EC=B6=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/UI/PanelController/PanelManager.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Assets/Script/UI/PanelController/PanelManager.cs b/Assets/Script/UI/PanelController/PanelManager.cs index fddca65..6aada1c 100644 --- a/Assets/Script/UI/PanelController/PanelManager.cs +++ b/Assets/Script/UI/PanelController/PanelManager.cs @@ -38,8 +38,6 @@ public class PanelManager : MonoBehaviour } Debug.Log($"총 {panelPrefabs.Count}개의 패널이 로드됨."); - - OpenEffectPanel(Enums.GameResult.Win); } void SetCanvas() From 6587d00b8c64527352ca26402ffdf35ebda1f3b7 Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Thu, 27 Mar 2025 10:23:54 +0900 Subject: [PATCH 09/15] =?UTF-8?q?DO-66=20[Fix]=20=EB=9E=AD=ED=82=B9=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=8B=9C=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Main/NetworkManager.cs | 54 ++++++------------- .../PanelController/LeaderBoardController.cs | 2 +- 2 files changed, 17 insertions(+), 39 deletions(-) diff --git a/Assets/Script/Main/NetworkManager.cs b/Assets/Script/Main/NetworkManager.cs index aca1bf4..b49ffd9 100644 --- a/Assets/Script/Main/NetworkManager.cs +++ b/Assets/Script/Main/NetworkManager.cs @@ -227,8 +227,13 @@ public class NetworkManager : Singleton } } } - - public IEnumerator GetLeaderboard(Action success, Action failure) + + public void GetLeaderboard(Action> success, Action failure) + { + StartCoroutine(GetLeaderboardCoroutine(success, failure)); + } + + public IEnumerator GetLeaderboardCoroutine(Action> success, Action failure) { using (UnityWebRequest www = new UnityWebRequest(Constants.ServerURL + "/leaderboard", UnityWebRequest.kHttpVerbGET)) @@ -256,10 +261,15 @@ public class NetworkManager : Singleton } else { - var result = www.downloadHandler.text; - var scores = JsonUtility.FromJson(result); - - success?.Invoke(scores); + // 성공적으로 데이터를 받아온 경우 + string jsonResponse = www.downloadHandler.text; // 응답으로 받은 JSON 데이터 + + // JSON을 ScoreInfo 리스트로 파싱 + ScoreListWrapper wrapper = JsonUtility.FromJson(jsonResponse); + List leaderboardItems = wrapper.leaderboardDatas; + + // Show 메서드를 통해 데이터를 표시 + success?.Invoke(leaderboardItems); } } } @@ -511,36 +521,4 @@ public class NetworkManager : Singleton } } } - - public void GetLeaderboardData(Action> success, Action failure) - { - StartCoroutine(GetLeaderboardDataCoroutine(success, failure)); - } - - private IEnumerator GetLeaderboardDataCoroutine(Action> success, Action failure) - { - string url = Constants.ServerURL + "/leaderboard/"; // 서버의 리더보드 데이터 URL - - UnityWebRequest www = UnityWebRequest.Get(url); // GET 요청으로 데이터 받기 - yield return www.SendWebRequest(); // 요청 전송 대기 - - // 요청이 실패했을 때 - if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError) - { - Debug.LogError("Error: " + www.error); - failure?.Invoke(); - } - else - { - // 성공적으로 데이터를 받아온 경우 - string jsonResponse = www.downloadHandler.text; // 응답으로 받은 JSON 데이터 - - // JSON을 ScoreInfo 리스트로 파싱 - ScoreListWrapper wrapper = JsonUtility.FromJson(jsonResponse); - List leaderboardItems = wrapper.leaderboardDatas; - - // Show 메서드를 통해 데이터를 표시 - success?.Invoke(leaderboardItems); - } - } } \ No newline at end of file diff --git a/Assets/Script/UI/PanelController/LeaderBoardController.cs b/Assets/Script/UI/PanelController/LeaderBoardController.cs index 6143beb..dd2de8f 100644 --- a/Assets/Script/UI/PanelController/LeaderBoardController.cs +++ b/Assets/Script/UI/PanelController/LeaderBoardController.cs @@ -27,7 +27,7 @@ public class LeaderBoardController : MonoBehaviour if (isLeaderboardLoaded) return; // 이미 리더보드가 로드되었으면 중복 호출 방지 leaderboardPanel.SetActive(true); - NetworkManager.Instance.GetLeaderboardData((leaderboardItems) => + NetworkManager.Instance.GetLeaderboard((leaderboardItems) => { Show(leaderboardItems); }, () => { }); From bc5d4dd0dd61103e6768a283dc5c364c491f0599 Mon Sep 17 00:00:00 2001 From: 99jamin <99jamin56@gmail.com> Date: Thu, 27 Mar 2025 10:38:44 +0900 Subject: [PATCH 10/15] =?UTF-8?q?Do-67=20[Fix]=20=EC=84=B8=ED=8C=85=20?= =?UTF-8?q?=ED=8C=A8=EB=84=90=20=EC=8A=A4=EC=9C=84=EC=B9=98=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Resources/Prefabs/Panels/Setting Panel.prefab | 4 ++-- Assets/Script/Common/AudioManager.cs | 2 +- .../UI/PanelChildController/SwitchController.cs | 12 +++++++++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Assets/Resources/Prefabs/Panels/Setting Panel.prefab b/Assets/Resources/Prefabs/Panels/Setting Panel.prefab index 0b9d12b..54538f0 100644 --- a/Assets/Resources/Prefabs/Panels/Setting Panel.prefab +++ b/Assets/Resources/Prefabs/Panels/Setting Panel.prefab @@ -14,7 +14,7 @@ GameObject: - component: {fileID: 6789969287113785900} - component: {fileID: 413977444317235173} m_Layer: 5 - m_Name: Switch + m_Name: BGM Switch m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -762,7 +762,7 @@ GameObject: - component: {fileID: 3464089222698319368} - component: {fileID: 8434701791193156984} m_Layer: 5 - m_Name: Switch + m_Name: SFX Switch m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 diff --git a/Assets/Script/Common/AudioManager.cs b/Assets/Script/Common/AudioManager.cs index 0395904..01465c9 100644 --- a/Assets/Script/Common/AudioManager.cs +++ b/Assets/Script/Common/AudioManager.cs @@ -19,7 +19,7 @@ public class AudioManager : Singleton private Dictionary audioClips = new Dictionary(); - private void Awake() + protected override void Awake() { base.Awake(); // 부모 클래스의 Awake 호출 diff --git a/Assets/Script/UI/PanelChildController/SwitchController.cs b/Assets/Script/UI/PanelChildController/SwitchController.cs index 8df8317..d95f4e5 100644 --- a/Assets/Script/UI/PanelChildController/SwitchController.cs +++ b/Assets/Script/UI/PanelChildController/SwitchController.cs @@ -19,7 +19,6 @@ public class SwitchController : MonoBehaviour private RectTransform _handleRectTransform; private Image _backgroundImage; - private AudioSource _audioSource; private bool _isOn; @@ -27,7 +26,6 @@ public class SwitchController : MonoBehaviour { _handleRectTransform = handleImage.GetComponent(); _backgroundImage = GetComponent(); - _audioSource = GetComponent(); } private void Start() @@ -35,7 +33,15 @@ public class SwitchController : MonoBehaviour //초기 상태는 false _handleRectTransform.anchoredPosition = new Vector2(-14, 0); _backgroundImage.color = OffColor; - _isOn = false; + + if (gameObject.name == "SFX Switch") + { + _isOn = UserManager.IsPlaySFX; + } + else if (gameObject.name == "BGM Switch") + { + _isOn = UserManager.IsPlayBGM; + } } //스위치 상태 변경 함수 From 54fece46ca0cd05384f69917e2daee5962a35e1c Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Thu, 27 Mar 2025 13:50:57 +0900 Subject: [PATCH 11/15] =?UTF-8?q?DO-70=20[Feat]=20=ED=83=80=EC=9E=84?= =?UTF-8?q?=EC=95=84=EC=9B=83=2030=EC=B4=88=20=EB=A9=80=ED=8B=B0=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Common/Constants.cs | 3 +- Assets/Script/Game/GameLogic.cs | 48 +++++++++++++++++++++----- Assets/Script/Game/MultiplayManager.cs | 25 ++++++++++++++ 3 files changed, 66 insertions(+), 10 deletions(-) diff --git a/Assets/Script/Common/Constants.cs b/Assets/Script/Common/Constants.cs index 328ac54..a15f242 100644 --- a/Assets/Script/Common/Constants.cs +++ b/Assets/Script/Common/Constants.cs @@ -18,6 +18,7 @@ ExitRoom, // 자신이 방을 빠져 나왔을 때 EndGame, // 상대방이 접속을 끊거나 방을 나갔을 때 DoSurrender, // 상대방이 항복했을 때 - SurrenderConfirmed // 항복 요청이 성공적으로 전송되었을 때 + SurrenderConfirmed, // 항복 요청이 성공적으로 전송되었을 때 + ReceiveTimeout // 상대방이 타임 아웃일 때 }; } \ No newline at end of file diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index fb5afb7..5ce6e83 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -177,7 +177,7 @@ public class MultiPlayerState: BasePlayerState gameLogic.UpdateForbiddenMoves(); #endregion - // gameLogic.currentTurn = _playerType; + gameLogic.currentTurn = _playerType; // gameLogic.stoneController.OnStoneClickedDelegate = (row, col) => // { // HandleMove(gameLogic, row, col); @@ -278,17 +278,39 @@ public class GameLogic : MonoBehaviour //timer 시간초과시 진행 함수 this.fioTimer.OnTimeout = () => { - if (currentTurn == Enums.PlayerType.PlayerA) + if (gameType == Enums.GameType.MultiPlay) { - GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {Enums.PlayerType.PlayerB} Win", - () =>{}); - EndGame(Enums.GameResult.Lose); + // 현재 턴의 플레이어가 로컬(유저)인지 확인 + bool isCurrentPlayerLocal = (currentTurn == Enums.PlayerType.PlayerA && firstPlayerState is PlayerState) || + (currentTurn == Enums.PlayerType.PlayerB && secondPlayerState is PlayerState); + + if (isCurrentPlayerLocal) // 내가 타임 오버일 때 + { + _multiplayManager?.SendTimeout(); + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Lose); + EndGame(Enums.GameResult.Lose); + } + else // 로컬에서 자신의 타이머 기준으로 상대방이 타임 오버일 때 + { + // TODO: 컨펌 패널 OK 버튼 삭제? + GameManager.Instance.panelManager.OpenConfirmPanel("상대방의 응답을 기다리는 중입니다", + () => { } ); + } } - else if (currentTurn == Enums.PlayerType.PlayerB) + else { - GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {Enums.PlayerType.PlayerA} Win", - () =>{}); - EndGame(Enums.GameResult.Win); + if (currentTurn == Enums.PlayerType.PlayerA) + { + GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {Enums.PlayerType.PlayerB} Win", + () => { }); + EndGame(Enums.GameResult.Lose); + } + else if (currentTurn == Enums.PlayerType.PlayerB) + { + GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {Enums.PlayerType.PlayerA} Win", + () => { }); + EndGame(Enums.GameResult.Win); + } } }; } @@ -462,6 +484,14 @@ public class GameLogic : MonoBehaviour EndGame(Enums.GameResult.Lose); }); break; + case Constants.MultiplayManagerState.ReceiveTimeout: + Debug.Log("상대방이 타임 아웃 됨"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Win); + EndGame(Enums.GameResult.Win); + }); + break; } ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB"); diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs index c5a8eab..445dfa5 100644 --- a/Assets/Script/Game/MultiplayManager.cs +++ b/Assets/Script/Game/MultiplayManager.cs @@ -90,6 +90,7 @@ public class MultiplayManager : IDisposable _socket.On("doOpponent", DoOpponent); _socket.On("doSurrender", DoSurrender); _socket.On("surrenderConfirmed", SurrenderConfirmed); + _socket.On("receiveTimeout", ReceiveTimeout); _socket.Connect(); } @@ -218,6 +219,30 @@ public class MultiplayManager : IDisposable _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.SurrenderConfirmed, data.message); } + /// + /// 타임 아웃 요청 + /// + public void SendTimeout() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("LeaveRoom 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("sendTimeout",new { roomId = _roomId }); + } + + /// + /// 타임 아웃 수신 + /// + /// + private void ReceiveTimeout(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.ReceiveTimeout, data.message); + } + public void Dispose() { if (_socket != null) From 9ffb563353a4d9b9b095b9a26c99f0dc484de7ac Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Thu, 27 Mar 2025 13:57:35 +0900 Subject: [PATCH 12/15] =?UTF-8?q?DO-70=20[Feat]=20=EC=8B=B1=EA=B8=80?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=20=EB=B3=80=ED=99=98=20=EC=8B=9C=20?= =?UTF-8?q?=EC=8B=B1=EA=B8=80=ED=94=8C=EB=A0=88=EC=9D=B4=EB=A1=9C=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=ED=83=80=EC=9E=85=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Game/GameLogic.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index 5ce6e83..55e2602 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -522,6 +522,7 @@ public class GameLogic : MonoBehaviour // 기존 멀티플레이 상태 초기화 _multiplayManager = null; _roomId = null; + gameType = Enums.GameType.SinglePlay; // 싱글 플레이 상태로 변경 firstPlayerState = new PlayerState(true); From fb7a3c40a1ea845c0be2b6a4e2f8aea330b54c09 Mon Sep 17 00:00:00 2001 From: Jay <96156114+jaydev00a@users.noreply.github.com> Date: Thu, 27 Mar 2025 14:08:52 +0900 Subject: [PATCH 13/15] =?UTF-8?q?DO-70=20[Feat]=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=ED=95=98=EC=97=AC=20=EC=8B=B1?= =?UTF-8?q?=EA=B8=80=20=ED=94=8C=EB=A0=88=EC=9D=B4=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Script/Game/GameLogic.cs | 41 +++++++++++---------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index 55e2602..61f7e79 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -278,39 +278,24 @@ public class GameLogic : MonoBehaviour //timer 시간초과시 진행 함수 this.fioTimer.OnTimeout = () => { - if (gameType == Enums.GameType.MultiPlay) - { - // 현재 턴의 플레이어가 로컬(유저)인지 확인 - bool isCurrentPlayerLocal = (currentTurn == Enums.PlayerType.PlayerA && firstPlayerState is PlayerState) || - (currentTurn == Enums.PlayerType.PlayerB && secondPlayerState is PlayerState); + // 현재 턴의 플레이어가 로컬(유저)인지 확인 + bool isCurrentPlayerLocal = (currentTurn == Enums.PlayerType.PlayerA && firstPlayerState is PlayerState) || + (currentTurn == Enums.PlayerType.PlayerB && secondPlayerState is PlayerState); - if (isCurrentPlayerLocal) // 내가 타임 오버일 때 + if (isCurrentPlayerLocal) // 내가 타임 오버일 때 + { + if (this.gameType == Enums.GameType.MultiPlay) // 멀티플레이인 경우 { _multiplayManager?.SendTimeout(); - GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Lose); - EndGame(Enums.GameResult.Lose); - } - else // 로컬에서 자신의 타이머 기준으로 상대방이 타임 오버일 때 - { - // TODO: 컨펌 패널 OK 버튼 삭제? - GameManager.Instance.panelManager.OpenConfirmPanel("상대방의 응답을 기다리는 중입니다", - () => { } ); } + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Lose); + EndGame(Enums.GameResult.Lose); } - else + else // 로컬에서 자신의 타이머 기준으로 상대방이 타임 오버일 때 { - if (currentTurn == Enums.PlayerType.PlayerA) - { - GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {Enums.PlayerType.PlayerB} Win", - () => { }); - EndGame(Enums.GameResult.Lose); - } - else if (currentTurn == Enums.PlayerType.PlayerB) - { - GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {Enums.PlayerType.PlayerA} Win", - () => { }); - EndGame(Enums.GameResult.Win); - } + // TODO: 컨펌 패널 OK 버튼 삭제? + GameManager.Instance.panelManager.OpenConfirmPanel("상대방의 응답을 기다리는 중입니다", + () => { } ); } }; } @@ -522,7 +507,7 @@ public class GameLogic : MonoBehaviour // 기존 멀티플레이 상태 초기화 _multiplayManager = null; _roomId = null; - gameType = Enums.GameType.SinglePlay; + this.gameType = Enums.GameType.SinglePlay; // 싱글 플레이 상태로 변경 firstPlayerState = new PlayerState(true); From c07d6db69119afee72223cc765cfb8ad079018f2 Mon Sep 17 00:00:00 2001 From: Lim0_C Date: Thu, 27 Mar 2025 14:22:47 +0900 Subject: [PATCH 14/15] =?UTF-8?q?DO-46=20[Feat}=20=EB=A9=80=ED=8B=B0=20?= =?UTF-8?q?=EB=AC=B4=EC=8A=B9=EB=B6=80=20=EC=9A=94=EC=B2=AD=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/GameUIController.cs | 8 + .../Prefabs/Effects/Draw Effect Panel.prefab | 6 +- .../Prefabs/Effects/Lose Effect Panel.prefab | 6 +- .../Prefabs/Effects/Win Effect Panel.prefab | 6 +- .../Prefabs/Panels/Draw Confirm Panel.prefab | 852 ++++++++++++++++++ .../Panels/Draw Confirm Panel.prefab.meta | 7 + .../Prefabs/Panels/Main Panel.prefab | 6 +- .../Resources/Prefabs/[Canvas] Game UI.prefab | 10 +- Assets/Script/Common/Constants.cs | 8 +- Assets/Script/Game/GameLogic.cs | 40 + Assets/Script/Game/MultiplayManager.cs | 78 ++ .../DrawConfirmPanelController.cs | 39 + .../DrawConfirmPanelController.cs.meta | 11 + .../Script/UI/PanelController/PanelManager.cs | 12 + 14 files changed, 1071 insertions(+), 18 deletions(-) create mode 100644 Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab create mode 100644 Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab.meta create mode 100644 Assets/Script/UI/PanelController/DrawConfirmPanelController.cs create mode 100644 Assets/Script/UI/PanelController/DrawConfirmPanelController.cs.meta diff --git a/Assets/GameUIController.cs b/Assets/GameUIController.cs index 14d15b5..423b1df 100644 --- a/Assets/GameUIController.cs +++ b/Assets/GameUIController.cs @@ -46,6 +46,14 @@ public class GameUIController : MonoBehaviour }); } + public void OnClickDrawRequestButton() + { + GameManager.Instance.panelManager.OpenConfirmPanel("무승부 신청을 하시겠습니까?", () => + { + _multiplayManager.RequestDraw(); + }); + } + public void OnClickSettingsButton() { GameManager.Instance.panelManager.OpenSettingsPanel(); diff --git a/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab b/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab index c1d50fe..de8681f 100644 --- a/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab +++ b/Assets/Resources/Prefabs/Effects/Draw Effect Panel.prefab @@ -527,7 +527,7 @@ GameObject: - component: {fileID: 8635639988778983738} - component: {fileID: 4545556044007292713} - component: {fileID: 6152865991947934791} - - component: {fileID: 3813612584874639807} + - component: {fileID: -2390623514170132953} m_Layer: 5 m_Name: Draw Effect Panel m_TagString: Untagged @@ -576,7 +576,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0.5882353} + m_Color: {r: 0, g: 0, b: 0, a: 0.74509805} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -625,7 +625,7 @@ MonoBehaviour: tigerOpenEyes: {fileID: 1508819185250841244} tigerCloseEyes: {fileID: 399504369641388738} flipDuration: 0.3 ---- !u!61 &3813612584874639807 +--- !u!61 &-2390623514170132953 BoxCollider2D: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} diff --git a/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab b/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab index d845fd9..23d30fc 100644 --- a/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab +++ b/Assets/Resources/Prefabs/Effects/Lose Effect Panel.prefab @@ -450,7 +450,7 @@ GameObject: - component: {fileID: 8635639988778983738} - component: {fileID: 4545556044007292713} - component: {fileID: 3229800624310508893} - - component: {fileID: 6984539173991577744} + - component: {fileID: -8338910938938253639} m_Layer: 5 m_Name: Lose Effect Panel m_TagString: Untagged @@ -500,7 +500,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0.5882353} + m_Color: {r: 0, g: 0, b: 0, a: 0.74509805} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -547,7 +547,7 @@ MonoBehaviour: characterOpenEyes: {fileID: 1632927645355555415} characterCloseEyes: {fileID: 3881260292094838299} depressedEffect: {fileID: 155037671892554820} ---- !u!61 &6984539173991577744 +--- !u!61 &-8338910938938253639 BoxCollider2D: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} diff --git a/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab b/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab index 75a7c3f..da4c3e8 100644 --- a/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab +++ b/Assets/Resources/Prefabs/Effects/Win Effect Panel.prefab @@ -788,7 +788,7 @@ GameObject: - component: {fileID: 8635639988778983738} - component: {fileID: 3127148509640414758} - component: {fileID: 4545556044007292713} - - component: {fileID: 7229651074095795597} + - component: {fileID: -8628578634938139601} m_Layer: 5 m_Name: Win Effect Panel m_TagString: Untagged @@ -838,7 +838,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0.5882353} + m_Color: {r: 0, g: 0, b: 0, a: 0.74509805} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -891,7 +891,7 @@ CanvasGroup: m_Interactable: 1 m_BlocksRaycasts: 1 m_IgnoreParentGroups: 0 ---- !u!61 &7229651074095795597 +--- !u!61 &-8628578634938139601 BoxCollider2D: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} diff --git a/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab b/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab new file mode 100644 index 0000000..e943069 --- /dev/null +++ b/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab @@ -0,0 +1,852 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1788897315818053684 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7542555801726495289} + - component: {fileID: 2282488759583336750} + - component: {fileID: 773857893073654059} + m_Layer: 5 + m_Name: Messege Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7542555801726495289 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788897315818053684} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1049729465715420315} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 38} + m_SizeDelta: {x: 480, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2282488759583336750 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788897315818053684} + m_CullTransparentMesh: 1 +--- !u!114 &773857893073654059 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1788897315818053684} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: messege text + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} + m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &2317228258542092256 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 965302526599391686} + - component: {fileID: 8494676347912440962} + - component: {fileID: 1257633341820217709} + - component: {fileID: 1753961836956471979} + m_Layer: 5 + m_Name: Yes Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &965302526599391686 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2317228258542092256} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1946490149580320571} + m_Father: {fileID: 1049729465715420315} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -100, y: -120} + m_SizeDelta: {x: 140, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8494676347912440962 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2317228258542092256} + m_CullTransparentMesh: 1 +--- !u!114 &1257633341820217709 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2317228258542092256} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0.9607844, b: 0.8980393, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 05a670e614d7817429ee256ceb7efbe6, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1753961836956471979 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2317228258542092256} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 2 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 21300000, guid: 1cc2af2fc6476554ca42fb2ddfd7727f, type: 3} + m_PressedSprite: {fileID: 21300000, guid: 1cc2af2fc6476554ca42fb2ddfd7727f, type: 3} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1257633341820217709} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 4442644643121240978} + m_TargetAssemblyTypeName: DrawConfirmPanelController, Assembly-CSharp + m_MethodName: OnClickConfirmButton + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &3698158704839373389 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9064896642958720613} + - component: {fileID: 2999493526827262555} + - component: {fileID: 7391042004064192362} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &9064896642958720613 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3698158704839373389} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 985363981920635096} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 7.5} + m_SizeDelta: {x: 0, y: -15} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2999493526827262555 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3698158704839373389} + m_CullTransparentMesh: 1 +--- !u!114 &7391042004064192362 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3698158704839373389} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\uC544\uB2C8\uC694" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} + m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &4661890517030743811 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1946490149580320571} + - component: {fileID: 3931044922440075362} + - component: {fileID: 555572636850183268} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1946490149580320571 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4661890517030743811} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 965302526599391686} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 7.4999886} + m_SizeDelta: {x: 0, y: -15.000023} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3931044922440075362 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4661890517030743811} + m_CullTransparentMesh: 1 +--- !u!114 &555572636850183268 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4661890517030743811} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\uC608" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} + m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &8145365568262946399 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5614572128744664879} + - component: {fileID: 3728636385802151783} + - component: {fileID: 3609920769045485995} + - component: {fileID: 949980890983110046} + - component: {fileID: 4442644643121240978} + m_Layer: 5 + m_Name: Draw Confirm Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5614572128744664879 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8145365568262946399} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1049729465715420315} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3728636385802151783 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8145365568262946399} + m_CullTransparentMesh: 1 +--- !u!114 &3609920769045485995 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8145365568262946399} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.74509805} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!225 &949980890983110046 +CanvasGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8145365568262946399} + m_Enabled: 1 + m_Alpha: 1 + m_Interactable: 1 + m_BlocksRaycasts: 1 + m_IgnoreParentGroups: 0 +--- !u!114 &4442644643121240978 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8145365568262946399} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1ebb6563d04ba2b44b06891880cbe0b6, type: 3} + m_Name: + m_EditorClassIdentifier: + panelRectTransform: {fileID: 1049729465715420315} + messageText: {fileID: 773857893073654059} +--- !u!1 &8611399693750823341 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1049729465715420315} + - component: {fileID: 6012768702964141829} + - component: {fileID: 5029524648726594707} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1049729465715420315 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8611399693750823341} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7542555801726495289} + - {fileID: 965302526599391686} + - {fileID: 985363981920635096} + m_Father: {fileID: 5614572128744664879} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 600, y: 400} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6012768702964141829 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8611399693750823341} + m_CullTransparentMesh: 1 +--- !u!114 &5029524648726594707 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8611399693750823341} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: e89f6694961e7574b98368e14934a8b1, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8664974708086771355 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 985363981920635096} + - component: {fileID: 6738990646649674804} + - component: {fileID: 4523293559331202638} + - component: {fileID: 3091834035832018361} + m_Layer: 5 + m_Name: No Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &985363981920635096 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8664974708086771355} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 9064896642958720613} + m_Father: {fileID: 1049729465715420315} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 100, y: -120} + m_SizeDelta: {x: 140, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6738990646649674804 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8664974708086771355} + m_CullTransparentMesh: 1 +--- !u!114 &4523293559331202638 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8664974708086771355} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0.9607844, b: 0.8980393, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 05a670e614d7817429ee256ceb7efbe6, type: 3} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &3091834035832018361 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8664974708086771355} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 2 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 21300000, guid: 1cc2af2fc6476554ca42fb2ddfd7727f, type: 3} + m_PressedSprite: {fileID: 21300000, guid: 1cc2af2fc6476554ca42fb2ddfd7727f, type: 3} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4523293559331202638} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 4442644643121240978} + m_TargetAssemblyTypeName: DrawConfirmPanelController, Assembly-CSharp + m_MethodName: OnClickCloseButton + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 diff --git a/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab.meta b/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab.meta new file mode 100644 index 0000000..5ca8bf0 --- /dev/null +++ b/Assets/Resources/Prefabs/Panels/Draw Confirm Panel.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a498b5b3f7af42d4d974507473a6f8a0 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Prefabs/Panels/Main Panel.prefab b/Assets/Resources/Prefabs/Panels/Main Panel.prefab index ca0fdef..72c53db 100644 --- a/Assets/Resources/Prefabs/Panels/Main Panel.prefab +++ b/Assets/Resources/Prefabs/Panels/Main Panel.prefab @@ -1457,7 +1457,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &405965270916774547 RectTransform: m_ObjectHideFlags: 0 @@ -1713,7 +1713,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: "\uD654\uB791\uB098\uBE44" + m_text: tester m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2} @@ -1799,7 +1799,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &8172929902404983356 RectTransform: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Prefabs/[Canvas] Game UI.prefab b/Assets/Resources/Prefabs/[Canvas] Game UI.prefab index 1be1e23..294c097 100644 --- a/Assets/Resources/Prefabs/[Canvas] Game UI.prefab +++ b/Assets/Resources/Prefabs/[Canvas] Game UI.prefab @@ -36,7 +36,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 50, y: -85} + m_AnchoredPosition: {x: 50, y: -20} m_SizeDelta: {x: 238, y: 150} m_Pivot: {x: 0, y: 1} --- !u!222 &4747539784995484548 @@ -338,7 +338,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: "\uC7AC\uB300\uACB0" + m_text: "\uBB34\uC2B9\uBD80" m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2} @@ -789,7 +789,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &3928015243027423495 RectTransform: m_ObjectHideFlags: 0 @@ -807,7 +807,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 50, y: -85} + m_AnchoredPosition: {x: 50, y: -170} m_SizeDelta: {x: 238, y: 150} m_Pivot: {x: 0, y: 1} --- !u!222 &3058652260737614200 @@ -894,7 +894,7 @@ MonoBehaviour: m_Calls: - m_Target: {fileID: 3933575647777291622} m_TargetAssemblyTypeName: GameUIController, Assembly-CSharp - m_MethodName: OnClickRetryButton + m_MethodName: OnClickDrawRequestButton m_Mode: 1 m_Arguments: m_ObjectArgument: {fileID: 0} diff --git a/Assets/Script/Common/Constants.cs b/Assets/Script/Common/Constants.cs index 328ac54..2d5966a 100644 --- a/Assets/Script/Common/Constants.cs +++ b/Assets/Script/Common/Constants.cs @@ -18,6 +18,12 @@ ExitRoom, // 자신이 방을 빠져 나왔을 때 EndGame, // 상대방이 접속을 끊거나 방을 나갔을 때 DoSurrender, // 상대방이 항복했을 때 - SurrenderConfirmed // 항복 요청이 성공적으로 전송되었을 때 + SurrenderConfirmed, // 항복 요청이 성공적으로 전송되었을 때 + ReceiveDrawRequest, + DrawRequestSent, + DrawAccepted, + DrawConfirmed, + DrawRejected, + DrawRejectionConfirmed }; } \ No newline at end of file diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index fb5afb7..625bdab 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -461,6 +461,46 @@ public class GameLogic : MonoBehaviour GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Lose); EndGame(Enums.GameResult.Lose); }); + break; + case Constants.MultiplayManagerState.ReceiveDrawRequest: + Debug.Log("상대방의 무승부 요청 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenDrawConfirmPanel("무승부 요청을 승락하시겠습니까?", () => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); + EndGame(Enums.GameResult.Draw); + _multiplayManager.AcceptDraw(); + }, () => + { + _multiplayManager.RejectDraw(); + }); + }); + break; + case Constants.MultiplayManagerState.DrawRequestSent: + Debug.Log("무승부 요청 전송 완료"); + break; + case Constants.MultiplayManagerState.DrawAccepted: + Debug.Log("무승부 요청이 승락이 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw); + EndGame(Enums.GameResult.Draw); + }); + break; + case Constants.MultiplayManagerState.DrawConfirmed: + Debug.Log("무승부 요청 승락 완료"); + break; + case Constants.MultiplayManagerState.DrawRejected: + Debug.Log("무승부 요청이 거부가 들어옴"); + UnityMainThreadDispatcher.Instance().Enqueue(() => + { + GameManager.Instance.panelManager.OpenConfirmPanel("무승부 요청을 거부하였습니다.", () => { }); + }); + break; + case Constants.MultiplayManagerState.DrawRejectionConfirmed: + Debug.Log("무승부 요청 거부 완료"); + break; } ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"nicknameB"); diff --git a/Assets/Script/Game/MultiplayManager.cs b/Assets/Script/Game/MultiplayManager.cs index c5a8eab..93cd65b 100644 --- a/Assets/Script/Game/MultiplayManager.cs +++ b/Assets/Script/Game/MultiplayManager.cs @@ -90,6 +90,12 @@ public class MultiplayManager : IDisposable _socket.On("doOpponent", DoOpponent); _socket.On("doSurrender", DoSurrender); _socket.On("surrenderConfirmed", SurrenderConfirmed); + _socket.On("receiveDrawRequest", ReceiveDrawRequest); + _socket.On("drawRequestSent", DrawRequestSent); + _socket.On("drawAccepted", DrawAccepted); + _socket.On("drawConfirmed", DrawConfirmed); + _socket.On("drawRejected", DrawRejected); + _socket.On("drawRejectionConfirmed", DrawRejectionConfirmed); _socket.Connect(); } @@ -218,6 +224,78 @@ public class MultiplayManager : IDisposable _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.SurrenderConfirmed, data.message); } + public void RequestDraw() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("requestDraw 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("requestDraw",new { roomId = _roomId }); + } + + private void ReceiveDrawRequest(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.ReceiveDrawRequest, data.message); + } + + private void DrawRequestSent(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRequestSent, data.message); + } + + public void AcceptDraw() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("acceptDraw 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("acceptDraw", new { roomId = _roomId }); + } + + private void DrawAccepted(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawAccepted, data.message); + } + + private void DrawConfirmed(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawConfirmed, data.message); + } + + public void RejectDraw() + { + if (string.IsNullOrEmpty(_roomId)) + { + Debug.LogError("rejectDraw 호출 실패: _roomId가 설정되지 않음"); + return; + } + _socket.Emit("rejectDraw", new { roomId = _roomId }); + } + + private void DrawRejected(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRejected, data.message); + } + + private void DrawRejectionConfirmed(SocketIOResponse response) + { + var data = response.GetValue(); + + _onMultiplayStateChanged?.Invoke(Constants.MultiplayManagerState.DrawRejectionConfirmed, data.message); + } + public void Dispose() { if (_socket != null) diff --git a/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs b/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs new file mode 100644 index 0000000..4ff1379 --- /dev/null +++ b/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs @@ -0,0 +1,39 @@ +using System.Collections; +using System.Collections.Generic; +using TMPro; +using UnityEngine; + +public class DrawConfirmPanelController : PanelController +{ + [SerializeField] private TMP_Text messageText; //자식 텍스트 변수 + + public delegate void OnConfirmButtonClick(); + private OnConfirmButtonClick onConfirmButtonClick; + + public delegate void OnContradictButtonClick(); + private OnContradictButtonClick onContradictButtonClick; + + public void Show(string message, OnConfirmButtonClick onConfirmButtonClick, OnContradictButtonClick onContradictButtonClick) + { + messageText.text = message; + this.onConfirmButtonClick = onConfirmButtonClick; + this.onContradictButtonClick = onContradictButtonClick; + base.Show(); + } + + /// + /// Confirm 버튼 클릭시 호출되는 함수 + /// + public void OnClickConfirmButton() + { + Hide(() => onConfirmButtonClick?.Invoke()); + } + + /// + /// X 버튼 클릭시 호출되는 함수 + /// + public void OnClickCloseButton() + { + Hide(() => onContradictButtonClick?.Invoke()); + } +} \ No newline at end of file diff --git a/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs.meta b/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs.meta new file mode 100644 index 0000000..66429a1 --- /dev/null +++ b/Assets/Script/UI/PanelController/DrawConfirmPanelController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ebb6563d04ba2b44b06891880cbe0b6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Script/UI/PanelController/PanelManager.cs b/Assets/Script/UI/PanelController/PanelManager.cs index 6aada1c..c8592d9 100644 --- a/Assets/Script/UI/PanelController/PanelManager.cs +++ b/Assets/Script/UI/PanelController/PanelManager.cs @@ -187,6 +187,18 @@ public class PanelManager : MonoBehaviour } } + public void OpenDrawConfirmPanel(string message, + DrawConfirmPanelController.OnConfirmButtonClick onConfirmButtonClick, + DrawConfirmPanelController.OnContradictButtonClick onContradictButtonClick) + { + if (_canvas != null) + { + var drawConfirmPanelObject = GetPanel("Draw Confirm Panel"); + drawConfirmPanelObject.GetComponent() + .Show(message, onConfirmButtonClick, onContradictButtonClick); + } + } + public void OpenSettingsPanel() { if (_canvas != null) From e4a83fc73e8d1e9aee5978be1c877190b14dbd39 Mon Sep 17 00:00:00 2001 From: Lim0_C Date: Thu, 27 Mar 2025 15:39:10 +0900 Subject: [PATCH 15/15] =?UTF-8?q?DO-46=20[Feat}=20=EB=AC=B4=EC=8A=B9?= =?UTF-8?q?=EB=B6=80=20=EC=9A=94=EC=B2=AD=20=ED=9A=9F=EC=88=98=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/GameUIController.cs | 14 +++++++++++--- Assets/Script/Game/GameLogic.cs | 11 +++++++++-- Assets/Script/Game/GameManager.cs | 14 +++++++++++++- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/Assets/GameUIController.cs b/Assets/GameUIController.cs index 423b1df..9ce3324 100644 --- a/Assets/GameUIController.cs +++ b/Assets/GameUIController.cs @@ -48,10 +48,18 @@ public class GameUIController : MonoBehaviour public void OnClickDrawRequestButton() { - GameManager.Instance.panelManager.OpenConfirmPanel("무승부 신청을 하시겠습니까?", () => + if (GameManager.Instance.GetRequestDrawChance()) { - _multiplayManager.RequestDraw(); - }); + GameManager.Instance.panelManager.OpenConfirmPanel("무승부 신청을 하시겠습니까?", () => + { + _multiplayManager.RequestDraw(); + }); + GameManager.Instance.SetRequestDrawChanceFalse(); + } + else + { + GameManager.Instance.panelManager.OpenConfirmPanel("무승부 요청이 제한돼있습니다.",()=>{}); + } } public void OnClickSettingsButton() diff --git a/Assets/Script/Game/GameLogic.cs b/Assets/Script/Game/GameLogic.cs index 4ecd89e..d2d0037 100644 --- a/Assets/Script/Game/GameLogic.cs +++ b/Assets/Script/Game/GameLogic.cs @@ -217,7 +217,7 @@ public class MultiPlayerState: BasePlayerState } } -public class GameLogic : MonoBehaviour +public class GameLogic : IDisposable { private Enums.PlayerType[,] _board; public StoneController stoneController; @@ -226,6 +226,12 @@ public class GameLogic : MonoBehaviour //총 착수된 돌 카운터 public int _totalStoneCounter; public int TotalStoneCounter{get{return _totalStoneCounter;}} + //무승부 요청 가능 여부 + private bool _requestDrawChance; + public bool RequestDrawChance{ + get { return _requestDrawChance;} + set { _requestDrawChance = value;} + } public BasePlayerState firstPlayerState; public BasePlayerState secondPlayerState; @@ -244,6 +250,7 @@ public class GameLogic : MonoBehaviour public MultiplayManager _multiplayManager; private string _roomId; + #region Renju Members // 렌주룰 금수 검사기 private RenjuForbiddenMoveDetector _forbiddenDetector; @@ -259,6 +266,7 @@ public class GameLogic : MonoBehaviour this.stoneController = stoneController; this.gameType = gameType; _totalStoneCounter = 0; + RequestDrawChance = true; selectedRow = -1; selectedCol = -1; @@ -539,7 +547,6 @@ public class GameLogic : MonoBehaviour return AI_NAMIES[index]; } - public void SwitchToSinglePlayer() { _multiplayManager?.Dispose(); diff --git a/Assets/Script/Game/GameManager.cs b/Assets/Script/Game/GameManager.cs index 90bacf5..b2dca0b 100644 --- a/Assets/Script/Game/GameManager.cs +++ b/Assets/Script/Game/GameManager.cs @@ -90,13 +90,13 @@ public class GameManager : Singleton _camera = GameObject.FindObjectOfType().gameObject; _gameUIController = GameObject.FindObjectOfType(); _gameLogic = new GameLogic(_stoneController, _gameType, fioTimer); - } InitPanels(); } //임시 재시작 재대결 public void RetryGame() { + if (_gameLogic == null) return; _gameLogic.ResetBoard(); _stoneController.InitStones(); _gameLogic.SetState(_gameLogic.firstPlayerState); @@ -119,4 +119,16 @@ public class GameManager : Singleton if (_gameUIController == null) return; _gameUIController.SetTurnIndicator(isFirstPlayer); } + + public bool GetRequestDrawChance() + { + if (_gameLogic == null){ return false;} + return _gameLogic.RequestDrawChance; + } + + public void SetRequestDrawChanceFalse() + { + if (_gameLogic == null) return; + _gameLogic.RequestDrawChance = false; + } } \ No newline at end of file