Files
2026-07-09 21:33:33 +02:00

87 lines
2.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.AI;
using VOID.Generic.Navigation;
using VOID.Generic.Objects.Door.Events;
using VOID.Generic.Objects.Door.State;
namespace VOID.Generic.Objects.Door
{
[Serializable]
public class DoorObjectState : ObjectComponent<DoorObject>
{
#region Initialize
protected override void SelfInitialize()
{
_doorObstacles = parent.GetComponents<NavMeshObstacle>().ToList();
parent.GetComponentInChildren<DoorOpenerTrigger>().door = parent;
}
protected override void EventInitialize()
{
parent.doorEvents.onOpen.AddListener(OnOpen);
parent.doorEvents.onClose.AddListener(OnClose);
parent.doorEvents.onLock.AddListener(OnLock);
parent.doorEvents.onUnlock.AddListener(OnUnlock);
}
protected override void Initialize()
{
if (isOpen)
{
parent.Unlock();
parent.Open();
return;
}
if (isLocked)
{
parent.Close();
parent.Lock();
return;
}
parent.Close();
parent.Unlock();
}
#endregion
private List<NavMeshObstacle> _doorObstacles;
[DisableInPlayMode] public bool isOpen;
[DisableInPlayMode] public bool isLocked;
private void OnOpen(DoorEvent doorEvent)
{
isOpen = true;
parent.doorAnimator.PlayOpen();
}
private void OnClose(DoorEvent doorEvent)
{
isOpen = false;
parent.doorAnimator.PlayClose();
}
private void OnLock(DoorEvent doorEvent)
{
isLocked = true;
_doorObstacles.ForEach(obstacle => obstacle.enabled = true);
NavigationManager.current.UpdateNavMesh(new Bounds(parent.transform.position, Vector3.one * parent.basicData.radius));
}
private void OnUnlock(DoorEvent doorEvent)
{
isLocked = false;
_doorObstacles.ForEach(obstacle => obstacle.enabled = false);
NavigationManager.current.UpdateNavMesh(new Bounds(parent.transform.position, Vector3.one * parent.basicData.radius));
}
}
}