ExampleComponents/NavigationSlidingDoor.cs
using System;
using Sandbox;
public sealed class NavigationSlidingDoor : Component
{
[Property]
public NavMeshArea Blocker;
[Property]
public GameObject DoorModel { get; set; }
private Vector3 DoorClosedPostion { get; set; }
private Vector3 DoorOpenPosition { get; set; }
protected override void OnStart()
{
DoorClosedPostion = DoorModel.WorldPosition;
DoorOpenPosition = DoorModel.WorldPosition + Vector3.Forward * 450f;
}
private bool _isOpen = false;
private TimeSince _timeSinceOpenToggled;
protected override void OnUpdate()
{
var prevOpenState = _isOpen;
_isOpen = false;
// check if agent is nearby
foreach (var agent in Scene.GetAll<NavMeshAgent>())
{
if (agent.WorldPosition.Distance(WorldPosition) < 400f)
{
_isOpen = true;
}
}
if (prevOpenState != _isOpen)
{
_timeSinceOpenToggled = 0;
}
if (_timeSinceOpenToggled > 2f)
{
if (_isOpen)
{
Blocker.Enabled = false;
DoorModel.WorldPosition = Vector3.Lerp(DoorModel.WorldPosition, DoorOpenPosition, Time.Delta * 5f);
}
else
{
Blocker.Enabled = true;
DoorModel.WorldPosition = Vector3.Lerp(DoorModel.WorldPosition, DoorClosedPostion, Time.Delta * 5f);
}
}
}
}