123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using System;
- /// <summary>
- /// 掉落管理者
- /// </summary>
- public class DropManager : MonoBehaviour
- {
- /// <summary>
- /// 单键
- /// </summary>
- private static DropManager m_Instance;
- private int _mapId;
- private float _refreshItemTime = 1.0f;
- private float _nowRefreshTime = 0.0f;
- /// <summary>
- /// 掉落道具
- /// </summary>
- private List<DropItemAuto> dropItems = new List<DropItemAuto>();
- /// <summary>
- /// 统计的掉落道具
- /// </summary>
- public static Dictionary<int, ItemVo> statisticsItems = new Dictionary<int, ItemVo>();
- 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;
- }
- }
- /// <summary>
- /// 单键
- /// </summary>
- public static DropManager Instance
- {
- get
- {
- if (m_Instance == null)
- {
- GameObject obj = new GameObject("DropManager");
- DontDestroyOnLoad(obj);
- if (obj)
- {
- m_Instance = obj.AddComponent<DropManager>();
- 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);
- }
- /// <summary>
- /// 初始化
- /// </summary>
- public void Init()
- {
- dropItems.Clear();
- }
- /// <summary>
- /// 新的掉落 世界中的所有掉落 指定道具 位置
- /// </summary>
- /// <param name="itemId"></param>
- /// <param name="num"></param>
- /// <param name="pos"></param>
- 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);
- }
- }
- }
- /// <summary>
- /// 新的掉落 怪物死亡 爆宝掉落
- /// </summary>
- /// <param name="dropId"></param>
- /// <param name="pos"></param>
- 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<GameObject>("diaoluo"));
- obj.SetActive(true);
- obj.transform.position = pos;
- obj.transform.Rotate(Vector3.up, UnityEngine.Random.Range(0, 180));
- Animator anim = obj.GetComponent<Animator>();
- anim.Play("diaoluo");
- DropEffectNode[] nodeList = obj.GetComponentsInChildren<DropEffectNode>();
- 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<GameObject>("diaoluo"));
- obj.SetActive(true);
- obj.transform.position = pos;
- obj.transform.Rotate(Vector3.up, UnityEngine.Random.Range(0, 180));
- Animator anim = obj.GetComponent<Animator>();
- anim.Play("diaoluo");
- DropEffectNode[] nodeList = obj.GetComponentsInChildren<DropEffectNode>();
- 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]);
- }
- }
-
- });
- }
- /// <summary>
- /// 删除道具
- /// </summary>
- /// <param name="auto"></param>
- public void RemoveDropItem(DropItemAuto auto)
- {
- dropItems.Remove(auto);
- Destroy(auto.gameObject);
- }
- /// <summary>
- /// 一件回收所有未捡的掉落道具
- /// </summary>
- 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 + "<color=#ffff00ff>x" + item.count + "</color>";
- 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 + " <color=#ffffffff>" + item.count + "</color>";
- }
- 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<DropItemAuto>();
- 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);
-
- }
- });
- }
- }
|