You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity角色在地形斜坡/曲面滑动问题的解决方法求助

Unity角色斜坡/曲面地形滑动问题解决方案

我在Unity开发中遇到角色滑动问题:角色在平坦地形移动完全正常,但在带坡度或曲面的地形上,会随表面角度发生滑动。我已将摩擦力调至10000000,问题仍未改善。以下是我的Movement脚本代码及相关设置说明:

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class Movement : MonoBehaviour
{
    public float maximumSpeed;
    public float rotationSpeed;

    private Animator animator;
    private CharacterController characterController;
    private bool isRunning = false;
    void Start()
    {
        animator = GetComponent<Animator>();
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        Vector3 movementDirection = new Vector3(horizontalInput, 0f, verticalInput);
        float inputMagnitude = Mathf.Clamp01(movementDirection.magnitude);
        if (Input.GetButtonDown("Run"))
        {
            isRunning = !isRunning;
        }

        if (!isRunning)
        {
            inputMagnitude /= 1.5f;
        }
        animator.SetFloat("InputMagnitude", inputMagnitude, 0.05f, Time.deltaTime);
        float speed = inputMagnitude * maximumSpeed;
        movementDirection.Normalize();

        characterController.SimpleMove(movementDirection * maximumSpeed);

        if (movementDirection != Vector3.zero)
        {
            animator.SetBool("IsMoving", true);
            Quaternion toRotation = Quaternion.LookRotation(movementDirection, Vector3.up);
            transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime);
        }
        else
        {
            animator.SetBool("IsMoving", false);
        }
    }

    private void OnApplicationFocus(bool focus)
    {
        if (focus)
        {
            Cursor.lockState = CursorLockMode.Locked;
        }
        else
        {
            Cursor.lockState = CursorLockMode.None;
        }
    }
}

相关设置说明:

  • 玩家设置截图
  • 滑动示例地形截图
  • 地形设置截图
  • 摩擦力设置截图(两张,已将摩擦力调至极大值)

解决方案

1. 修复SimpleMove速度参数错误

代码中计算了带步行/跑步缩放的speed变量,但调用SimpleMove时直接使用了maximumSpeed,导致实际移动速度和预期不符,斜坡上滑动更明显。修改代码:

// 替换原SimpleMove调用行
characterController.SimpleMove(movementDirection * speed);

2. 启用CharacterController坡度限制

在CharacterController组件面板中,调整Slope Limit参数(建议设为45左右,按需调整),该参数会限制角色可攀爬的最大坡度,超过阈值时角色不会滑动而是停住。

3. 添加地面吸附增强贴合

SimpleMove的自动重力在曲面地形可能吸附不足,在Update中手动添加向下的力:

void Update()
{
    // ... 原有代码 ...

    // 地面吸附逻辑
    if (characterController.isGrounded)
    {
        characterController.Move(Vector3.down * 2f * Time.deltaTime);
    }
}

4. 重置摩擦力至合理范围

将摩擦力设为10000000属于极端值,Unity物理系统对超大数值可能出现计算异常,反而导致摩擦力失效。建议将物理材质的Dynamic Friction和Static Friction调回0-2之间的合理值,确保角色与地形材质的摩擦力参数匹配。

5. 检查地形碰撞体设置

确保地形的碰撞体完整覆盖曲面区域,没有出现碰撞缺失的情况,否则角色会因未检测到地面而滑动。

内容的提问来源于stack exchange,提问作者Msaab96

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:53:10