using System.Collections; using System.Collections.Generic; using UnityEngine; using System; /// /// 掉落管理者 /// public class DropManager : MonoBehaviour { /// /// 单键 /// private static DropManager m_Instance; private int _mapId; private float _refreshItemTime = 1.0f; private float _nowRefreshTime = 0.0f; /// /// 掉落道具 /// private List dropItems = new List(); /// /// 统计的掉落道具 /// public static Dictionary statisticsItems = new Dictionary(); public int MapId { get { return this._mapId; } set { this._mapId = value; } } private string _dropStr = ""; public string DropStr { get { return this._dropStr; } set { this._dropStr = value; } } /// /// 单键 /// public static DropManager Instance { get { if (m_Instance == null) { GameObject obj = new GameObject("DropManager"); DontDestroyOnLoad(obj); if (obj) { m_Instance = obj.AddComponent(); m_Instance.Init(); } else { Debug.LogError("DropManager 初始化失败!!!"); } } return m_Instance; } } public void Update() { if (_nowRefreshTime < _refreshItemTime) { _nowRefreshTime += Time.deltaTime; if (_nowRefreshTime >= _refreshItemTime) { RefreshItem(); } } } public void RefreshItem() { _nowRefreshTime = 0; ItemProxy.Instance.AddItem(0, 0); } /// /// 初始化 /// public void Init() { dropItems.Clear(); } /// /// 新的掉落 世界中的所有掉落 指定道具 位置 /// /// /// /// public void DropWorldItem(int itemId, int num, Vector3 pos, DropEffectNode node = null) { ItemVo itemVO = new ItemVo(); itemVO.typeId = itemId.ToString(); itemVO.count = num; SetDropItemData(itemVO, pos, node); if (statisticsItems.ContainsKey(itemId)) { statisticsItems[itemId].count += num; } else { // 血瓶蓝瓶不统计 if (itemVO.nMo.subType != 341 && itemVO.nMo.subType != 342) { statisticsItems.Add(itemId, itemVO); } } } /// /// 新的掉落 怪物死亡 爆宝掉落 /// /// /// public void DropItems(int dropId, Vector3 pos) { ResourceHelper.Instance.LoadAssetBundle("diaoluo", (ab) => { sm_drop drop = sm_drop.GetMoById(dropId); if (drop == null) { return; } string[] randItems = drop.randItems.Split(';'); string[] assignItems = drop.assignItems.Split(';'); for(int c = 0; c < randItems.Length / 8 + 1; ++c) { if (drop.randItems == "") { break; } GameObject obj = Instantiate(ab.LoadAsset("diaoluo")); obj.SetActive(true); obj.transform.position = pos; obj.transform.Rotate(Vector3.up, UnityEngine.Random.Range(0, 180)); Animator anim = obj.GetComponent(); anim.Play("diaoluo"); DropEffectNode[] nodeList = obj.GetComponentsInChildren(); for (int i = c * 8; i < (c + 1) * 8 && i < randItems.Length; ++i) { int contrast = UnityEngine.Random.Range(0, 10000); string[] randData = randItems[i].Split(','); string[] itemIdList = randData[0].Split('_'); int itemId = int.Parse(itemIdList[UnityEngine.Random.Range(0, itemIdList.Length - 1)]); int itemMixNum = int.Parse(randData[1]); int itemMaxNum = int.Parse(randData[2]); int itemProbability = (int)(float.Parse(randData[3]) * 100); if (contrast < itemProbability) { int val = UnityEngine.Random.Range(itemMixNum, itemMaxNum); DropWorldItem(itemId, val, pos, nodeList[i % 8]); } } } for (int c = 0; c < assignItems.Length / 8 + 1; ++c) { if (drop.assignItems == "") { break; } GameObject obj = Instantiate(ab.LoadAsset("diaoluo")); obj.SetActive(true); obj.transform.position = pos; obj.transform.Rotate(Vector3.up, UnityEngine.Random.Range(0, 180)); Animator anim = obj.GetComponent(); anim.Play("diaoluo"); DropEffectNode[] nodeList = obj.GetComponentsInChildren(); for (int i = c * 8; i < (c + 1) * 8 && i < assignItems.Length; ++i) { string[] randData = assignItems[i].Split(','); string[] itemIdList = randData[0].Split('_'); int itemId = int.Parse(itemIdList[UnityEngine.Random.Range(0,itemIdList.Length - 1)]); int itemMixNum = int.Parse(randData[1]); int itemMaxNum = int.Parse(randData[2]); int val = UnityEngine.Random.Range(itemMixNum, itemMaxNum); DropWorldItem(itemId, val, pos, nodeList[i % 8]); } } }); } /// /// 删除道具 /// /// public void RemoveDropItem(DropItemAuto auto) { dropItems.Remove(auto); Destroy(auto.gameObject); } /// /// 一件回收所有未捡的掉落道具 /// public void OneKeyGetAllDropItem() { for (int i = 0; i < dropItems.Count; i++) { if (dropItems[i] != null) { ItemProxy.Instance.AddItem(int.Parse(dropItems[i].mItemVo.typeId), dropItems[i].mItemVo.count); Destroy(dropItems[i].gameObject); } } dropItems.Clear(); // 立马刷新 ItemProxy.Instance.AddItem(0, 0); } public void SetDropItemData(ItemVo item, Vector3 pos, DropEffectNode node = null) { string iconPrefixStr = null; if (item.nMo == null) { LogHelper.LogError("未知的掉落道具:" + item.typeId); return; } // 道具名称 string showName = item.nMo.name; switch ((EItemSubType)item.nMo.subType) { case EItemSubType.Weapon: AudioManager.Instance.PlayUISoundEffect("装备掉落"); iconPrefixStr = IconPrefixConst.YLIcon; break; case EItemSubType.Gold: // 金币 case EItemSubType.Gem: // 钻石 AudioManager.Instance.PlayUISoundEffect("金币掉落"); iconPrefixStr = IconPrefixConst.YLIcon; showName = showName + "x" + item.count + ""; break; case EItemSubType.Segment: // 碎片 case EItemSubType.BuffCard: // 消耗品 | 经验卡 case EItemSubType.Package: // 消耗品 | 礼包 case EItemSubType.Pill: // 药品(体力) case EItemSubType.Gene: // 基础材料 | 基因(角色经验丹) { AudioManager.Instance.PlayUISoundEffect("材料掉落"); iconPrefixStr = IconPrefixConst.YLIcon; } break; case EItemSubType.StrengthStone: // 基础材料 | 强化石(用于武器、言灵强化) { AudioManager.Instance.PlayUISoundEffect("装备掉落"); iconPrefixStr = IconPrefixConst.YLIcon; } break; case EItemSubType.AdvancedStone: // 进阶材料 | 进阶石(用于武器、言灵升阶) { AudioManager.Instance.PlayUISoundEffect("装备掉落"); iconPrefixStr = IconPrefixConst.YLIcon; } break; case EItemSubType.AdvancedFineStone: // 进阶材料 | 进阶 精华石(用于武器、言灵的升阶) case EItemSubType.ForgingMaterial: // 锻造材料 | 用于武器言灵锻造 case EItemSubType.Box: case EItemSubType.BattleItem_HP: // 战场道具 | 血瓶 case EItemSubType.BattleItem_MP: // 战场道具 | 蓝瓶 case EItemSubType.BattleItem_Box: // 战场道具 | 箱子 { AudioManager.Instance.PlayUISoundEffect("材料掉落"); iconPrefixStr = IconPrefixConst.YLIcon; } break; case EItemSubType.YanLing: // 言灵 { AudioManager.Instance.PlayUISoundEffect("装备掉落"); iconPrefixStr = IconPrefixConst.YanLingIcon; } break; } if((EItemSubType)item.nMo.subType != EItemSubType.Gold && item.count > 1) { showName = showName + " " + item.count + ""; } Material material = new Material(Shader.Find("Mobile/Particles/Alpha Blended")); string dropName = item.nMo.pfbRes; if(dropName == "") { dropName = "Drop_Card_White"; } ResourceHelper.Instance.LoadAssetBundle(dropName, (AssetBundle bundle) => { if (bundle != null) { GameObject itemObj = (GameObject)Instantiate(bundle.LoadAsset(dropName), transform, false); DropItemAuto auto = itemObj.AddComponent(); itemObj.name = iconPrefixStr + "_" + item.nMo.typeId; itemObj.transform.position = pos + Vector3.up * 0.5f; itemObj.SetActive(true); auto.Init(HeroPlayerController.Instance.m_Hero.transform, item); // 散落机制 if (node) { node.SetDropItem(itemObj.transform); } HpbarManager.Instance.ShowItemName(itemObj.transform, showName, item.nMo.quality); dropItems.Add(auto); } }); } }