Unity 2D触摸触发物体替换时重复克隆大量相同物体问题

问题说明
开发Unity 2D游戏过程中,需要将场景内的破损桌子替换为完好版本,但触摸触发替换逻辑后,完好桌子会在背景区域重复生成多次,原实现代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ReplaceObjects : MonoBehaviour { public GameObject Broken_Table; public GameObject Table; private bool used = false; void Start() { } void Update() { if (Input.touchCount > 0) { GameObject broken_Table = Instantiate(Broken_Table) as GameObject; GameObject table = Instantiate(Table) as GameObject; Replace(broken_Table, table); used = true; } } void Replace(GameObject obj1, GameObject obj2) { Instantiate(obj2, obj1.transform.position, obj1.transform.rotation); Destroy(obj1); } }
问题根因
代码存在4处逻辑错误,直接导致重复生成问题:
- 定义的
used状态标记完全没做拦截判断,只要屏幕存在触摸,Update每帧都会执行生成逻辑,触摸持续的数十帧内会批量生成冗余对象 - 未做触摸阶段校验,只要手指按在屏幕上,不管是刚按下、持续按住还是抬起阶段都会触发逻辑,没有限定为单次触摸触发
- 存在重复实例化逻辑:
Update中已经实例化了破损桌子、完好桌子各1次,调用Replace方法时又额外实例化1次完好桌子,单次触发就会生成3个冗余对象 - 未做触摸命中检测:只要屏幕有任意触摸就触发逻辑,完全没校验触摸位置是否点中了破损桌子,生成的对象会出现在默认坐标也就是背景区域。
修复实现
- 前置配置:给场景内的破损桌子添加2D碰撞体组件,给主相机添加
Physics 2D Raycaster组件,将修复后的脚本挂在破损桌子对象上,在Inspector面板拖入完好桌子的预制体引用。 - 核心逻辑调整:加单次触发拦截、去掉多余实例化、用点击/触摸命中检测判定是否点中目标物体,替换时直接在当前破损桌子坐标生成完好桌子后销毁自身即可。
修复后代码:
using UnityEngine; public class ReplaceObjects : MonoBehaviour { public GameObject intactTable; private bool _hasReplaced = false; // 触摸/点击命中当前物体时触发 void OnMouseDown() { // 已经完成替换就直接返回,避免重复执行 if (_hasReplaced) return; // 在当前破损桌子的位置和旋转角度生成完好桌子 Instantiate(intactTable, transform.position, transform.rotation); // 销毁当前破损桌子 Destroy(gameObject); // 标记已替换状态 _hasReplaced = true; } }
如果需要适配移动端多点触控的特殊逻辑,可将触发逻辑改到
Update中,判断触摸阶段为TouchPhase.Began时发射2D射线,检测命中当前破损桌子后再执行替换即可,核心要保留单次触发拦截逻辑,禁止每帧重复执行实例化操作。
内容的提问来源于stack exchange,提问作者Jaafar Ben Bouker
相关产品推荐
相关产品推荐

