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); }