/// <summary> /// Calculate the angle we need to turn the AI Entity body towards the target /// </summary> /// <returns>A positive angle in degrees that is needed to face the target.</returns> public float DetermineAngleNeededToTurnTowardsTarget() { float angle = CalculationUtil.FindSignedAngle( this.stateMachine.AiEntityBodyTransform.forward, this.stateMachine.NavAgent.steeringTarget - this.stateMachine.AiEntityBodyTransform.position ); return(angle); }
/// <summary> /// Handles the alerted state by continuing to pursue waypoints, etc. /// </summary> /// <returns>Either the alerted state or any new state if certain conditions were met.</returns> private AiStateType HandleDefaultState() { AiStateType state = GetDefaultStateType(); if ( !zombieStateMachine.IsTargetReached && (zombieStateMachine.ThreatManager.DoesAudioThreatExist() || zombieStateMachine.ThreatManager.DoesLightThreatExist()) ) { // we got close to the target due to light or sound, so now we need to know if we should pursue it or seek to find it float angle = CalculationUtil.FindSignedAngle( zombieStateMachine.AiEntityBodyTransform.forward, zombieStateMachine.ThreatManager.CurrentTarget.Position - zombieStateMachine.AiEntityBodyTransform.position ); if (zombieStateMachine.ThreatManager.DoesAudioThreatExist() && Mathf.Abs(angle) < this.threatAngleThreshold) { // it's a sound and we are capable of heading to it, so pursue it state = AiStateType.Pursuit; } else if (HasReachedMaxDirectionChangeTime()) { // it's not a sound and we are not capable of turning towards it, so determine which way we should turn if (Random.value < zombieStateMachine.Intelligence) { SeekTowards(angle); // smartly turn } else { SeekRandomly(); // randomly turn because we are a stupid zombie :) } ResetDirectionChangeTimer(); // TODO: this does sometimes happen often and it makes the zombie appear as if it is stuck in the alerted state } } else if ( zombieStateMachine.ThreatManager.IsTargeting(AiTargetType.Waypoint) && !zombieStateMachine.NavAgent.pathPending ) { // we were targeting a waypoint and we arrived at it, so determine if we can head to next one or turn towards it float angle = zombieStateMachine.ThreatManager.DetermineAngleNeededToTurnTowardsTarget(); if (Mathf.Abs(angle) < this.turnOnSpotThreshold) { state = AiStateType.Patrol; } else if (HasReachedMaxDirectionChangeTime()) { SeekTowards(angle); ResetDirectionChangeTimer(); } } else if (HasReachedMaxDirectionChangeTime()) { // we didn't find what we were looking for and our clock ran out, so turn randomly and repeat the entire alert process // TODO: this does sometimes happen often and it makes the zombie appear as if it is stuck in the alerted state SeekRandomly(); ResetDirectionChangeTimer(); } return(state); }