121 lines
4.6 KiB
C#
121 lines
4.6 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace Invector.vCharacterController.AI.FSMBehaviour
|
|
{
|
|
public class vAIShooterCombatState : vAICombatState
|
|
{
|
|
public vAIMovementSpeed combatSpeed = vAIMovementSpeed.Walking;
|
|
public vAIMovementSpeed engageSpeed = vAIMovementSpeed.Running;
|
|
public override Type requiredType
|
|
{
|
|
get
|
|
{
|
|
return typeof(vIControlAIShooter);
|
|
}
|
|
}
|
|
public vAIShooterCombatState()
|
|
{
|
|
#if UNITY_EDITOR
|
|
description = "Custom Shooter Combat State";
|
|
#endif
|
|
}
|
|
|
|
public override void OnStateEnter(vIFSMBehaviourController fsmBehaviour)
|
|
{
|
|
base.OnStateEnter(fsmBehaviour);
|
|
|
|
if (fsmBehaviour.aiController is vIControlAICombat)
|
|
{
|
|
var aiCombat = (fsmBehaviour.aiController as vIControlAICombat);
|
|
aiCombat.InitAttackTime();
|
|
aiCombat.isInCombat = true;
|
|
}
|
|
}
|
|
|
|
public override void OnStateExit(vIFSMBehaviourController fsmBehaviour)
|
|
{
|
|
base.OnStateExit(fsmBehaviour);
|
|
if (fsmBehaviour.aiController is vIControlAICombat)
|
|
{
|
|
var aiCombat = (fsmBehaviour.aiController as vIControlAICombat);
|
|
aiCombat.ResetAttackTime();
|
|
aiCombat.isInCombat = false;
|
|
}
|
|
}
|
|
|
|
protected override void UpdateCombatState(vIControlAICombat controller)
|
|
{
|
|
if (controller.currentTarget.transform == null) return;
|
|
|
|
if (controller != null)
|
|
{
|
|
if (controller.targetDistance > controller.attackDistance)
|
|
EngageTarget(controller);
|
|
else
|
|
CombatMovement(controller);
|
|
|
|
ControlLookPoint(controller);
|
|
HandleShotAttack(controller);
|
|
}
|
|
}
|
|
|
|
protected virtual void HandleShotAttack(vIControlAICombat controller)
|
|
{
|
|
controller.AimToTarget();
|
|
|
|
if (controller.canAttack)
|
|
controller.Attack();
|
|
}
|
|
|
|
protected virtual void EngageTarget(vIControlAICombat controller)
|
|
{
|
|
if (controller.currentTarget.transform == null)
|
|
return;
|
|
|
|
|
|
|
|
if (!controller.animatorStateInfos.HasAnyTag("Attack", "LockMovement", "CustomAction"))
|
|
{
|
|
var movepoint = (controller.lastTargetPosition);
|
|
controller.StrafeMoveTo(movepoint, movepoint - controller.transform.position,engageSpeed);
|
|
}
|
|
}
|
|
|
|
protected virtual void CombatMovement(vIControlAICombat controller)
|
|
{
|
|
if (controller.strafeCombatMovement)
|
|
StrafeCombafeMovement(controller);
|
|
else
|
|
SimpleCombatMovement(controller);
|
|
}
|
|
|
|
protected virtual void ControlLookPoint(vIControlAICombat controller)
|
|
{
|
|
if (controller.currentTarget.transform == null || !controller.currentTarget.hasCollider)
|
|
return;
|
|
|
|
var movepoint = (controller.lastTargetPosition);
|
|
controller.LookTo(movepoint);
|
|
}
|
|
|
|
protected virtual void SimpleCombatMovement(vIControlAICombat controller)
|
|
{
|
|
bool moveForward = controller.targetDistance > controller.combatRange * 0.8f;
|
|
bool moveBackward = controller.targetDistance < controller.minDistanceOfTheTarget;
|
|
var movepoint = (controller.lastTargetPosition);
|
|
var forwardMovement = (movepoint - controller.transform.position).normalized * (moveForward ? 1 + controller.stopingDistance : (moveBackward ? -(1 + controller.stopingDistance) : 0));
|
|
controller.StrafeMoveTo(controller.transform.position + forwardMovement, (movepoint - controller.transform.position).normalized,combatSpeed);
|
|
|
|
}
|
|
|
|
protected virtual void StrafeCombafeMovement(vIControlAICombat controller)
|
|
{
|
|
bool moveForward = controller.targetDistance > controller.combatRange * 0.8f;
|
|
bool moveBackward = controller.targetDistance < controller.minDistanceOfTheTarget;
|
|
var movepoint = (controller.lastTargetPosition);
|
|
var forwardMovement = (movepoint - controller.transform.position).normalized * (moveForward ? 1 + controller.stopingDistance : (moveBackward ? -(1 + controller.stopingDistance) : 0));
|
|
controller.StrafeMoveTo(controller.transform.position + (controller.transform.right * ((controller.stopingDistance + 1f)) * controller.strafeCombatSide) + forwardMovement, (movepoint - controller.transform.position).normalized,combatSpeed);
|
|
}
|
|
}
|
|
} |