Merge pull request #52 from Degulleo/DO-46-게임-씬-보조-기능-추가

Do 46 게임 씬 보조 기능 추가
This commit is contained in:
Lim0_C 2025-03-26 10:53:29 +09:00 committed by GitHub
commit 94dc86f644
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 115 additions and 58 deletions

View File

@ -17,6 +17,7 @@ public class GameUIController : MonoBehaviour
[SerializeField] private Image profileImageB; [SerializeField] private Image profileImageB;
[SerializeField] private Sprite[] profileImageSprites; //0. 기본 드래곤 1. 기본 호랑이 2.아이보리 드래곤 3. 아이보리 호랑이 [SerializeField] private Sprite[] profileImageSprites; //0. 기본 드래곤 1. 기본 호랑이 2.아이보리 드래곤 3. 아이보리 호랑이
[SerializeField] private Sprite[] indicatorSprites; //0. active 1. inactive [SerializeField] private Sprite[] indicatorSprites; //0. active 1. inactive
private Sprite _originalSpriteA; private Sprite _originalSpriteA;
private Sprite _originalSpriteB; private Sprite _originalSpriteB;
@ -45,14 +46,7 @@ public class GameUIController : MonoBehaviour
{ {
GameManager.Instance.panelManager.OpenSettingsPanel(); GameManager.Instance.panelManager.OpenSettingsPanel();
} }
public void InitUI()
{
if (UserManager.Instance == null) return;
retryButton.SetActive(false);
playerANameText.text = UserManager.Instance.Nickname;
}
public void InitPlayersName(string playerNameA, string playerNameB) public void InitPlayersName(string playerNameA, string playerNameB)
{ {
playerANameText.text = playerNameA; playerANameText.text = playerNameA;

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: b8e3d5d18e544774eb144db419a327d2 guid: ded4103a87c2de84db5f4ce2675227ef
DefaultImporter: DefaultImporter:
externalObjects: {} externalObjects: {}
userData: userData:

View File

@ -575,7 +575,7 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
m_Material: {fileID: 0} m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0} m_Color: {r: 0, g: 0, b: 0, a: 0.5882353}
m_RaycastTarget: 1 m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1 m_Maskable: 1
@ -618,10 +618,9 @@ MonoBehaviour:
m_EditorClassIdentifier: m_EditorClassIdentifier:
bannerObj: {fileID: 7291411618834705046} bannerObj: {fileID: 7291411618834705046}
bannerText: {fileID: 5108301403921453943} bannerText: {fileID: 5108301403921453943}
interval: 0.1
dragonOpenEyes: {fileID: 3881260292094838299} dragonOpenEyes: {fileID: 3881260292094838299}
dragonCloseEyes: {fileID: 6707373289257723271} dragonCloseEyes: {fileID: 6707373289257723271}
tigerOpenEyes: {fileID: 1508819185250841244} tigerOpenEyes: {fileID: 1508819185250841244}
tigerCloseEyes: {fileID: 399504369641388738} tigerCloseEyes: {fileID: 399504369641388738}
fullText: "\uBB34\uC2B9\uBD80 \uC785\uB2C8\uB2E4"
interval: 0.1
flipDuration: 0.3 flipDuration: 0.3

View File

@ -499,7 +499,7 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
m_Material: {fileID: 0} m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0} m_Color: {r: 0, g: 0, b: 0, a: 0.5882353}
m_RaycastTarget: 1 m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1 m_Maskable: 1
@ -542,8 +542,7 @@ MonoBehaviour:
m_EditorClassIdentifier: m_EditorClassIdentifier:
bannerObj: {fileID: 7291411618834705046} bannerObj: {fileID: 7291411618834705046}
bannerText: {fileID: 5108301403921453943} bannerText: {fileID: 5108301403921453943}
interval: 0.1
characterOpenEyes: {fileID: 1632927645355555415} characterOpenEyes: {fileID: 1632927645355555415}
characterCloseEyes: {fileID: 3881260292094838299} characterCloseEyes: {fileID: 3881260292094838299}
depressedEffect: {fileID: 155037671892554820} depressedEffect: {fileID: 155037671892554820}
fullText: "\uD328\uBC30\uD588\uC2B5\uB2C8\uB2E4"
interval: 0.1

View File

