如何防止同一预制件在Unity中连续产生两次

问题描述 投票:0回答:2

[Unity初学者,我在Unity中有一个随机的预制生成器附加到我的游戏中,该生成器随机生成3个预制体。问题是,有时我会连续获得5次相同的预制件。如何防止同一预制件连续产生两次?这是我的代码:

public class randomspawnscript : MonoBehaviour
{
    public GameObject prefab1, prefab2, prefab3;


    public float spawnRate = 2f;

    float nextSpawn = 0f;

    int whatToSpawn;

    void Update()
    {
        if (collisionbutton.end != true || gameoverscreenrestart.restartPressed==true || gameovermainmenu.menuPressed==true)
        {
            if (Time.time > nextSpawn)
            {
                whatToSpawn = Random.Range(1, 4);
                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;
        }   
    }
}
unity3d spawn
2个回答
0
投票

好吧,只需声明一下,即可将新的随机预制件与先前的随机预制件进行检查。对于惰性代码,您可以只

GameObject previousPrefab;

并且在随机化中,将previousPrefab设置为随机化的预制。

,然后在下一个随机化中,检查前一个Prefab == randomizedPrefab,如果是,再次随机。

^为了实现这样的目标,您还必须在Update()部分中创建一个方法,并在Update()中对其进行调用,因此,如果previousPrefab与随机化的对象相同,则可以再次调用该方法。


0
投票

使用Unity的内置随机系统的简单方法是创建可能生成的数字的列表,然后从该列表中选择一个随机数,如下所示:

public class randomspawnscript : MonoBehaviour {
    public GameObject prefab1, prefab2, prefab3;

    public float spawnRate = 2f;

    float nextSpawn = 0f;

    int whatToSpawn;

    private void Awake() {
        // To not get a null ref error when generating the controlled random
        // for the first time.
        whatToSpawn = 0;
    }

    void Update() {
        if (/* ... */) {
            if (Time.time > nextSpawn) {
                whatToSpawn = GetControlledRandom();
                Debug.Log(whatToSpawn);

                switch (whatToSpawn) {
                    //...
                }
                nextSpawn = Time.time + spawnRate;
            }
        } else {
            return;
        }
    }

    int GetControlledRandom() {
        List<int> possibleChoices = new List<int> {
            1, 2, 3
        };

        // Removes what was spawned before from the possible choices.
        possibleChoices.Remove(whatToSpawn);

        return possibleChoices[Random.Range(0, possibleChoices.Count)];
    }
}

Alternative,更简单的方法是一直生成一个数字,直到获得满意的数字为止,例如:

    int RetardedControlledRandom() {
        int generatedNumber;
        do {
            generatedNumber = Random.Range(1, 4);
        } while (generatedNumber == whatToSpawn);

        return generatedNumber;
    }

[This可以帮助您决定使用.NET提供的System.Random

© www.soinside.com 2019 - 2024. All rights reserved.