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

Unity解谜游戏:创建GameObject列表实现通关状态检测

Unity 解谜游戏:全交互目标销毁后解锁关卡出口实现

核心代码

1. 可交互对象组件

挂在所有需要玩家交互销毁的4个解谜对象上,负责标记自身交互状态:

using UnityEngine;

public class InteractablePuzzleObject : MonoBehaviour
{
    [HideInInspector]
    public bool isTriggeredDestroy = false;

    /// <summary>
    /// 玩家交互触发销毁时统一调用这个方法
    /// </summary>
    public void OnPlayerInteract()
    {
        if (isTriggeredDestroy) return;
        isTriggeredDestroy = true;
        
        // 这里替换成你自己的交互逻辑:播放破碎动画、音效、掉奖励等
        Destroy(gameObject);
    }
}

2. 关卡出口控制脚本

挂在出口对象或者独立的关卡管理器物体上,负责状态检测和解锁逻辑:

using System.Collections.Generic;
using UnityEngine;

public class LevelExitLock : MonoBehaviour
{
    [Tooltip("把4个需要销毁的解谜对象拖入这个列表")]
    public List<InteractablePuzzleObject> puzzleTargets = new List<InteractablePuzzleObject>(4);
    [Tooltip("出口的触发碰撞体,初始保持禁用")]
    public Collider exitTrigger;
    [Tooltip("解锁时显示的开门效果/提示UI")]
    public GameObject unlockFeedback;

    private void Start()
    {
        // 初始化出口为锁定状态
        exitTrigger.enabled = false;
        if(unlockFeedback != null) unlockFeedback.SetActive(false);
    }

    /// <summary>
    /// 每次有解谜对象被销毁时调用,检测是否全部完成
    /// </summary>
    public void CheckPuzzleComplete()
    {
        int completedCount = 0;
        foreach (var target in puzzleTargets)
        {
            // 兼容对象已被销毁、或已标记触发的状态
            if (target == null || target.isTriggeredDestroy)
            {
                completedCount++;
            }
        }

        if (completedCount == puzzleTargets.Count)
        {
            UnlockExit();
        }
    }

    private void UnlockExit()
    {
        exitTrigger.enabled = true;
        if (unlockFeedback != null) unlockFeedback.SetActive(true);
        // 可自行扩展:播放开门音效、弹出关卡提示等逻辑
    }
}

3. 玩家交互触发示例

挂在玩家的碰撞体上,触发交互时调用检测:

using UnityEngine;

public class PlayerInteract : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.TryGetComponent<InteractablePuzzleObject>(out var puzzleObj))
        {
            puzzleObj.OnPlayerInteract();
            // 触发交互后执行一次完成度检测
            FindObjectOfType<LevelExitLock>().CheckPuzzleComplete();
        }
    }
}

配置步骤

  • 给场景里4个需要交互销毁的解谜物体全部挂载InteractablePuzzleObject组件
  • 把LevelExitLock脚本挂在出口门物体上,将4个解谜对象依次拖入puzzleTargets列表,绑定出口碰撞体和解锁效果
  • 给玩家物体挂载碰撞体(勾选Is Trigger)和PlayerInteract脚本
  • 如果你的销毁逻辑有延迟(比如播放2秒破碎动画后才真正销毁物体),把CheckPuzzleComplete()的调用挪到动画结束的帧事件上即可,避免提前解锁

优化提示

  • 不要在Update里每帧轮询列表状态,事件触发式检测几乎没有性能开销
  • 列表初始化已经指定容量为4,避免运行时动态扩容产生多余GC
  • 检测逻辑同时判断空引用和状态标记,不会因为物体提前销毁抛空指针错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:57:23