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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:42:46