102 lines
2.6 KiB
C#
102 lines
2.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Lightbug.CharacterControllerPro.Core;
|
|
using Lightbug.CharacterControllerPro.Implementation;
|
|
using Lightbug.Utilities;
|
|
|
|
namespace Lightbug.CharacterControllerPro.Demo
|
|
{
|
|
|
|
[AddComponentMenu("Character Controller Pro/Demo/Character/AI/Wander Behaviour")]
|
|
public class AIWanderBehaviour : CharacterAIBehaviour
|
|
{
|
|
[Min(0f)]
|
|
[SerializeField]
|
|
float minRandomMagnitude = 1f;
|
|
|
|
[Min(0f)]
|
|
[SerializeField]
|
|
float maxRandomMagnitude = 1f;
|
|
|
|
[Min(0f)]
|
|
[SerializeField]
|
|
float minRandomYawAngle = 100f;
|
|
|
|
[Min(0f)]
|
|
[SerializeField]
|
|
float maxRandomYawAngle = 280f;
|
|
|
|
[Min(0f)]
|
|
[SerializeField]
|
|
float waitSeconds = 3f;
|
|
|
|
float timer = 0f;
|
|
|
|
Vector3 initialPosition = default(Vector3);
|
|
|
|
Vector3 target = default(Vector3);
|
|
|
|
void OnValidate()
|
|
{
|
|
if (minRandomMagnitude > maxRandomMagnitude)
|
|
minRandomMagnitude = maxRandomMagnitude;
|
|
|
|
if (maxRandomMagnitude < minRandomMagnitude)
|
|
maxRandomMagnitude = minRandomMagnitude;
|
|
|
|
if (minRandomYawAngle > maxRandomYawAngle)
|
|
minRandomYawAngle = maxRandomYawAngle;
|
|
|
|
if (maxRandomYawAngle < minRandomYawAngle)
|
|
maxRandomYawAngle = minRandomYawAngle;
|
|
}
|
|
|
|
|
|
|
|
public override void EnterBehaviour(float dt)
|
|
{
|
|
initialPosition = transform.position;
|
|
|
|
target = initialPosition + transform.forward * Random.Range(minRandomMagnitude, maxRandomMagnitude);
|
|
timer = 0f;
|
|
}
|
|
|
|
public override void UpdateBehaviour(float dt)
|
|
{
|
|
|
|
if (timer >= waitSeconds)
|
|
{
|
|
timer = 0f;
|
|
|
|
SetTarget();
|
|
|
|
}
|
|
else
|
|
{
|
|
timer += dt;
|
|
}
|
|
|
|
float distanceToTarget = (target - CharacterActor.Position).magnitude;
|
|
|
|
if (distanceToTarget > 0.5f)
|
|
SetMovementAction(target - CharacterActor.Position);
|
|
else
|
|
characterActions.Reset();
|
|
}
|
|
|
|
|
|
void SetTarget()
|
|
{
|
|
Vector3 centerToTargetDir = target - initialPosition;
|
|
centerToTargetDir.Normalize();
|
|
|
|
centerToTargetDir = Quaternion.Euler(0, Random.Range(minRandomYawAngle, maxRandomYawAngle), 0f) * centerToTargetDir;
|
|
|
|
target = initialPosition + centerToTargetDir * Random.Range(minRandomMagnitude, maxRandomMagnitude);
|
|
}
|
|
|
|
}
|
|
|
|
}
|