SimpleSpriteSequence和getRandom

时间:2017-07-21 13:20:50

标签: c# unity3d

我有一个包含几个预制件的Gameobject,如下图所示 enter image description here

for

在下图中,我们看到了阵列的数量 enter image description here

public SimpleSpriteSequence birds;
Randomizer setBirds;
setBirds = new Randomizer(birds.sprites);
    int index = setBirds.getRandom();
    birds.setCurrentSpriteIndex(index);

现在在随机的帮助下,我从阵列中得到一只随机鸟。但问题是这只鸟可以重复。我想要的是在调用时连续至少6次("接口",1f);功能不重复鸟。原则上我必须这样做6次,鸟不重复。这些鸟是随机的,但是6次是不同的鸟类。不知道我是否正确解释了它,但我希望你理解这个想法。

2 个答案:

答案 0 :(得分:0)

这是代码,但它是在控制台应用程序中编写的,因为我没有您的代码,并且它是使用自定义类Birds编写的,但您将使其适应您的代码。如果您需要帮助,我会帮助您。

class Birds
{
    public int birdID;
    public string birdName;
    //public Sprite birdSprite;
}
class Program
{
    static Random rnd = new Random();
    static Birds[] birds = new Birds[10];
    static int nBirdsSpawned = 0;
    static List<int> spawnedBirds = new List<int>();

    static void Main(string[] args)
    {
        //Database of my birds ;)
        birds[0] = new Birds();
        birds[1] = new Birds();
        birds[2] = new Birds();
        birds[3] = new Birds();
        birds[4] = new Birds();
        birds[5] = new Birds();
        birds[6] = new Birds();
        birds[7] = new Birds();
        birds[8] = new Birds();
        birds[9] = new Birds();
        birds[0].birdID = 0;
        birds[0].birdName = "Bird 1";
        birds[1].birdID = 1;
        birds[1].birdName = "Bird 2";
        birds[2].birdID = 2;
        birds[2].birdName = "Bird 3";
        birds[3].birdID = 3;
        birds[3].birdName = "Bird 4";
        birds[4].birdID = 4;
        birds[4].birdName = "Bird 5";
        birds[5].birdID = 5;
        birds[5].birdName = "Bird 6";
        birds[6].birdID = 6;
        birds[6].birdName = "Bird 7";
        birds[7].birdID = 7;
        birds[7].birdName = "Bird 8";
        birds[8].birdID = 8;
        birds[8].birdName = "Bird 9";
        birds[9].birdID = 9;
        birds[9].birdName = "Bird 10";

        int i = 0;
        while (i < 100)
        {
            RandomSpawn();
            i++;
        }

        Console.Write("Finished");
        Console.ReadKey();
    }

    static void CheckForBirdSpawn(int birdID)
    {
        if (nBirdsSpawned <= 6)
        {
            if (!spawnedBirds.Contains(birdID))
            {
                spawnedBirds.Add(birdID);
                SpawnBird(birdID);
            }
            else
            {
                Console.WriteLine("Bird " + birds[birdID].birdName + " is already spawned!");
            }
        }
        else
        {
            SpawnBird(birdID);
        }
    }

    static void SpawnBird(int birdID)
    {
        Console.WriteLine(birds[birdID].birdName);
        nBirdsSpawned++;
    }

    static void RandomSpawn()
    {
        int r = rnd.Next(0, 10);

        CheckForBirdSpawn(r);
    }
}

直到产生前6只鸟,它会检查是否已经产卵,如果是,它不允许它产卵。产卵6只后,每只鸟都会产卵。

以下是控制台应用中的输出:

enter image description here

答案 1 :(得分:0)

我知道这主要是代码回复,但你怎么试试这样的东西?

  1. 填充鸟类指数列表。
  2. 在该列表中选择一个随机索引。
  3. 减少所有已经产卵的鸟类的价值观。
  4. 如果任何值达到零,请将birds索引重新添加到availableBird列表中。
  5. 产生这只鸟,同时将它的索引添加为Key,产生延迟所需的量,直到它再次作为值产生。
  6. 从列表中删除鸟类索引。
  7. 在必要时进行生成,这将产生每一帧,因为它在具有无限while循环的Coroutine中找到。

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class burd : MonoBehaviour {
        public bool spawning;
        private System.Random rnd = new System.Random();
    
        private Dictionary<int, int> spawnedBurdies = new Dictionary<int, int>();
        private List<int> availableBurdies = new List<int>();
    
        // Use this for initialization
        void Start () {
            for (int index = 0; index < 10; index++)
            {
                availableBurdies.Add(index);
            }
            StartCoroutine(SpawnBurdies());
        }
    
        private IEnumerator SpawnBurdies()
        {
            while (true)
            {
                if (spawning)
                {
                    int burdIndex = rnd.Next(availableBurdies.Count);
                    spawnBurd(availableBurdies[burdIndex]);
                    availableBurdies.RemoveAt(burdIndex);
                }
                yield return new WaitForFixedUpdate();
            }
        }
    
        private void spawnBurd(int burdIndex)
        {
            Debug.Log("Spawned burd #" + burdIndex);
            List<int> burdieKeys = new List<int>();
    
            foreach (var burdie in spawnedBurdies) { burdieKeys.Add(burdie.Key); }
    
            foreach (var burdieKey in burdieKeys)
            {
                spawnedBurdies[burdieKey]--;
                if(spawnedBurdies[burdieKey] <= 0)
                {
                    spawnedBurdies.Remove(burdieKey);
                    availableBurdies.Add(burdieKey);
                }
            }
    
            spawnedBurdies.Add(burdIndex, 6);
        }
    }
    

    此解决方案可以避免您尝试产生无法生成的鸟类;但是如果鸟类数量少于等待的最小生成数量,则会抛出超出范围的参数。