Unity点击屏幕单次生成GameObject问题求助:多次实例化故障
解决点击屏幕重复生成GameObject的问题
问题根源
你的代码里Update()方法中的循环完全多余(for (int i = 0; i < 1; i++)仅执行一次,和直接写if判断无区别),但重复生成的核心原因通常是以下两种:
- 该脚本被挂载到了多个游戏对象上,每个脚本实例都会在点击时执行一次实例化
ScreenToWorldPoint未设置正确的Z轴值,导致生成的对象看似重复,实际处于不同Z轴位置
修复步骤
1. 移除无用循环,修正坐标转换
先删掉多余循环,同时确保屏幕坐标转世界坐标时Z轴值正确(保证生成对象在相机可视范围内):
[SerializeField] GameObject spawnObject; void Update() { if (Input.GetMouseButtonDown(0)) { // 取相机Z轴绝对值作为生成距离,确保对象在相机前方可视区域 Vector3 touchPos = Camera.main.ScreenToWorldPoint( new Vector3(Input.mousePosition.x, Input.mousePosition.y, Mathf.Abs(Camera.main.transform.position.z)) ); Instantiate(spawnObject, touchPos, Quaternion.identity); } }
2. 检查脚本挂载情况
- 在Hierarchy面板搜索该脚本名称,确认仅有一个游戏对象挂载了此脚本
- 若不小心挂载到多个对象上,删除多余的挂载实例
3. 可选:添加生成锁(绝对防重复)
如果需要彻底避免重复生成(比如防止输入延迟或误触),可以添加布尔锁控制:
[SerializeField] GameObject spawnObject; private bool canSpawn = true; void Update() { if (Input.GetMouseButtonDown(0) && canSpawn) { Vector3 touchPos = Camera.main.ScreenToWorldPoint( new Vector3(Input.mousePosition.x, Input.mousePosition.y, Mathf.Abs(Camera.main.transform.position.z)) ); Instantiate(spawnObject, touchPos, Quaternion.identity); canSpawn = false; // 若需允许再次点击生成,取消下方注释并设置延迟时间 // Invoke(nameof(ResetSpawnPermission), 0.5f); } } // 可选:重置生成权限的方法 private void ResetSpawnPermission() { canSpawn = true; }
关键注意点
ScreenToWorldPoint的Z轴参数必须是相机到生成平面的距离,否则生成的对象会处于相机位置,导致视觉上重叠或看似未生成- 不要在
Update()中编写无意义的循环,既浪费性能又容易混淆逻辑
内容的提问来源于stack exchange,提问作者P D
相关产品推荐
相关产品推荐

