基础设置
-
角色控制器选择:
-
使用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实现平滑的相机跟随
-
-
物理材质:
-
为不同表面设置不同的物理材质,影响摩擦力和弹跳效果
-
-
粒子效果:
-
在滑铲时添加灰尘粒子
-
在贴墙跑时添加墙面火花效果
-
优化建议
-
状态机模式:
-
实现一个完整的状态机管理系统,管理跑酷的各种状态
-
例如:站立、奔跑、滑铲、贴墙跑、跳跃等状态
-
-
输入缓冲:
-
实现输入缓冲系统,使动作衔接更流畅
-
-
物理预测:
-
使用射线检测预测即将到来的动作机会(如前方可滑铲区域或可贴墙跑的表面)
-