using System.Collections.Generic; using UnityEngine; namespace GFGGame { public class DropOutDataCache { private static Dictionary> _probDic = new Dictionary>(); public static List GetDropItemDatas(int[] dropIds, bool doRandome) { List result = new List(); foreach (int dropId in dropIds) { ItemData itemData = GetDropItemData(dropId, doRandome); if (itemData != null) { result.Add(itemData); } } return result; } public static List GetDropItemDatas(int dropId, int count) { List result = new List(); int tryCount = 0; while(result.Count < count && tryCount < 1000) { ItemData itemData = GetDropItemData(dropId, true); if(itemData != null) { result.Add(itemData); } tryCount++; } return result; } public static ItemData GetDropItemData(int dropId, bool doRandome) { ItemData itemData = null; List dropOutDatas = null; if(!_probDic.ContainsKey(dropId)) { InitData(dropId); } dropOutDatas = _probDic[dropId]; if(dropOutDatas != null) { float result = Random.Range(0, 1f); foreach(DropOutData dropOutData in dropOutDatas) { if(result <= dropOutData.WeightEnd || !doRandome) { return GetItemData(dropOutData.dropOutCfg, doRandome); } } } return itemData; } private static void InitData(int dropId) { List dropOutDatas = new List(); _probDic[dropId] = dropOutDatas; var arr = DropOutCfgArray.Instance.GetCfgs(dropId); List cfgs = new List(arr); float totalWeight = 0; foreach(DropOutCfg cfg in cfgs) { totalWeight += cfg.weight; } float weightEnd = 0; foreach(DropOutCfg cfg in cfgs) { DropOutData dropOutData = new DropOutData(); dropOutData.dropOutCfg = cfg; weightEnd += cfg.weight; dropOutData.WeightEnd = weightEnd/totalWeight; dropOutDatas.Add(dropOutData); } } private static ItemData GetItemData(DropOutCfg dropOutCfg, bool doRandomeNum) { if(dropOutCfg.item >= 10000000)//掉落id { return GetDropItemData(dropOutCfg.item, doRandomeNum); } else if(dropOutCfg.item > 0) { int num = dropOutCfg.maxNum; if(doRandomeNum) { num = Random.Range(dropOutCfg.minNum, dropOutCfg.maxNum + 1); } if(num > 0) { ItemData itemData = ItemDataPool.GetItemData(dropOutCfg.item); itemData.num = num; return itemData; } } return null; } } }