1
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user