Example #1
0
        public GameObject SpawnWeighted(Vector3 position, Quaternion rotation, params string[] ValidKeys)
        {
            int ChooseIndex(float[] probs)
            {
                float total = 0;

                foreach (float elem in probs)
                {
                    total += elem;
                }

                float randomPoint = Random.value * total;

                for (int i = 0; i < probs.Length; i++)
                {
                    if (randomPoint < probs[i])
                    {
                        return(i);
                    }
                    else
                    {
                        randomPoint -= probs[i];
                    }
                }
                return(probs.Length - 1);
            }

            RecycleBin[] validBins = runtimeRecycleBins.Where((KeyValuePair <string, RecycleBin> recycleBinItem)
                                                              => ValidKeys.Any((string key) => key.Equals(recycleBinItem.Key))).
                                     Select((KeyValuePair <string, RecycleBin> recycleBinItem) => recycleBinItem.Value).ToArray();

            if (validBins == null || validBins.Length <= 0)
            {
                Debug.LogError($"[{GetType().Name}] No Valid ObjectPool found with the given keys.");
                return(null);
            }

            int[] priorities  = validBins.Select((RecycleBin bb) => bb.Priority).ToArray();
            int   total_value = priorities.Sum();

            float[] probabilities = priorities.Select((int priority) => (priority / (float)total_value)).ToArray();

            RecycleBin selected_bin = validBins[ChooseIndex(probabilities)];

            GameObject clone = selected_bin.Spawn(position, rotation);

            if (clone != null)
            {
                int _id = clone.GetInstanceID();

                if (!ObjectPoolData.ContainsKey(_id))
                {
                    ObjectPoolData.Add(_id, selected_bin.Label);
                }
            }

            return(clone);
        }