using System.Collections; using System.Collections.Generic; using UnityEngine; namespace MuHua { /// /// 跳跃 - 运动 /// public class KJump : IKinesis { /// 基础角色 public readonly MCharacter character; /// 结束跳跃 public bool isEndJump; /// 是否接地 public bool isGrounded; /// 允许转换 public bool isTransition; /// 跳跃高度 public float jumpHeight; /// 衰退速度 public float decaySpeed; /// 移动速度 public float moveSpeed = 2; /// 加速度 public float acceleration = 15; /// 移动方向 public Vector2 moveDirection; /// 初始位置 public Vector3 position; /// 初始角度 public Vector3 eulerAngles; /// 是否旋转 public bool isRotation; /// 初始设置 public bool isInitial = false; /// 变换器 public Transform transform => character.transform; /// 动画器 public Animator animator => character.animator; /// 运动器 public Movement movement => character.movement; public KJump(MCharacter character, Vector2 moveDirection, float jumpHeight, bool isRotation) { this.character = character; this.moveDirection = moveDirection; this.jumpHeight = jumpHeight; } public void Settings(float moveSpeed, float acceleration) { this.moveSpeed = moveSpeed; this.acceleration = acceleration; } public void Settings(Vector3 position, Vector3 eulerAngles) { this.position = position; this.eulerAngles = eulerAngles; isInitial = true; } public override bool Transition(IKinesis kinesis) { return isTransition; } public override void StartKinesis() { if (isInitial) { character.transform.position = position; character.transform.eulerAngles = eulerAngles; } isEndJump = false; isTransition = false; isGrounded = movement.Grounded; decaySpeed = movement.Speed; movement.Jump(jumpHeight); animator.SetTrigger("JumpStart"); } public override void UpdateKinesis() { if (isEndJump) { return; } // 衰退速度 decaySpeed = Mathf.Lerp(decaySpeed, 0, Time.deltaTime * 0.8f); movement.Move(moveDirection, decaySpeed, acceleration, isRotation); // 跳跃状态判断 if (isGrounded == movement.Grounded) { return; } isGrounded = movement.Grounded; // 起跳 if (!isGrounded) { return; } // 落地 isEndJump = true; animator.SetTrigger("JumpLand"); movement.Move(Vector2.zero, decaySpeed, acceleration, isRotation); } public override void FinishKinesis() { // throw new System.NotImplementedException(); } public override void AnimationExit() { isTransition = true; // 转换到移动 KMove kMove = new KMove(character, moveDirection, isRotation); kMove.Settings(moveSpeed, acceleration); character.Transition(kMove); } } }