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

Unity新手求助:如何避免同一预制体连续生成两次?

解决Unity随机预制体连续重复生成的问题

嘿,这个问题很好解决~你的核心问题是没有记录上一次生成的预制体编号,所以每次随机都有可能和上一次撞车,咱们只需要加个变量记住上一次选的是什么,然后生成新随机数的时候避开它就行了。

原代码的问题点

你当前的whatToSpawn = Random.Range(1, 4);是完全无限制的随机,没有任何排除逻辑,所以连续生成同一个预制体是概率范围内的正常情况,撞上并不奇怪。

修改后的完整代码

public class randomspawnscript : MonoBehaviour { 
    public GameObject prefab1, prefab2, prefab3; 
    public float spawnRate = 2f; 
    float nextSpawn = 0f; 
    int whatToSpawn;
    // 新增变量:记录上一次生成的预制体编号
    private int lastSpawned = 0;

    void Update() { 
        if (collisionbutton.end != true || gameoverscreenrestart.restartPressed==true || gameovermainmenu.menuPressed==true) { 
            if (Time.time > nextSpawn) { 
                // 用do-while循环,直到生成和上次不同的编号
                do {
                    whatToSpawn = Random.Range(1, 4);
                } while (whatToSpawn == lastSpawned);

                // 记录这次的编号,下次用它来排除重复
                lastSpawned = whatToSpawn;

                Debug.Log(whatToSpawn); 
                switch (whatToSpawn) { 
                    case 1: Instantiate(prefab1, transform.position, Quaternion.identity); break; 
                    case 2: Instantiate(prefab2, transform.position, Quaternion.identity); break; 
                    case 3: Instantiate(prefab3, transform.position, Quaternion.identity); break; 
                } 
                nextSpawn = Time.time + spawnRate; 
            } 
        } else { 
            return; 
        } 
    } 
}

关键修改说明

  • 新增private int lastSpawned = 0;:初始化设为0是因为你的随机范围是1-3,第一次生成的编号肯定不会和0重复,完美避开第一次的重复问题。
  • 用do-while循环生成随机数:先生成一次编号,然后判断是否和上一次的编号重复,如果重复就重新生成,直到得到不一样的编号。这样就能绝对避免连续两次生成同一个预制体的情况。

小额外建议:如果以后预制体数量变多,建议把预制体放进一个List<GameObject>集合里,通过索引来随机选择,代码会更简洁易维护哦~

内容的提问来源于stack exchange,提问作者vaso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:07:44