如何在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
相关产品推荐
相关产品推荐

