Degulleo3D/Assets/LIN/DailyRoutine/InteractionController.cs
2025-04-23 10:21:17 +09:00

115 lines
4.7 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
[RequireComponent(typeof(Rigidbody))]
public class InteractionController : MonoBehaviour
{
[SerializeField] PlayerStats playerStats;
[SerializeField] LayerMask interactionLayerMask;
[FormerlySerializedAs("housingCanvasManager")]
[Header("UI 연동")]
[SerializeField] HousingCanvasController housingCanvasController;
#region
private SuddenEventController _suddenEventController = new SuddenEventController();
#endregion
// 상호작용 가능한 사물 범위에 들어올 때
private void OnTriggerEnter(Collider other)
{
if (interactionLayerMask == (interactionLayerMask | (1 << other.gameObject.layer)))
{
ActionType interactionType = other.gameObject.GetComponent<InteractionProp>().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();
//돌발 이벤트 랜덤 발생
AfterWorkEvent afterWorkEvent = _suddenEventController.SuddenEventCalculator();
if (afterWorkEvent == AfterWorkEvent.None)
return;
}
else
{
housingCanvasController.SetActionText("도저히 출근할 체력이 안되는걸..?");
housingCanvasController.SetDescriptionText();
}
});
break;
default:
break;
}
}
}