void StrafeMove() { controller.moveSpeed = Player.walkSpeed; Player target = UnityHelper.GetLevelManager().GetPlayer(player.targetId); controller.faceYaw = CommonHelper.YawOfVector3(target.transform.position - player.transform.position); float moveYaw = controller.input.moveYaw; //strafe blend float aimYaw = controller.aimYaw; float diffYaw = CommonHelper.AngleDiffClosest(moveYaw, aimYaw); targetStrafeForward = 1 - Mathf.Abs(diffYaw) / 180f * 2f; diffYaw = CommonHelper.AngleDiffClosest(moveYaw, aimYaw + 90f); targetStrafeRight = 1 - Mathf.Abs(diffYaw) / 180f * 2f; player.strafeForward = CommonHelper.FloatTowards(player.strafeForward, targetStrafeForward, Time.fixedDeltaTime * 5f); player.strafeRight = CommonHelper.FloatTowards(player.strafeRight, targetStrafeRight, Time.fixedDeltaTime * 5f); PhysicsMove(moveYaw); if (upperAction == UpperAction.Empty) { if (player.blocking) { player.SetUpperAniState(Player.StateNameHash.blockIdle); } else { player.SetUpperAniState(Player.StateNameHash.meleeStrafe); } } player.SetLowerAniState(Player.StateNameHash.meleeStrafe); }
void StartSmoothYaw() { //这里计算环形插值 float diff = CommonHelper.AngleDiffClosest(this.faceYaw, smoothYaw); smoothYawStepLen = Mathf.Abs(diff) * 6f; }
public override void FixedUpdate() { if (!controller.grounded) { //不在地面 inAirTime += Time.fixedDeltaTime; if (inAirTime > 0.5f) { controller.IntoState(PlayerStateType.InAir); } } else { //在地面 inAirTime = 0; if (controller.input.jump) { if (controller.EnergyCost(Player.jumpEnergyCost) > 0) { controller.IntoState(PlayerStateType.Jump); } } else if (controller.input.roll) { if (controller.EnergyCost(Player.rollEnergyCost) > 0) { controller.IntoState(PlayerStateType.Roll); } } else if (!controller.input.offHand) { //退出瞄准状态 controller.IntoState(PlayerStateType.Move); } else { if (controller.input.mainHand) { TimeSpan span = DateTime.Now - lastShootTime; if (span.TotalMilliseconds > 300) { if (controller.EnergyCost(Player.shootEnergyCost) > 0) { Shoot(); lastShootTime = DateTime.Now; } } } if (!controller.input.hasMove) //没输入方向 { player.SetLowerAniState(Player.StateNameHash.aim); controller.rigidBody.Sleep(); targetStrafeForward = 0f; targetStrafeRight = 0f; } else { float moveYaw = controller.input.moveYaw; float aimYaw = controller.aimYaw; float diffYaw = CommonHelper.AngleDiffClosest(moveYaw, aimYaw); targetStrafeForward = 1 - Mathf.Abs(diffYaw) / 180f * 2f; diffYaw = CommonHelper.AngleDiffClosest(moveYaw, aimYaw + 90f); targetStrafeRight = 1 - Mathf.Abs(diffYaw) / 180f * 2f; player.SetLowerAniState(Player.StateNameHash.aimStrafe, false, 1.5f); player.strafeForward = CommonHelper.FloatTowards(player.strafeForward, targetStrafeForward, Time.fixedDeltaTime * 5f); player.strafeRight = CommonHelper.FloatTowards(player.strafeRight, targetStrafeRight, Time.fixedDeltaTime * 5f); Vector3 moveDir = CommonHelper.DirOnPlane(controller.groundNormal, moveYaw); float speedOnDir = Vector3.Dot(moveDir, controller.rigidBody.velocity); controller.rigidBody.AddForce(moveDir * Player.moveForce); if (speedOnDir > Player.strafeSpeed) { controller.rigidBody.velocity = moveDir * Player.strafeSpeed; } } } } }