Files

140 lines
7.4 KiB
C#

using UnityEngine;
namespace Invector.vCharacterController.AI.FSMBehaviour
{
#if UNITY_EDITOR
[vFSMHelpbox("Requires a WaypointArea assign to the AI Controller", UnityEditor.MessageType.Info)]
#endif
public class vPatrolAction : vStateAction
{
public bool debugMode;
public override string categoryName
{
get { return "Movement/"; }
}
public override string defaultName
{
get { return "Patrol"; }
}
public vAIMovementSpeed patrolSpeed = vAIMovementSpeed.Walking;
public bool patrolInStrafe;
[vHideInInspector("patrolInStrafe")]
public bool updateRotationInStrafe=true;
public override void DoAction(vIFSMBehaviourController fsmBehaviour, vFSMComponentExecutionType executionType = vFSMComponentExecutionType.OnStateUpdate)
{
DoPatrolWaypoints(fsmBehaviour);
}
protected virtual void DoPatrolWaypoints(vIFSMBehaviourController fsmBehaviour)
{
if (fsmBehaviour == null) return;
if (fsmBehaviour.aiController.isDead) return;
if (fsmBehaviour.aiController.waypointArea != null && fsmBehaviour.aiController.waypointArea.waypoints.Count > 0)
{
if (fsmBehaviour.aiController.targetWaypoint == null || !fsmBehaviour.aiController.targetWaypoint.isValid)
{
fsmBehaviour.aiController.NextWayPoint();
}
else
{
if (Vector3.Distance(fsmBehaviour.aiController.transform.position, fsmBehaviour.aiController.targetWaypoint.position) <
fsmBehaviour.aiController.stopingDistance + fsmBehaviour.aiController.targetWaypoint.areaRadius + fsmBehaviour.aiController.changeWaypointDistance &&
fsmBehaviour.aiController.targetWaypoint.CanEnter(fsmBehaviour.aiController.transform) &&
!fsmBehaviour.aiController.targetWaypoint.IsOnWay(fsmBehaviour.aiController.transform))
{
fsmBehaviour.aiController.targetWaypoint.Enter(fsmBehaviour.aiController.transform);
}
else if (Vector3.Distance(fsmBehaviour.aiController.transform.position, fsmBehaviour.aiController.targetWaypoint.position) <
fsmBehaviour.aiController.stopingDistance + fsmBehaviour.aiController.targetWaypoint.areaRadius &&
(!fsmBehaviour.aiController.targetWaypoint.CanEnter(fsmBehaviour.aiController.transform) ||
!fsmBehaviour.aiController.targetWaypoint.isValid))
{
fsmBehaviour.aiController.NextWayPoint();
}
if (fsmBehaviour.aiController.targetWaypoint != null &&
fsmBehaviour.aiController.targetWaypoint.IsOnWay(fsmBehaviour.aiController.transform) &&
Vector3.Distance(fsmBehaviour.aiController.transform.position, fsmBehaviour.aiController.targetWaypoint.position) <=
fsmBehaviour.aiController.targetWaypoint.areaRadius + fsmBehaviour.aiController.changeWaypointDistance)
{
if (fsmBehaviour.aiController.remainingDistance <= (fsmBehaviour.aiController.stopingDistance + fsmBehaviour.aiController.changeWaypointDistance) || fsmBehaviour.aiController.isInDestination)
{
var timer = fsmBehaviour.GetTimer("Patrol");
if (timer >= fsmBehaviour.aiController.targetWaypoint.timeToStay || !fsmBehaviour.aiController.targetWaypoint.isValid)
{
fsmBehaviour.aiController.targetWaypoint.Exit(fsmBehaviour.aiController.transform);
fsmBehaviour.aiController.visitedWaypoints.Clear();
fsmBehaviour.aiController.NextWayPoint();
if (debugMode) Debug.Log("Sort new Waypoint");
fsmBehaviour.aiController.Stop();
fsmBehaviour.SetTimer("Patrol", 0);
}
else if (timer < fsmBehaviour.aiController.targetWaypoint.timeToStay)
{
if (debugMode) Debug.Log("Stay");
if (fsmBehaviour.aiController.targetWaypoint.rotateTo)
{
fsmBehaviour.aiController.Stop();
fsmBehaviour.aiController.RotateTo(fsmBehaviour.aiController.targetWaypoint.transform.forward);
}
else
fsmBehaviour.aiController.Stop();
fsmBehaviour.SetTimer("Patrol", timer + Time.deltaTime);
}
}
}
else
{
if (patrolInStrafe)
{
if(updateRotationInStrafe) fsmBehaviour.aiController.StrafeMoveTo(fsmBehaviour.aiController.targetWaypoint.position, fsmBehaviour.aiController.desiredVelocity, patrolSpeed);
else fsmBehaviour.aiController.StrafeMoveTo(fsmBehaviour.aiController.targetWaypoint.position, patrolSpeed);
}
else
fsmBehaviour.aiController.MoveTo(fsmBehaviour.aiController.targetWaypoint.position, patrolSpeed);
if (debugMode) Debug.Log("Go to new Waypoint");
}
}
}
else if (fsmBehaviour.aiController.selfStartingPoint)
{
if (fsmBehaviour.debugMode)
fsmBehaviour.SendDebug("MoveTo SelfStartPosition", this);
if (patrolInStrafe)
{
if (updateRotationInStrafe) fsmBehaviour.aiController.StrafeMoveTo(fsmBehaviour.aiController.selfStartPosition, fsmBehaviour.aiController.desiredVelocity, patrolSpeed);
else fsmBehaviour.aiController.StrafeMoveTo(fsmBehaviour.aiController.selfStartPosition, patrolSpeed);
}
else
fsmBehaviour.aiController.MoveTo(fsmBehaviour.aiController.selfStartPosition, patrolSpeed);
}
else if (fsmBehaviour.aiController.customStartPoint)
{
if (fsmBehaviour.debugMode)
fsmBehaviour.SendDebug("MoveTo CustomStartPosition", this);
if (patrolInStrafe)
{
if (updateRotationInStrafe) fsmBehaviour.aiController.StrafeMoveTo(fsmBehaviour.aiController.customStartPosition, fsmBehaviour.aiController.desiredVelocity, patrolSpeed);
else fsmBehaviour.aiController.StrafeMoveTo(fsmBehaviour.aiController.customStartPosition, patrolSpeed);
}
else
fsmBehaviour.aiController.MoveTo(fsmBehaviour.aiController.customStartPosition, patrolSpeed);
}
else
{
if (fsmBehaviour.debugMode)
fsmBehaviour.SendDebug("Stop Patrolling", this);
fsmBehaviour.aiController.Stop();
}
}
}
}