public static BaseState CreateBaseState(EnemyAIStateType stateType, EnemyMovement controller) { BaseState returnState = null; switch (stateType) { case EnemyAIStateType.AvoidBullet: returnState = new AvoidBulletState(controller); break; case EnemyAIStateType.Search: returnState = new SearchState(controller); break; case EnemyAIStateType.Strafe: returnState = new StrafeState(controller); break; } return(returnState); }
public override EnemyAIStateType Tick() { EnemyAIStateType state = GetStateType(); if (controller.TargetedPlayer != null) { Vector3 targetPosition = controller.TargetedPlayer.transform.position; //Vector3 offsetPlayer = transform.position - targetPosition; float distance = Vector3.Distance(transform.position, targetPosition); controller.TargetDestination = targetPosition; if (controller.NearestBullet != null) { state = EnemyAIStateType.AvoidBullet; } else if (Mathf.Abs(distance) < controller.StrafeDistance) { state = EnemyAIStateType.Strafe; } } return(state); }
public override EnemyAIStateType Tick() { EnemyAIStateType stateType = GetStateType(); if (controller.TargetedPlayer != null) { Vector3 targetPosition = controller.TargetedPlayer.transform.position; Vector3 offsetPlayer = transform.position - targetPosition; Vector3 dir = Vector3.Cross(offsetPlayer, Vector3.up); controller.TargetDestination = transform.position + dir; //var lookPos = targetPosition - transform.position; //lookPos.y = 0; //var rotation = Quaternion. if (controller.NearestBullet != null) { stateType = EnemyAIStateType.AvoidBullet; } else if (Mathf.Abs(offsetPlayer.magnitude) > controller.ChaseDistance) { stateType = EnemyAIStateType.Search; } } return(stateType); }
private void SwitchOnNextState(EnemyAIStateType nextState) { CurrentState = _availableStates[nextState]; OnStateChange?.Invoke(CurrentState); }