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;
}
}