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

