Demo/DemoRandomTargetComponent.cs
using System.Collections.Generic;
using Andicraft.SecondOrderDynamics.Components;
using Sandbox;

[Title("[DEMO] SoD Set Random Target"), Category("Second Order Dynamics (Demo)")]
public sealed class DemoRandomTargetComponent : Component
{
	[field: Property] public FollowTargetComponent TargetComponent { get; }
	[Property, MinMax( .25f, 10f )] private RangedFloat _targetHoldTime { get; set; } = new( 1, 10 );
	[Property] private GameObject TargetObject { get; set; }
	[Property] private bool RandomRotation { get; set; } = true;

	private BoxCollider _boxCollider;

	private float _timer = 0;
	private float _holdTime;

	protected override void OnStart()
	{
		_holdTime = _targetHoldTime.GetValue();
		_boxCollider = GetComponent<BoxCollider>();

		_timer = 50;
	}

	protected override void OnUpdate()
	{
		_timer += Time.Delta;

		if ( _timer < _holdTime ) return;

		_holdTime = _targetHoldTime.GetValue();
		_timer = 0;
		
		var ctr = Transform.Local.PointToWorld( _boxCollider.Center );
		var range = _boxCollider.Scale * .5f;

		TargetObject.WorldPosition = ctr + Vector3.Random * range;
		
		if (RandomRotation)
			TargetObject.WorldRotation = Rotation.Random;
	}
}