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

如何使用Character Controller检测水平碰撞与Unity墙壁碰撞并获取墙体对象名

如何用Unity的Character Controller检测墙壁(水平)碰撞

首先纠正一个误区:OnControllerColliderHit 方法并非只能检测地板碰撞,它会响应所有由Character Controller触发的碰撞交互,包括墙壁。你觉得它只检测地板,大概率是没对碰撞法线的方向做区分。

实现步骤

  1. 在挂载Character Controller的脚本中重写OnControllerColliderHit方法
    通过判断碰撞法线的Y轴分量,区分地板(法线向上,Y值接近1)和墙壁(法线水平,Y值接近0),进而获取墙体的GameObject名称。

  2. 示例代码

using UnityEngine;

public class PlayerWallCollision : MonoBehaviour
{
    private CharacterController _charController;

    void Awake()
    {
        _charController = GetComponent<CharacterController>();
    }

    void OnControllerColliderHit(ControllerColliderHit hit)
    {
        // 跳过地板碰撞:法线Y轴绝对值大于0.9判定为地板(可根据场景调整阈值)
        if (Mathf.Abs(hit.normal.y) > 0.9f)
            return;

        // 获取碰撞到的墙体名称
        string wallObjectName = hit.collider.gameObject.name;
        Debug.Log($"碰撞到墙体:{wallObjectName}");

        // 这里可添加你的业务逻辑,比如碰撞反馈、音效播放等
    }
}

注意事项

  • 确保墙体对象带有非Trigger类型的Collider组件(如BoxCollider、MeshCollider),如果是Trigger,需改用OnTriggerEnter等相关方法。
  • 可结合标签系统优化检测:比如给所有墙壁添加Wall标签,在代码中增加if (hit.collider.CompareTag("Wall"))判断,避免误检测其他水平碰撞体。
  • 检查Character Controller的参数设置:Skin Width建议设为Radius的10%左右,Min Move Distance设为0,确保碰撞检测的灵敏度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:32:13