From c17ec2c0a91a70dae74ff18425efeace7ef95f01 Mon Sep 17 00:00:00 2001 From: HaeinLEE Date: Sat, 10 May 2025 02:40:09 +0900 Subject: [PATCH] =?UTF-8?q?[Feat]=20=EB=8F=8C=EB=B0=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=20=EC=82=AC=EC=9A=B4=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EA=B7=B8=EB=A6=AC=EA=B3=A0=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/JAY/Scripts/PlayerController.cs | 2 +- Assets/LIN/Resources/OvertimeWork.mp3 | 3 + Assets/LIN/Resources/OvertimeWork.mp3.meta | 23 ++++++++ Assets/LIN/Resources/TeamGathering.mp3 | 3 + Assets/LIN/Resources/TeamGathering.mp3.meta | 23 ++++++++ .../DailyRoutine/InteractionController.cs | 31 +++++------ .../LIN/Scripts/UI/HousingCanvasController.cs | 24 +++++--- Assets/LIN/Scripts/UI/HousingConstants.cs | 29 +++++++++- .../Scripts/Common/GameUtility/GameSound.cs | 55 +++++++++++++++++++ 9 files changed, 164 insertions(+), 29 deletions(-) create mode 100644 Assets/LIN/Resources/OvertimeWork.mp3 create mode 100644 Assets/LIN/Resources/OvertimeWork.mp3.meta create mode 100644 Assets/LIN/Resources/TeamGathering.mp3 create mode 100644 Assets/LIN/Resources/TeamGathering.mp3.meta diff --git a/Assets/JAY/Scripts/PlayerController.cs b/Assets/JAY/Scripts/PlayerController.cs index 14b2319b..086d0b03 100644 --- a/Assets/JAY/Scripts/PlayerController.cs +++ b/Assets/JAY/Scripts/PlayerController.cs @@ -73,7 +73,7 @@ public class PlayerController : CharacterBase, IObserver _isBattle = !isHousingScene; Debug.Log("_isBattle: " + _isBattle);*/ - SwitchBattleMode(); + // SwitchBattleMode(); } private void Update() diff --git a/Assets/LIN/Resources/OvertimeWork.mp3 b/Assets/LIN/Resources/OvertimeWork.mp3 new file mode 100644 index 00000000..dcef9bd1 --- /dev/null +++ b/Assets/LIN/Resources/OvertimeWork.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4310396c1e8d49034500e133404bd740e2025fbc0351269a640c3300f489b47a +size 169272 diff --git a/Assets/LIN/Resources/OvertimeWork.mp3.meta b/Assets/LIN/Resources/OvertimeWork.mp3.meta new file mode 100644 index 00000000..f46cf0ea --- /dev/null +++ b/Assets/LIN/Resources/OvertimeWork.mp3.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 6142a6977f91d604d98880bdda758192 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LIN/Resources/TeamGathering.mp3 b/Assets/LIN/Resources/TeamGathering.mp3 new file mode 100644 index 00000000..0c09ff6c --- /dev/null +++ b/Assets/LIN/Resources/TeamGathering.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47138572c5bc5e2a2237c08408b5c2a26f57d719caf5342df71f41501f637a7c +size 446336 diff --git a/Assets/LIN/Resources/TeamGathering.mp3.meta b/Assets/LIN/Resources/TeamGathering.mp3.meta new file mode 100644 index 00000000..93cb2e64 --- /dev/null +++ b/Assets/LIN/Resources/TeamGathering.mp3.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 59471df5d383e88478a567ac9b1e83d4 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs b/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs index 8efea623..d9217d97 100644 --- a/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs +++ b/Assets/LIN/Scripts/DailyRoutine/InteractionController.cs @@ -88,33 +88,30 @@ public class InteractionController : MonoBehaviour return null; } - //퇴근 후 돌발 이벤트 + #region 퇴근 후 돌발 이벤트 + + //이벤트 발생 확률 계산기 private AfterWorkEventType SuddenEventCalculator() { var index = Random.Range(0, HousingConstants.AFTER_WORK_DENOMINATOR); return HousingConstants.AfterWorkEvents.GetValueOrDefault(index, AfterWorkEventType.None); } + // Interaction Controller와 같은 방식으로 작동됩니다. private void SuddenAfterWorkEventHappen() { AfterWorkEventType afterWorkEventType = SuddenEventCalculator(); - Debug.Log(afterWorkEventType); - if (afterWorkEventType == AfterWorkEventType.None) return; - switch (afterWorkEventType) - { - case AfterWorkEventType.OvertimeWork: - housingCanvasController.ShowSuddenEventPanel("부장님이 퇴근을 안하셔.. 야근할까?", () => - { - housingCanvasController.ShowSuddenEventImage(0); - //Todo: 스테이터스 변경 - }); - break; - case AfterWorkEventType.TeamGathering: - housingCanvasController.ShowSuddenEventPanel("갑자기 팀 회식이 잡혔다. 참석 하러 가자", - () => { housingCanvasController.ShowSuddenEventImage(1); }); - break; - } + HousingConstants.SuddenEventTexts.TryGetValue(afterWorkEventType, out string suddenEventText); + + housingCanvasController.ShowSuddenEventPanel(suddenEventText, () => + { + housingCanvasController.ShowSuddenEventImage(afterWorkEventType); + GameManager.Instance.PlaySuddenEventSound(afterWorkEventType); + }); } + + #endregion + } diff --git a/Assets/LIN/Scripts/UI/HousingCanvasController.cs b/Assets/LIN/Scripts/UI/HousingCanvasController.cs index a97366ee..d93c78a0 100644 --- a/Assets/LIN/Scripts/UI/HousingCanvasController.cs +++ b/Assets/LIN/Scripts/UI/HousingCanvasController.cs @@ -92,15 +92,22 @@ public class HousingCanvasController : MonoBehaviour OnSuddenButtonPressed?.Invoke(); } - public void ShowSuddenEventImage(int index) + public void ShowSuddenEventImage(AfterWorkEventType afterWorkEventType) { if (_autoHideCoroutine != null) StopCoroutine(_autoHideCoroutine); - - suddenEventImages[index].SetActive(true); + + switch (afterWorkEventType) + { + case AfterWorkEventType.OvertimeWork: + suddenEventImages[0].SetActive(true); + break; + case AfterWorkEventType.TeamGathering: + suddenEventImages[1].SetActive(true); + break; + } //사운드 재생 - _autoHideCoroutine = StartCoroutine(AutoHideSuddenImage()); - + _autoHideCoroutine = StartCoroutine(AutoHideSuddenImage(afterWorkEventType)); } public void HideSuddenEventImage() @@ -110,10 +117,10 @@ public class HousingCanvasController : MonoBehaviour image.SetActive(false); } } - private IEnumerator AutoHideSuddenImage() + private IEnumerator AutoHideSuddenImage(AfterWorkEventType afterWorkEventType) { float startTime = Time.time; - while (Time.time - startTime < 2.0f) + while (Time.time - startTime < HousingConstants.SUDDENEVENT_IAMGE_SHOW_TIME) { if (Input.touchCount > 0 || Input.GetMouseButtonDown(0)) { @@ -122,9 +129,10 @@ public class HousingCanvasController : MonoBehaviour yield return null; } - //패널 닫고 애니메이션 null처리 + //패널 닫고 효과음 끄기 HideSuddenEventImage(); HideSuddenEventPanel(); + GameManager.Instance.StopSuddenEventSound(afterWorkEventType); _autoHideCoroutine = null; } diff --git a/Assets/LIN/Scripts/UI/HousingConstants.cs b/Assets/LIN/Scripts/UI/HousingConstants.cs index 88ad2c0b..6f1e189d 100644 --- a/Assets/LIN/Scripts/UI/HousingConstants.cs +++ b/Assets/LIN/Scripts/UI/HousingConstants.cs @@ -15,7 +15,7 @@ public static class HousingConstants //돌발 이벤트 확률 계산 public static int AFTER_WORK_DENOMINATOR = 2; //돌발 이벤트 보여줄 시간 - public static float SUDDENEVENT_IAMGE_SHOW_TIME = 3.0f; + public static float SUDDENEVENT_IAMGE_SHOW_TIME = 4.0f; #region 상호작용 멘트 @@ -33,7 +33,6 @@ public static class HousingConstants "도저히 출근할 체력이 안되는걸..?","출근하는 중")}, { ActionType.Eat, new InteractionTexts("식사를 하자","1시간 동안 체력 1을 회복한다.","밥 먹는 중") } }; - #endregion public struct InteractionTexts { @@ -50,9 +49,33 @@ public static class HousingConstants AnimationText = animationText; } } + #endregion + + #region 돌발 이벤트 + + public static readonly Dictionary SuddenEventTexts = + new Dictionary + { + { AfterWorkEventType.OvertimeWork, "부장님이 퇴근을 안하셔.. 야근할까?" }, + { AfterWorkEventType.TeamGathering, "갑자기 팀 회식이 잡혔다. 참석 하러 가자"} + }; + + public struct SuddenEventTypes + { + public AfterWorkEventType AfterWorkEvent { get; private set; } + public string AfterWorkEventText { get; private set; } + + public SuddenEventTypes(AfterWorkEventType afterWorkEvent, string afterWorkEventText) + { + AfterWorkEvent = afterWorkEvent; + AfterWorkEventText = afterWorkEventText; + } + } + + #endregion // 랜덤 값에 일치하는 함수를 리턴하기 위한 딕셔너리 - // AFTER_WORK_DENOMINATOR 값 확정 후에 키 값 수정 + // TODO: AFTER_WORK_DENOMINATOR 값 확정 후에 키 값 수정 public static readonly Dictionary AfterWorkEvents = new Dictionary { {0, AfterWorkEventType.OvertimeWork}, {1, AfterWorkEventType.TeamGathering} diff --git a/Assets/Scripts/Common/GameUtility/GameSound.cs b/Assets/Scripts/Common/GameUtility/GameSound.cs index ff3e9f02..b4423a26 100644 --- a/Assets/Scripts/Common/GameUtility/GameSound.cs +++ b/Assets/Scripts/Common/GameUtility/GameSound.cs @@ -27,6 +27,10 @@ public partial class GameManager [SerializeField] private AudioClip eatingSFX; [SerializeField] private AudioClip sleepingSFX; + [Header("돌발 이벤트 효과음")] + [SerializeField] private AudioClip overtimeWorkSFX; + [SerializeField] private AudioClip teamGatheringSFX; + [Header("게임 결과 효과음")] [SerializeField] private AudioClip gameOverSFX; [SerializeField] private AudioClip victorySFX; @@ -83,6 +87,10 @@ public partial class GameManager if (goToDungeonSFX != null) SafeSoundManager?.LoadAudioClip("Dungeon", goToDungeonSFX); if (eatingSFX != null) SafeSoundManager?.LoadAudioClip("Eating", eatingSFX); if (sleepingSFX != null) SafeSoundManager?.LoadAudioClip("Sleeping", sleepingSFX); + + // 돌발 이벤트 효과음 등록 + if(overtimeWorkSFX != null) SafeSoundManager?.LoadAudioClip("OvertimeWork", overtimeWorkSFX); + if(teamGatheringSFX != null) SafeSoundManager?.LoadAudioClip("TeamGathering", teamGatheringSFX); // 플레이어 전투 효과음 등록 if (housingFootstepSFX != null) SafeSoundManager?.LoadAudioClip("HousingFootstep", housingFootstepSFX); @@ -297,6 +305,53 @@ public partial class GameManager } } + #endregion + + #region 돌발 이벤트 + public void PlaySuddenEventSound(AfterWorkEventType afterWorkEventType) + { + // 배경음 중지 (페이드아웃) + SafeSoundManager?.StopBGM(true, 0.5f); + + // 효과음 재생 + switch (afterWorkEventType) + { + case AfterWorkEventType.TeamGathering: + SafeSoundManager?.PlaySFX("TeamGathering"); + break; + case AfterWorkEventType.OvertimeWork: + SafeSoundManager?.PlaySFX("OvertimeWork"); + break; + } + } + + // 상호작용 효과음 종료 + public void StopSuddenEventSound(AfterWorkEventType afterWorkEventType, float fadeTime = 0.5f) + { + string sfxName = ""; + + switch (afterWorkEventType) + { + case AfterWorkEventType.TeamGathering: + sfxName = "TeamGathering"; + break; + case AfterWorkEventType.OvertimeWork: + sfxName = "OvertimeWork"; + break; + } + + if (!string.IsNullOrEmpty(sfxName)) + { + SafeSoundManager?.FadeOutSFXByName(sfxName, fadeTime); + + // 배경음 재개 + if (wasPlayingBGM && previousBGMClip != null) + { + StartCoroutine(FadeOutAndPlayBGM(sfxName, fadeTime)); + } + } + } + #endregion #region 플레이어 전투 효과음 제어