Unity求助:实现单次可穿过的Puzzle Wall,穿过恢复为普通墙体
解谜墙体功能实现方案
需求说明
- 仅带有
Puzzle Wall标签的墙体允许玩家单次穿过 - 玩家穿过该墙体后,墙体立即恢复为普通不可通行状态
原代码问题分析
- 事件绑定错误:直接通过
ActivateWall("Puzzle Wall")绑定事件会立即执行方法,而非注册委托,无法正确传递参数 - 空引用异常:
Start方法中先绑定事件再获取BoxCollider组件,此时组件未初始化,调用时会触发空引用 - 逻辑不严谨:未区分墙体标签,所有墙体都会被设置为可穿过,且未判断触发对象是否为玩家
修复后的可运行代码
using UnityEngine; public class PuzzleWall : MonoBehaviour { private BoxCollider boxCollider; // 标记是否已被穿过,防止重复触发 private bool hasBeenPassed = false; void Start() { // 先获取组件,避免空引用 boxCollider = GetComponent<BoxCollider>(); // 用Lambda表达式包装方法,解决事件传参问题 Puzzle.OnPuzzleSolved += () => ActivateWall("Puzzle Wall"); } // 响应解谜完成事件,设置墙体可穿过状态 private void ActivateWall(string wallTypeToActivate) { // 仅当墙体是Puzzle Wall且未被穿过时,设置为触发器 if (wallTypeToActivate == "Puzzle Wall" && gameObject.CompareTag("Puzzle Wall") && !hasBeenPassed) { boxCollider.isTrigger = true; } } // 玩家穿过墙体后恢复碰撞 private void OnTriggerExit(Collider other) { // 仅处理玩家对象,且墙体未被穿过 if (other.CompareTag("Player") && !hasBeenPassed) { boxCollider.isTrigger = false; hasBeenPassed = true; } } }
代码关键说明
- 调整组件获取顺序:先获取
BoxCollider再绑定事件,彻底避免空引用异常 - 使用Lambda表达式:解决事件委托无法直接传参的问题,正确注册事件响应
- 标签校验:仅对
Puzzle Wall标签的墙体生效,避免影响其他墙体 - 状态标记:添加
hasBeenPassed变量,确保墙体仅能被单次穿过,防止重复触发
内容的提问来源于stack exchange,提问作者Demarcus The Dev
相关产品推荐
相关产品推荐

