基础设置
-
角色控制器选择:
-
使用Character Controller组件或Rigidbody + Capsule Collider
-
推荐使用Character Controller以获得更精确的运动控制
-
-
输入系统:
-
使用Unity的新输入系统(Input System Package)处理玩家输入
-
滑铲实现
public class SlideController : MonoBehaviour
{[Header("Slide Settings")]public float slideSpeed = 10f;public float slideDuration = 1f;public float slideCooldown = 0.5f;public float slideHeight = 0.5f;public float normalHeight = 2f;private CharacterController controller;private bool isSliding = false;private float slideTimer;private float cooldownTimer;void Start(){controller = GetComponent<CharacterController>();}void Update(){HandleSlide();}void HandleSlide(){if (cooldownTimer > 0){cooldownTimer -= Time.deltaTime;return;}if (Input.GetKeyDown(KeyCode.LeftControl) && !isSliding){StartSlide();}if (isSliding){slideTimer -= Time.deltaTime;if (slideTimer <= 0){EndSlide();}// 保持滑铲速度Vector3 moveDirection = transform.forward * slideSpeed;controller.Move(moveDirection * Time.deltaTime);}}void StartSlide(){isSliding = true;slideTimer = slideDuration;controller.height = slideHeight;controller.center = new Vector3(0, slideHeight * 0.5f, 0);}void EndSlide(){isSliding = false;cooldownTimer = slideCooldown;controller.height = normalHeight;controller.center = new Vector3(0, normalHeight * 0.5f, 0);}
}
贴墙跑实现
public class WallRunController : MonoBehaviour
{[Header("Wall Run Settings")]public float wallRunSpeed = 8f;public float wallRunGravity = 2f;public float wallRunDuration = 2f;public float wallJumpForce = 10f;public LayerMask wallRunLayer;private CharacterController controller;private bool isWallRunning = false;private Vector3 wallNormal;private float wallRunTimer;void Start(){controller = GetComponent<CharacterController>();}void Update(){CheckWallRun();HandleWallRun();}void CheckWallRun(){if (isWallRunning) return;RaycastHit hit;if (Physics.Raycast(transform.position, transform.right, out hit, 1f, wallRunLayer)){StartWallRun(hit.normal, false);}else if (Physics.Raycast(transform.position, -transform.right, out hit, 1f, wallRunLayer)){StartWallRun(hit.normal, true);}}void StartWallRun(Vector3 normal, bool isLeftWall){isWallRunning = true;wallNormal = normal;wallRunTimer = wallRunDuration;// 调整角色朝向与墙面平行Vector3 cross = Vector3.Cross(normal, Vector3.up);transform.rotation = Quaternion.LookRotation(cross, normal);}void HandleWallRun(){if (!isWallRunning) return;wallRunTimer -= Time.deltaTime;// 沿墙面移动Vector3 moveDirection = transform.forward * wallRunSpeed;// 应用自定义重力moveDirection.y -= wallRunGravity * Time.deltaTime;controller.Move(moveDirection * Time.deltaTime);// 检查是否应该结束贴墙跑if (wallRunTimer <= 0 || !Physics.Raycast(transform.position, wallNormal, 1f, wallRunLayer)){EndWallRun();}// 墙跳if (Input.GetButtonDown("Jump")){WallJump();}}void WallJump(){Vector3 jumpDirection = (wallNormal + Vector3.up).normalized;// 应用跳跃力...EndWallRun();}void EndWallRun(){isWallRunning = false;}
}
高级技巧
-
动画混合:
-
使用Animator Controller混合不同动作的动画
-
设置适当的过渡条件和混合树
-
-
运动曲线:
-
使用AnimationCurve调整动作的速度变化,使过渡更自然
-
-
相机效果:
-
在特殊动作时添加相机震动、视野变化等效果
-
使用Cinemachine实现平滑的相机跟随
-
-
物理材质:
-
为不同表面设置不同的物理材质,影响摩擦力和弹跳效果
-
-
粒子效果:
-
在滑铲时添加灰尘粒子
-
在贴墙跑时添加墙面火花效果
-
优化建议
-
状态机模式:
-
实现一个完整的状态机管理系统,管理跑酷的各种状态
-
例如:站立、奔跑、滑铲、贴墙跑、跳跃等状态
-
-
输入缓冲:
-
实现输入缓冲系统,使动作衔接更流畅
-
-
物理预测:
-
使用射线检测预测即将到来的动作机会(如前方可滑铲区域或可贴墙跑的表面)
-