public override BehaviourSM.StateResponse Update(AIController controller) { ChargeBossController bossController = (ChargeBossController)controller; float elapsedStun = Time.time - enteredShootTime; Vector3 currentFacing = controller.headTransform.up; currentFacing = Vector3.RotateTowards(currentFacing, controller.headTransform.right, bossController.shootingSpinRate * Time.deltaTime, 0.0f); controller.headTransform.up = currentFacing; // Try it with movement towards player Vector3 toTarget = controller.target.transform.position - controller.transform.position; if(toTarget.magnitude > minDistToTarget) { controller.MoveDirect(toTarget.normalized, controller.baseMoveSpeed * chaseSpeedMult); } // decide if it should shoot a bullet if(Time.time - lastShootTime > bossController.shootingFireDelay) { bossController.FireBullet(); lastShootTime = Time.time; } if(elapsedStun > spinShootLength) { // TODO: wait state? just tracks the player for some time return new BehaviourSM.StateResponse(BehaviourSM.TransitionMode.AbandonCurrent, new Behaviour_Boss_TelegrapthCharge()); } return new BehaviourSM.StateResponse(BehaviourSM.TransitionMode.NoChange); }
public override BehaviourSM.StateResponse Update(AIController controller) { ChargeBossController bossController = (ChargeBossController)controller; Vector3 lookDirection = controller.target != null ? controller.target.transform.position - controller.transform.position : controller.transform.forward; lookDirection.z = 0.0f; lookDirection.Normalize(); Vector3 currentFacing = controller.headTransform.up; float turnRateMultiplier = (controller.target.transform.position - controller.transform.position).magnitude / bossController.chargeTurnRateFalloffDist; turnRateMultiplier = Mathf.Min(turnRateMultiplier, 1.0f); Vector3 chargeDirection = Vector3.RotateTowards(currentFacing, lookDirection, bossController.chargeTurnRate * Time.deltaTime * turnRateMultiplier, 0.0f); chargeDirection.z = 0.0f; controller.headTransform.up = chargeDirection; // Move direct so that it doesnt path controller.MoveDirect(chargeDirection, controller.baseMoveSpeed * bossController.chargeSpeedModifier); Vector3 toTarget = controller.target.transform.position - controller.transform.position; if(toTarget.magnitude < damageRadius) { // Damage the player, go to the stunned state, knock back the player controller.target.MovementComponent.ApplyForce(toTarget * bossController.chargeKnockbackForce); controller.target.MechComponent.TakeDamage(bossController.chargeHitDamage, controller, null); // A bit of a hack, but do a camera shake CameraController camera = GameObject.FindObjectOfType<CameraController>(); if(camera != null) { CameraController.CameraShake shakeData = new CameraController.CameraShake(0.2f, 1.0f, 1.0f, 1.0f, false); camera.StartCameraShake(ref shakeData, Vector3.up); } return new BehaviourSM.StateResponse(BehaviourSM.TransitionMode.AbandonCurrent, new Behaviour_Boss_Stunned()); } // if it collided this frame, that means it hit a wall and should go into stun state if(controller.MovementComponent.collidedThisFrame) { bossController.OpenWeakSpot(); // Again, do a smaller shake when the boss hits a wall CameraController camera = GameObject.FindObjectOfType<CameraController>(); if(camera != null) { CameraController.CameraShake shakeData = new CameraController.CameraShake(0.3f, 0.3f, 5.0f, 1.0f, false); camera.StartCameraShake(ref shakeData, Vector3.up); } return new BehaviourSM.StateResponse(BehaviourSM.TransitionMode.AbandonCurrent, new Behaviour_Boss_Stunned()); } return new BehaviourSM.StateResponse(BehaviourSM.TransitionMode.NoChange); }