[Feat] 돌발 이벤트 사운드 추가 그리고 리팩토링

This commit is contained in:
HaeinLEE 2025-05-10 02:40:09 +09:00
parent 4ae48da950
commit c17ec2c0a9
9 changed files with 164 additions and 29 deletions

View File

@ -73,7 +73,7 @@ public class PlayerController : CharacterBase, IObserver<GameObject>
_isBattle = !isHousingScene;
Debug.Log("_isBattle: " + _isBattle);*/
SwitchBattleMode();
// SwitchBattleMode();
}
private void Update()

BIN
Assets/LIN/Resources/OvertimeWork.mp3 (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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:

BIN
Assets/LIN/Resources/TeamGathering.mp3 (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -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:

View File

@ -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
}

View File

@ -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;
}

View File

@ -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<AfterWorkEventType, string> SuddenEventTexts =
new Dictionary<AfterWorkEventType, string>
{
{ 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<int, AfterWorkEventType> AfterWorkEvents = new Dictionary<int, AfterWorkEventType> {
{0, AfterWorkEventType.OvertimeWork},
{1, AfterWorkEventType.TeamGathering}

View File

@ -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