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

如何在Unity攀爬过程中忽略指定Raycast?

攀爬状态下Raycast的条件切换方案

你需要新增一个状态变量来区分「准备攀爬」和「正在攀爬」两种状态,就能实现攀爬前依赖双Raycast、攀爬中只保留底部Raycast的需求,具体改法如下:

步骤1:新增状态变量

在类里定义全局布尔变量,标记攀爬状态:

private bool isClimbing = false;
private bool isAbleToClimbWall = false;

步骤2:修改Update逻辑

拆分Raycast判断和攀爬逻辑,区分准备阶段与攀爬阶段:

void Update()
{
    // 计算两个Raycast的检测结果
    bool ray1 = Physics.Raycast(transform.position + transform.up * -0.8f, transform.forward, 0.6f);
    bool ray2 = Physics.Raycast(transform.position + transform.up * 1f, transform.forward, 0.6f);

    // 准备攀爬阶段:必须双Raycast都检测到,才能激活攀爬权限
    if (!isClimbing)
    {
        isAbleToClimbWall = ray1 && ray2;
    }

    // 攀爬触发与持续逻辑
    if (isAbleToClimbWall && Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.F))
    {
        isClimbing = true;
        // 执行攀爬动作
        gravity = 0f;
        velocity.y = -2f;
        controller.Move(Vector3.up * Time.deltaTime * speed);
        
        // 攀爬中仅检查底部ray2,一旦ray2失效就退出攀爬
        if (!ray2)
        {
            isClimbing = false;
            isAbleToClimbWall = false;
            // 这里可添加恢复重力等默认状态的逻辑
        }
    }
    // 松开攀爬按键时,重置所有状态
    else if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.F))
    {
        isClimbing = false;
        isAbleToClimbWall = false;
        // 恢复重力等默认参数
        gravity = 9.8f; // 替换为你项目中的默认重力值
    }
}

关键逻辑说明

  • 准备阶段:只有ray1和ray2同时检测到物体,才允许触发攀爬
  • 攀爬阶段:进入攀爬状态后,不再校验ray1,仅通过ray2判断是否能继续攀爬;若ray2失效,直接退出攀爬
  • 退出攀爬:松开W/F任意按键时,重置状态回到准备阶段,下次攀爬需重新满足双Raycast条件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:08:21