protected override void Init(AIBehaviors fsm) { navMeshAgent = fsm.GetComponentInChildren <NavMeshAgent>(); fsm.PlayAudio(); nextCheckHasMovement = Time.time + checkHasMovementFrequency; player = fsm.GetClosestPlayer(objectFinder.GetTransforms()); targetPosition = Vector3.zero; }
protected Transform GetTarget(AIBehaviors fsm) { if (findVisibleTargetsOnly) { return(fsm.GetClosestPlayerWithinSight(objectFinder.GetTransforms())); } else { return(fsm.GetClosestPlayer(objectFinder.GetTransforms())); } }
protected override void Action(AIBehaviors fsm) { if (!rotatesTowardTarget) { fsm.MoveAgent(fsm.transform, 0.0f, rotationSpeed); } else { Transform target = fsm.GetClosestPlayer(objectFinder.GetTransforms()); if (target != null) { fsm.MoveAgent(target, 0.0f, rotationSpeed); } } }
protected override void Action(AIBehaviors fsm) { Transform target = fsm.GetClosestPlayer(objectFinder.GetTransforms()); string attackAnimationName = animationStates[0].name; bool useAnimationTime = skinnedMeshRenderer == null || skinnedMeshRenderer.isVisible; if (!useAnimationTime && attackAnimation != null) { useAnimationTime = attackAnimation.cullingType == AnimationCullingType.AlwaysAnimate; } if (target != null) { HandlePreviousStateMovement(fsm, target); } AIAnimationState animState = fsm.animationStates.GetStateWithName(attackAnimationName); fsm.PlayAnimation(animState); if (scriptWithAttackMethod != null) { if (!string.IsNullOrEmpty(methodName)) { if (useAnimationTime && attackAnimation != null && attackAnimation[attackAnimationName] != null) { curAnimPosition = attackAnimation[attackAnimationName].normalizedTime % 1.0f; } else { curAnimPosition %= 1.0f; curAnimPosition += Time.deltaTime / animationLength; } if (previousSamplePosition > attackPoint || curAnimPosition < attackPoint) { previousSamplePosition = curAnimPosition; return; } previousSamplePosition = curAnimPosition; TriggerCooldown(); Attack(fsm, target); } } }
protected override bool Reason(AIBehaviors fsm) { float sqrDist; // Checks if the flight ended switch (fleeMode) { case FleeMode.NearestTaggedObject: case FleeMode.FixedTarget: if (currentTarget != null) { sqrDist = (fsm.aiTransform.position - currentTarget.position).sqrMagnitude; if (sqrDist < sqrDistanceToTargetThreshold) { fsm.ChangeActiveState(flightEndedState); return(false); } } break; case FleeMode.Direction: case FleeMode.AwayFromNearestTaggedObject: Vector3 nearestObjectPosition = fsm.GetClosestPlayer(objectFinder.GetTransforms()).position; sqrDist = (fsm.aiTransform.position - nearestObjectPosition).sqrMagnitude; if (sqrDist > sqrStopFleeDistance) { fsm.ChangeActiveState(flightEndedState); return(false); } break; } return(true); }
public override Vector3 GetNextMovement(AIBehaviors fsm) { Vector3 result; switch (fleeMode) { case FleeMode.NearestTaggedObject: float nearestSqrDistance = Mathf.Infinity; int targetIndex = -1; for (int i = 0; i < fleeToObjects.Length; i++) { Vector3 dist = fleeToObjects[i].transform.position - this.transform.position; if (dist.sqrMagnitude < nearestSqrDistance) { nearestSqrDistance = dist.sqrMagnitude; targetIndex = i; } } if (targetIndex != -1) { currentTarget = fleeToObjects[targetIndex].transform; result = currentTarget.position; } else { result = base.GetNextMovement(fsm); } break; case FleeMode.FixedTarget: if (fleeToTarget != null) { currentTarget = fleeToTarget; result = fleeToTarget.position; } else { Debug.LogWarning("Flee To Target isn't set for FleeState"); result = base.GetNextMovement(fsm); } break; case FleeMode.Direction: result = fsm.aiTransform.position + fleeDirection * stopFleeDistance; break; case FleeMode.AwayFromNearestTaggedObject: Vector3 nearestObjectPosition = fsm.GetClosestPlayer(objectFinder.GetTransforms()).position; Vector3 fsmPosition = fsm.aiTransform.position; Vector3 direction = (fsmPosition - nearestObjectPosition).normalized * stopFleeDistance; result = fsmPosition + direction; break; default: result = base.GetNextMovement(fsm); break; } return(result); }