Code/Components/LookAtTargetComponent.cs
using Andicraft.SecondOrderDynamics;
using Sandbox;

namespace Andicraft.SecondOrderDynamics.Components;

[Title( "Second Order Dynamics - Look At Target" ), Category("Second Order Dynamics")]
public class LookAtTargetComponent : Component
{
	[Property] private GameObject LookAtTarget { get; set; }
	[Property] private DynamicsParameters Parameters { get; set; } = new(1, 1.5f, .25f);
	
	private RotationDynamics _rotationDynamics;

	protected override void OnStart()
	{
		_rotationDynamics = new RotationDynamics( Parameters, WorldRotation );
	}

	protected override void OnUpdate()
	{
		if ( LookAtTarget == null ) return;

		var targetRot = Rotation.LookAt( (LookAtTarget.WorldPosition - WorldPosition).Normal );
		
		WorldRotation = _rotationDynamics.Update( Time.Delta, targetRot );
	}
}