@ -837,7 +837,7 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
m_Material: {fileID: 0} m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 0} m_Color: {r: 0, g: 0, b: 0, a: 0.5882353}
m_RaycastTarget: 1 m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1 m_Maskable: 1
@ -866,6 +866,9 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 9b132148519758c42824252ec9a2d3a4, type: 3} m_Script: {fileID: 11500000, guid: 9b132148519758c42824252ec9a2d3a4, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
bannerObj: {fileID: 0}
bannerText: {fileID: 5108301403921453943}
interval: 0.1
haloEffectImg: {fileID: 376994097320605198} haloEffectImg: {fileID: 376994097320605198}
characterImg: {fileID: 3881260292094838299} characterImg: {fileID: 3881260292094838299}
shineEffectImg: shineEffectImg:
@ -875,9 +878,6 @@ MonoBehaviour:
circleEffectImg: circleEffectImg:
- {fileID: 1661063685800461951} - {fileID: 1661063685800461951}
- {fileID: 5812078995592861983} - {fileID: 5812078995592861983}
bannerText: {fileID: 5108301403921453943}
fullText: "\uC2B9\uB9AC\uD588\uC2B5\uB2C8\uB2E4!"
interval: 0.1
--- !u!225 &4545556044007292713 --- !u!225 &4545556044007292713
CanvasGroup: CanvasGroup:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -1713,7 +1713,7 @@ MonoBehaviour:
m_OnCullStateChanged: m_OnCullStateChanged:
m_PersistentCalls: m_PersistentCalls:
m_Calls: [] m_Calls: []
m_text: "\uD638\uB7AD\uC774" m_text: "\uD654\uB791\uB098\uBE44"
m_isRightToLeft: 0 m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2} m_fontAsset: {fileID: 11400000, guid: 85a19688db53c77469fc4406b01045da, type: 2}
m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2} m_sharedMaterial: {fileID: -2477908578676791210, guid: 85a19688db53c77469fc4406b01045da, type: 2}

View File

@ -328,7 +328,7 @@ Camera:
m_Enabled: 1 m_Enabled: 1
serializedVersion: 2 serializedVersion: 2
m_ClearFlags: 1 m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} m_BackGroundColor: {r: 0.5372549, g: 0.654902, b: 0.5803922, a: 1}
m_projectionMatrixMode: 1 m_projectionMatrixMode: 1
m_GateFitMode: 2 m_GateFitMode: 2
m_FOVAxisMode: 0 m_FOVAxisMode: 0

View File

