using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Serialization; using Random = UnityEngine.Random; [RequireComponent(typeof(Rigidbody))] public class InteractionController : MonoBehaviour { [SerializeField] PlayerStats playerStats; [SerializeField] LayerMask interactionLayerMask; [FormerlySerializedAs("housingCanvasManager")] [Header("UI 연동")] [SerializeField] HousingCanvasController housingCanvasController; #region 돌발 이벤트 private bool SuddenEventCalculator() { //TODO: 돌발이벤트 Dictionary로 작성해서 숫자별 작동하기 혹은 스위치문 var rand = Random.Range(0,3); return rand == 1; } public Action SuddenEventHappen() { if (SuddenEventCalculator()) { housingCanvasController.ShowSuddenEventPanel("갑자기 팀 회식이 잡혔다. 참석 해야 겠지?", () => { }); Debug.Log("SuddenEventHappen"); } Debug.Log("퇴근 이벤트 호출됨"); return null; } #endregion // 상호작용 가능한 사물 범위에 들어올 때 private void OnTriggerEnter(Collider other) { if (interactionLayerMask == (interactionLayerMask | (1 << other.gameObject.layer))) { ActionType interactionType = other.gameObject.GetComponent().RoutineEnter(); if( interactionType != null ) { PopActionOnScreen(interactionType); } } } // 사물에서 벗어날 때 UI 정리 private void OnTriggerExit(Collider other) { if (interactionLayerMask == (interactionLayerMask | (1 << other.gameObject.layer))) { housingCanvasController.HideInteractionButton(); } } // ActionType 별로 화면에 상호작용 내용 표시, 상호작용 버튼에 이벤트 작성 private void PopActionOnScreen(ActionType interactionType) { switch (interactionType) { case ActionType.Sleep: housingCanvasController.ShowInteractionButton("침대에서 잘까?","숙면으로 시간 당 체력 1을 회복한다.", () => { playerStats.PerformAction(ActionType.Sleep); housingCanvasController.HideInteractionButton(); //TODO: 화면 전환 효과와 UI 업데이트 작업 }); break; case ActionType.Housework: housingCanvasController.ShowInteractionButton("밀린 집안일을 처리할까?","체력 1을 사용하고 좋은일이 일어날지도 모른다", () => { if (playerStats.CanPerformByHealth(ActionType.Housework)) { playerStats.PerformAction(ActionType.Housework); housingCanvasController.HideInteractionButton(); //TODO: 집안일 후 랜덤 강화 효과 적용 } else { housingCanvasController.SetActionText("힘들어서 못해.."); housingCanvasController.SetDescriptionText(); } }); break; case ActionType.Dungeon: housingCanvasController.ShowInteractionButton("던전에 입장할까?","체력 3을 사용하고 3시간이 흐른다.", () => { if (playerStats.CanPerformByHealth(ActionType.Dungeon)) { playerStats.PerformAction(ActionType.Dungeon); housingCanvasController.HideInteractionButton(); } else { housingCanvasController.SetActionText("던전에 갈 체력이 되지 않아.."); housingCanvasController.SetDescriptionText(); } }); break; case ActionType.Work: housingCanvasController.ShowInteractionButton("출근한다.","체력 3을 사용하고 저녁 6시에나 돌아오겠지..", () => { if (playerStats.CanPerformByHealth(ActionType.Work)) { playerStats.PerformAction(ActionType.Work); housingCanvasController.HideInteractionButton(); playerStats.OnWorked += SuddenEventHappen(); } else { housingCanvasController.SetActionText("도저히 출근할 체력이 안되는걸..?"); housingCanvasController.SetDescriptionText(); } }); break; default: break; } } }