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

Unity求助:实现单次可穿过的Puzzle Wall,穿过恢复为普通墙体

解谜墙体功能实现方案

需求说明

  • 仅带有Puzzle Wall标签的墙体允许玩家单次穿过
  • 玩家穿过该墙体后,墙体立即恢复为普通不可通行状态

原代码问题分析

  1. 事件绑定错误:直接通过ActivateWall("Puzzle Wall")绑定事件会立即执行方法,而非注册委托,无法正确传递参数
  2. 空引用异常:Start方法中先绑定事件再获取BoxCollider组件,此时组件未初始化,调用时会触发空引用
  3. 逻辑不严谨:未区分墙体标签,所有墙体都会被设置为可穿过,且未判断触发对象是否为玩家

修复后的可运行代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 18:05:42