@ -9,8 +9,6 @@
public const int MinCountForDrawCheck = 150; public const int MinCountForDrawCheck = 150;
public const int RAING_POINTS = 10; public const int RAING_POINTS = 10;
public string[] AI_NAMIES = { "이세돌", "신사동호랭이","진짜인간임","종로3가짱돌","마스터김춘배","62세황순자","고준일 강사님"};
public enum MultiplayManagerState public enum MultiplayManagerState
{ {
CreateRoom, // 방 생성 CreateRoom, // 방 생성

View File

@ -4,6 +4,7 @@ using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.SceneManagement; using UnityEngine.SceneManagement;
using PimDeWitte.UnityMainThreadDispatcher; using PimDeWitte.UnityMainThreadDispatcher;
using Random = UnityEngine.Random;
public abstract class BasePlayerState public abstract class BasePlayerState
{ {
@ -21,11 +22,9 @@ public abstract class BasePlayerState
if (gameLogic.CheckGameWin(playerType, row, col)) if (gameLogic.CheckGameWin(playerType, row, col))
{ {
GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: {playerType} Win", () => var gameResult = playerType == Enums.PlayerType.PlayerA? Enums.GameResult.Win:Enums.GameResult.Lose;
{ GameManager.Instance.panelManager.OpenEffectPanel(gameResult);
var gameResult = playerType == Enums.PlayerType.PlayerA? Enums.GameResult.Win:Enums.GameResult.Lose; gameLogic.EndGame(gameResult);
gameLogic.EndGame(gameResult);
});
} }
else else
{ {
@ -33,10 +32,8 @@ public abstract class BasePlayerState
{ {
if (gameLogic.CheckGameDraw()) if (gameLogic.CheckGameDraw())
{ {
GameManager.Instance.panelManager.OpenConfirmPanel($"Game Over: Draw", () => GameManager.Instance.panelManager.OpenEffectPanel(Enums.GameResult.Draw);
{ gameLogic.EndGame(Enums.GameResult.Draw);
gameLogic.EndGame(Enums.GameResult.Draw);
});
} }
else else
{ {
@ -300,20 +297,24 @@ public class GameLogic : MonoBehaviour
switch (gameType) switch (gameType)
{ {
// TODO: 현재 싱글 플레이로 바로 넘어가지 않기 때문에 미사용 중 // TODO: 현재 싱글 플레이로 바로 넘어가지 않기 때문에 미사용 중
case Enums.GameType.SinglePlay: // case Enums.GameType.SinglePlay:
firstPlayerState = new PlayerState(true); // firstPlayerState = new PlayerState(true);
secondPlayerState = new AIState(); // secondPlayerState = new AIState();
// AI 난이도 설정(급수 설정) // // AI 난이도 설정(급수 설정)
OmokAI.Instance.SetRating(UserManager.Instance.Rating); // OmokAI.Instance.SetRating(UserManager.Instance.Rating);
//
//유저 이름 사진 초기화 // //AI닉네임 랜덤생성
GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, "AIPlayer"); // var aiName = RandomAINickname();
GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, 1); // var imageIndex = UnityEngine.Random.Range(0, 2);
//
ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,"PlayerAI", UserManager.Instance.imageIndex, 1); // //유저 이름 사진 초기화
// GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, aiName);
SetState(firstPlayerState); // GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, imageIndex);
break; //
// ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,aiName, UserManager.Instance.imageIndex, imageIndex);
//
// SetState(firstPlayerState);
// break;
case Enums.GameType.MultiPlay: case Enums.GameType.MultiPlay:
// 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요
UnityMainThreadDispatcher.Instance().Enqueue(() => UnityMainThreadDispatcher.Instance().Enqueue(() =>
@ -421,6 +422,17 @@ public class GameLogic : MonoBehaviour
} }
} }
//AI닉네임 랜덤 생성
private string RandomAINickname()
{
string[] AI_NAMIES = { "이세돌", "신사동호랭이","진짜인간임","종로3가짱돌","마스터김춘배","62세황순자","고준일 강사님"};
var index = UnityEngine.Random.Range(0, AI_NAMIES.Length);
return AI_NAMIES[index];
}
public void SwitchToSinglePlayer() public void SwitchToSinglePlayer()
{ {
_multiplayManager?.Dispose(); _multiplayManager?.Dispose();
@ -434,18 +446,22 @@ public class GameLogic : MonoBehaviour
secondPlayerState = new AIState(); secondPlayerState = new AIState();
// AI 난이도 설정(급수 설정) // AI 난이도 설정(급수 설정)
OmokAI.Instance.SetRating(UserManager.Instance.Rating); OmokAI.Instance.SetRating(UserManager.Instance.Rating);
//AI닉네임 랜덤생성
var aiName = RandomAINickname();
var imageIndex = UnityEngine.Random.Range(0, 2);
// 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요 // 메인 스레드에서 실행 - UI 업데이트는 메인 스레드에서 실행 필요
UnityMainThreadDispatcher.Instance().Enqueue(() => UnityMainThreadDispatcher.Instance().Enqueue(() =>
{ {
// 스레드 확인 로그: 추후 디버깅 시 필요할 수 있을 것 같아 남겨둡니다 // 스레드 확인 로그: 추후 디버깅 시 필요할 수 있을 것 같아 남겨둡니다
// Debug.Log($"[UnityMainThreadDispatcher] 실행 스레드: {System.Threading.Thread.CurrentThread.ManagedThreadId}"); // Debug.Log($"[UnityMainThreadDispatcher] 실행 스레드: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
// UI 업데이트
GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, "AIPlayer"); //유저 이름 사진 초기화
GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, 1); GameManager.Instance.InitPlayersName(UserManager.Instance.Nickname, aiName);
GameManager.Instance.InitProfileImages(UserManager.Instance.imageIndex, imageIndex);
// 리플레이 데이터 업데이트 // 리플레이 데이터 업데이트
ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname, "PlayerAI", UserManager.Instance.imageIndex, 1); ReplayManager.Instance.InitReplayData(UserManager.Instance.Nickname,aiName, UserManager.Instance.imageIndex, imageIndex);
// 로딩 패널 열려있으면 닫기 // 로딩 패널 열려있으면 닫기
GameManager.Instance.panelManager.CloseLoadingPanel(); GameManager.Instance.panelManager.CloseLoadingPanel();
@ -564,7 +580,6 @@ public class GameLogic : MonoBehaviour
SetState(null); SetState(null);
ReplayManager.Instance.SaveReplayDataResult(result); ReplayManager.Instance.SaveReplayDataResult(result);
//TODO: 게임 종료 후 행동 구현 //TODO: 게임 종료 후 행동 구현
SceneManager.LoadScene("Main");
} }
//승리 확인 함수 //승리 확인 함수

View File

@ -11,7 +11,7 @@ public class GameManager : Singleton<GameManager>
private Enums.GameType _gameType; private Enums.GameType _gameType;
private GameLogic _gameLogic; private GameLogic _gameLogic;
private StoneController _stoneController; private StoneController _stoneController;
private GameObject _omokBoardImage; private GameObject _camera;
private GameUIController _gameUIController; private GameUIController _gameUIController;
[SerializeField] private GameObject panelManagerPrefab; [SerializeField] private GameObject panelManagerPrefab;
@ -46,10 +46,12 @@ public class GameManager : Singleton<GameManager>
} }
else else
{ {
if (_stoneController != null && _omokBoardImage != null) if (_camera != null)
{ {
_stoneController.GetComponent<Transform>().DOShakePosition(0.5f, 0.5f); _camera.transform.DOShakePosition(0.5f, 0.5f).OnComplete(() =>
_omokBoardImage.GetComponent<Transform>().DOShakePosition(0.5f, 0.5f); {
_camera.transform.position = new Vector3(0,0,-10);
});
} }
} }
} }
@ -76,7 +78,7 @@ public class GameManager : Singleton<GameManager>
_stoneController = GameObject.FindObjectOfType<StoneController>(); _stoneController = GameObject.FindObjectOfType<StoneController>();
_stoneController.InitStones(); _stoneController.InitStones();
var fioTimer = FindObjectOfType<FioTimer>(); var fioTimer = FindObjectOfType<FioTimer>();
_omokBoardImage = GameObject.FindObjectOfType<SpriteRenderer>().gameObject; _camera = GameObject.FindObjectOfType<Camera>().gameObject;
_gameUIController = GameObject.FindObjectOfType<GameUIController>(); _gameUIController = GameObject.FindObjectOfType<GameUIController>();
_gameLogic = new GameLogic(_stoneController, _gameType, fioTimer); _gameLogic = new GameLogic(_stoneController, _gameType, fioTimer);

View File

@ -17,6 +17,7 @@ public class PanelManager : MonoBehaviour
private GameObject loadingPanelObject; private GameObject loadingPanelObject;
private Dictionary<string, GameObject> panelPrefabs = new Dictionary<string, GameObject>(); private Dictionary<string, GameObject> panelPrefabs = new Dictionary<string, GameObject>();
private Dictionary<string, GameObject> effectPanelPrefabs = new Dictionary<string, GameObject>();
private void Awake() private void Awake()
{ {
@ -28,6 +29,13 @@ public class PanelManager : MonoBehaviour
{ {
panelPrefabs[prefab.name] = prefab; panelPrefabs[prefab.name] = prefab;
} }
//게임결과 이펙트 패널
GameObject[] effectPrefabs = Resources.LoadAll<GameObject>("Prefabs/Effects");
foreach (GameObject effect in effectPrefabs)
{
effectPanelPrefabs[effect.name] = effect;
}
Debug.Log($"총 {panelPrefabs.Count}개의 패널이 로드됨."); Debug.Log($"총 {panelPrefabs.Count}개의 패널이 로드됨.");
} }
@ -53,6 +61,48 @@ public class PanelManager : MonoBehaviour
return null; return null;
} }
#region
public GameObject GetEffectPanel(string panelName)
{
if (effectPanelPrefabs.TryGetValue(panelName, out GameObject prefab))
{
return Instantiate(prefab, _canvas.transform);
}
else
{
Debug.LogError($"패널 '{panelName}'을 찾을 수 없습니다.");
}
return null;
}
public void OpenEffectPanel(Enums.GameResult gameResult)
{
switch (gameResult)
{
case Enums.GameResult.Win:
if (_canvas != null)
{
var winEffectPanelObject = GetEffectPanel("Win Effect Panel");
}
break;
case Enums.GameResult.Lose:
if (_canvas != null)
{
var winEffectPanelObject = GetEffectPanel("Lose Effect Panel");
}
break;
case Enums.GameResult.Draw:
if (_canvas != null)
{
var winEffectPanelObject = GetEffectPanel("Draw Effect Panel");
}
break;
}
}
#endregion
public void OpenMainPanel() public void OpenMainPanel()
{ {