Unity 2D无尽跑酷如何实现自动停用已超过平台的销毁器功能
问题根因
你遇到的功能失效问题核心来自两个常见的操作错误:
- 你直接将预制体资源拖入了
objs列表,而非运行时生成的平台实例。修改预制体的激活状态后,后续基于该预制体生成的新实例会默认继承非激活状态,看起来就是处理完第一个同类平台后功能就失效了。 - 你没有将运行时动态生成的平台实例添加到
objs列表中,列表仅包含初始的几个对象,处理完成后就没有新对象可以检测了。
你之前写的while循环导致Unity崩溃,是因为没有加等待逻辑,死循环会占满主线程直接卡住程序。
修复步骤
- 先清空Inspector面板中
objs列表里的所有预制体资源,不要直接拖预制体进入列表。 - 修改你的平台生成代码,每次实例化新平台后,将生成的实例添加到
objs列表中,示例逻辑如下:
// 你原来生成平台的逻辑 GameObject newPlatform = Instantiate(你的平台预制体, 生成坐标, Quaternion.identity); // 新增这行,把新生成的实例加入检测列表 FindObjectOfType<DistruttoreLivelli>().objs.Add(newPlatform);
- 替换原有
DistruttoreLivelli脚本的代码,优化检测逻辑避免性能浪费,修复后的代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DistruttoreLivelli : MonoBehaviour { public List<GameObject> objs = new List<GameObject>(); // 检测间隔,2D跑酷0.1秒检测一次完全足够,不用每帧遍历 public float checkInterval = 0.1f; void Start() { StartCoroutine(CheckPlatforms()); } IEnumerator CheckPlatforms() { // 循环检测,每次检测完等待指定间隔,不会造成死循环崩溃 while (true) { // 倒序遍历,后续要移除元素也不会出现索引错乱 for (int i = objs.Count - 1; i >= 0; i--) { // 空引用保护,避免对象意外销毁报错 if (objs[i] == null) { objs.RemoveAt(i); continue; } // 已经非激活的平台直接跳过,不用重复处理 if (!objs[i].activeSelf) continue; if (objs[i].transform.position.x < transform.position.x) { objs[i].SetActive(false); // 如果你不需要复用这个平台,可取消注释下面的代码直接从列表移除,减少遍历压力 // objs.RemoveAt(i); } } yield return new WaitForSeconds(checkInterval); } } }
补充说明
如果你要做平台对象池复用非激活的平台,不要移除列表中的非激活元素即可,代码已经做了跳过处理,不会影响性能。
内容的提问来源于stack exchange,提问作者leonardo moreo
相关产品推荐
相关产品推荐

