protected virtual void EngageTarget(vIControlAICombat controller) { if (controller.currentTarget.transform == null) { return; } controller.SetSpeed(engageSpeed); if (controller.targetDistance <= controller.attackDistance) { controller.Stop(); controller.Attack(); } else if (!controller.animatorStateInfos.HasAnyTag("Attack", "LockMovement", "CustomAction")) { if (engageInStrafe) { controller.StrafeMoveTo(controller.currentTarget.transform.position, (controller.currentTarget.transform.position - controller.transform.position).normalized); } else { controller.MoveTo(controller.currentTarget.transform.position); } } else { controller.Stop(); } }
private void DrawGizmos(vIControlAICombat combatControl) { minDistColor.a = .2f; maxDistColor.a = .2f; lostDistColor.a = .2f; combatColor.a = .2f; var transform = (eyes != null && eyes.objectReferenceValue != null ? (eyes.objectReferenceValue as Transform) : (target as MonoBehaviour).transform); float _fov = fov != null ? fov.floatValue : 0; if (combatControl != null) { Handles.color = combatColor; Handles.DrawSolidDisc((target as MonoBehaviour).transform.position, Vector3.up, combatControl.combatRange); } if (maxDist != null) { Handles.color = maxDistColor; var forward = transform.forward; forward.y = 0; Handles.DrawSolidArc(transform.position, Vector3.up, forward, _fov * 0.5f, maxDist.floatValue); Handles.DrawSolidArc(transform.position, Vector3.up, forward, -(_fov * 0.5f), maxDist.floatValue); Handles.color = lostDistColor; Handles.DrawSolidDisc(transform.position, Vector3.up, maxDist.floatValue + lostDist.floatValue); } if (minDist != null) { Handles.color = minDistColor; Handles.DrawSolidDisc(transform.position, Vector3.up, minDist.floatValue); } }
public virtual void Attack(vIControlAICombat aICombat, vFSMComponentExecutionType executionType = vFSMComponentExecutionType.OnStateUpdate) { if (executionType == vFSMComponentExecutionType.OnStateEnter) { aICombat.InitAttackTime(); if (forceFirstAttack) { aICombat.Attack(overrideStrongAttack ? strongAttack : false, overrideAttackID ? attackID : -1, true); } } if (aICombat != null && aICombat.currentTarget.transform) { var distance = aICombat.targetDistance; if (distance <= (overrideAttackDistance ? attackDistance : aICombat.attackDistance)) { aICombat.RotateTo(aICombat.currentTarget.transform.position - aICombat.transform.position); if (!aICombat.isAttacking && aICombat.canAttack) { aICombat.Attack(overrideStrongAttack ? strongAttack : false, overrideAttackID ? attackID : -1); } } else { aICombat.SetSpeed(attackSpeed); aICombat.MoveTo(aICombat.currentTarget.transform.position); } } if (executionType == vFSMComponentExecutionType.OnStateExit) { aICombat.ResetAttackTime(); } }
protected virtual void StrafeCombatMovement(vIControlAICombat controller) { bool moveForward = controller.targetDistance > controller.combatRange * 0.8f; bool moveBackWard = controller.targetDistance < controller.minDistanceOfTheTarget; var forwardMovement = (controller.currentTarget.transform.position - 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, (controller.currentTarget.transform.position - controller.transform.position).normalized); }
protected virtual void ControlLookPoint(vIControlAICombat controller) { if (controller.currentTarget.transform == null || !controller.currentTarget.hasCollider || !controller.targetInLineOfSight) { return; } controller.LookTo(controller.currentTarget.transform.position); }
public override void ClearTarget() { base.ClearTarget(); healthController = null; meleeFighter = null; character = null; combateController = null; }
protected virtual void OnExitCombat(vIControlAICombat controller) { if (controller.currentTarget.transform == null || controller.currentTarget.isDead || !controller.targetInLineOfSight) { controller.ResetAttackTime(); } controller.isInCombat = false; }
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); }
protected virtual void HandleShotAttack(vIControlAICombat controller) { controller.AimToTarget(); if (controller.canAttack) { controller.Attack(); } }
protected virtual void ControlLookPoint(vIControlAICombat controller) { if (controller.currentTarget.transform == null || !controller.currentTarget.hasCollider) { return; } var movepoint = (controller.lastTargetPosition); controller.LookTo(movepoint); }
public virtual void OnReceiveAttack(vIControlAICombat controller, ref vDamage damage, vIMeleeFighter attacker, ref bool canBlock) { //HandleDefensiveCombat(controller, true); if (damage.damageValue > 0) { if (attacker != null && attacker.character != null && !attacker.character.isDead) { controller.SetCurrentTarget(attacker.transform); } } }
private void DrawDebugWindow(vIControlAICombat combatControl) { Handles.BeginGUI(); GUILayout.BeginArea(new Rect(Screen.width - 170, Screen.height - 195, 170, 195)); minDistColor.a = .8f; maxDistColor.a = .8f; lostDistColor.a = .8f; combatColor.a = .8f; var color = GUI.color; GUILayout.BeginVertical("VISUAL DEBUG", skin.window, GUILayout.Width(150)); GUILayout.Label(m_Logo, skin.label, GUILayout.MaxHeight(25)); GUILayout.Space(10); GUI.color = minDistColor; GUILayout.BeginHorizontal("box"); { GUI.color = color; GUILayout.Box("Min Distance To Detect", labelStyle); } GUILayout.EndHorizontal(); GUI.color = maxDistColor; GUILayout.BeginHorizontal("box"); { GUI.color = color; GUILayout.Label("Max Distance To Detect", labelStyle); } GUILayout.EndHorizontal(); GUI.color = lostDistColor; GUILayout.BeginHorizontal("box"); { GUI.color = color; GUILayout.Box("Lost Target Distance", labelStyle); } GUILayout.EndHorizontal(); if (combatControl != null) { GUI.color = combatColor; GUILayout.BeginHorizontal("box"); { GUI.color = color; GUILayout.Box("Combat Range", labelStyle); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); GUI.color = color; GUILayout.EndArea(); Handles.EndGUI(); }
public override void InitTarget(Transform target) { base.InitTarget(target); if (target) { healthController = target.GetComponent <vIHealthController>(); _hadHealthController = this.healthController != null; meleeFighter = target.GetComponent <vIMeleeFighter>(); character = target.GetComponent <vICharacter>(); combateController = target.GetComponent <vIControlAICombat>(); } }
protected virtual void CombatMovement(vIControlAICombat controller) { controller.SetSpeed(engageSpeed); if (controller.strafeCombatMovement) { StrafeCombafeMovement(controller); } else { SimpleCombatMovement(controller); } }
protected override void CombatMovement(vIControlAICombat controller) { controller.SetSpeed(combatSpeed); if (controller.strafeCombatMovement) { StrafeCombatMovement(controller); } else { SimpleCombatMovement(controller); } }
protected virtual void EngageTarget(vIControlAICombat controller) { if (controller.currentTarget.transform == null) { return; } controller.SetSpeed(engageSpeed); if (!controller.animatorStateInfos.HasAnyTag("Attack", "LockMovement", "CustomAction")) { var movepoint = (controller.lastTargetPosition); controller.StrafeMoveTo(movepoint, movepoint - controller.transform.position); } }
protected virtual bool TargetIsInCombatRange(vIControlAICombat ctrlCombat) { if (ctrlCombat == null) { return(false); } if (ctrlCombat.currentTarget.transform == null) { return(false); } if (!ctrlCombat.currentTarget.transform.gameObject.activeSelf) { return(false); } return(ctrlCombat.targetDistance <= ctrlCombat.combatRange); }
protected virtual void OnSceneGUI() { if (debug == null || !debug.boolValue) { return; } vIControlAICombat combatControl = null; if (target is vIControlAICombat) { combatControl = target as vIControlAICombat; } DrawGizmos(combatControl); DrawDebugWindow(combatControl); }
protected virtual void CombatMovement(vIControlAICombat controller) { controller.SetSpeed(combatSpeed); if (controller.strafeCombatMovement) { StrafeCombatMovement(controller); } else { SimpleCombatMovement(controller); } if (controller.canBlockInCombat) { controller.Blocking(); } }
protected virtual void OnUpdateCombat(vIControlAICombat controller) { if (controller.currentTarget.transform == null || controller.currentTarget.isLost) { return; } if (controller != null) { if (controller.canAttack) { EngageTarget(controller); } else { CombatMovement(controller); } ControlLookPoint(controller); } }
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); } }
public override void DoAction(vIFSMBehaviourController fsmBehaviour, vFSMComponentExecutionType executionType = vFSMComponentExecutionType.OnStateUpdate) { vIControlAICombat combatController = fsmBehaviour.aiController as vIControlAICombat; if (combatController == null) { return; } combatController.SetSpeed(speed); if (executionType == vFSMComponentExecutionType.OnStateUpdate && fsmBehaviour.aiController.HasComponent <vAICover>()) { var cover = fsmBehaviour.aiController.GetAIComponent <vAICover>(); if (fsmBehaviour.aiController.currentTarget.transform) { cover.GetCoverFromTargetThreat(); } else { cover.GetCoverFromRandomThreat(); } } if (executionType == vFSMComponentExecutionType.OnStateExit) { if (fsmBehaviour.aiController.HasComponent <vAICover>()) { var cover = fsmBehaviour.aiController.GetAIComponent <vAICover>(); cover.OnExitCover(); } (combatController).isInCombat = false; combatController.isCrouching = false; } if (executionType == vFSMComponentExecutionType.OnStateEnter) { (combatController).isInCombat = true; } }
/// <summary> /// Called from UpdateState if vIControlAI is a vIControlAICombat /// </summary> /// <param name="ctrlAICombat"></param> protected abstract void UpdateCombatState(vIControlAICombat ctrlAICombat);
protected virtual void OnEnterCombat(vIControlAICombat controller) { controller.InitAttackTime(); controller.isInCombat = true; }
protected virtual void Start() { controller = GetComponent <vIControlAICombat>(); controller.onDead.AddListener(RemoveCoverOnDead); }