//从待拾取装备列表添加装备到背包中 void AddItemFromColect(object equipItem) { //将equiipItem类型转变为bagItemInfo //Debug.Log("开始挂载"); BaseItem it = (BaseItem)equipItem; if (it.type == EquipType.weapon_gun || it.type == EquipType.weapon_steel) { DataBaseManager.GunDBItem gunItem = DataBaseManager.Instance.GunItemDic[it.id]; Debug.Log(gunItem.prefabPath); AddGun(gunItem); } else { AddItem((BaseItem)equipItem); } }
//添加装备,主武器 public bool AddGun(DataBaseManager.GunDBItem it) { //查看主武器槽的挂载情况 int firstEmptySlot = -1; int slotCount = m_equipModel.gunSlots.Count; for (int i = 0; i < slotCount; i++) { if (m_equipModel.gunSlots[i].isEmpty == true) { firstEmptySlot = i; break; } } //有空位 if (firstEmptySlot != -1) { //初始化item并挂载 InitGunItem(it, firstEmptySlot); } //没有空位,此时可以确定每个槽都挂载了item else { //最后一个武器出队 Debug.Log("没有空位了"); GunItem lastItem = m_equipModel.gunItems[slotCount - 1]; //将物体放回场景中 Debug.Log(lastItem.id); Vector3 pos = AvatarInfoManager.Instance.GetAvatarTransform().position; ResManager.Instance.CreateGameObject(lastItem.ScenePrefabPath, new Vector3(pos.x, -0.8f, pos.z), new PickInfo(lastItem.id, null, lastItem.type)); //被丢弃的枪支内的装备放回背包中 var equipList = lastItem.equipItems.GetEnumerator(); while (equipList.MoveNext()) { Debug.Log("equipItems Keys:" + equipList.Current.Key); EquipItemToBagItem(lastItem, equipList.Current.Key, false); } //删除物体 GameObject.Destroy(lastItem.slotTrans.gameObject); //从字典中移除 m_equipModel.gunItems.Remove(slotCount); //从后往前进行数据交换 for (int i = slotCount - 2; i >= 0; i--) { GunItem item = new GunItem(m_equipModel.gunItems[i]); //Debug.Log(i+" "+item.name); m_equipModel.gunItems[i + 1] = item; //更新枪支装备槽的parentId,parentId记录字典key值 var enumerator = item.equipSlots.GetEnumerator(); while (enumerator.MoveNext()) { enumerator.Current.Value.info.parentId = i + 1; } //重新挂载 item.slotTrans.SetParent(m_equipModel.gunSlots[i + 1].transform, false); item.slotTrans.localPosition = Vector3.zero; //更新人物枪支数值 LiteEventManager.Instance.TriggerEvent(EquipType.weapon_gun, new ValueInfo <int, int, float, int>(i + 1, item.hurtNum, item.steadyNum, item.capacity)); } //将新加入的item挂载在第一个槽上 InitGunItem(it, 0); } //测试 //var enumerator = m_equipModel.gunItems.GetEnumerator(); //while (enumerator.MoveNext()) //{ // Debug.Log("第" + enumerator.Current.Key.ToString() + "个item:" + m_equipModel.gunItems[enumerator.Current.Key].name); //} return(true); }
//根据传入it的信息,初始化一个gunItem,slotNum为挂载在第几个槽 private void InitGunItem(DataBaseManager.GunDBItem it, int slotNum) { //实例化gunItem GameObject obj = ResManager.Instance.LoadPrefabFromRes("Prefab/GunItem", true); Text tx = obj.transform.GetChild(0).GetComponent <Text>(); tx.text = it.name; //加载枪械图片 Sprite sprite = ResManager.Instance.LoadSpriteFromRes(it.imagePath); Image img = obj.transform.GetChild(1).GetComponent <Image>(); img.sprite = sprite; Transform partList = obj.transform.GetChild(2); //初始化item对应的装备槽数据 List <EquipType> type = it.equipList; int equipListCount = type.Count; //装备槽位对照表 List <EquipType> allEquipType = new List <EquipType>() { EquipType.equip_butt, EquipType.equip_magazine, EquipType.equip_handle, EquipType.equip_muzzle, EquipType.equip_scope }; Dictionary <int, EquipSlot> equipSlotDic = new Dictionary <int, EquipSlot>(); //不同的枪所能挂载的配件不同,能显示的装备槽数量也不同 for (int i = 0; i < 5; i++) { Transform part = partList.GetChild(i); //给每个槽的parentId赋值 part.GetComponent <BagGrIdIns>().parentId = slotNum; for (int j = 0; j < equipListCount; j++) { if (type[j] == allEquipType[i]) { //将这个槽显示出来 part.gameObject.SetActive(true); //加入装备槽字典 equipSlotDic.Add(i, new EquipSlot(part, i, slotNum, type[j])); } } } //正式挂载 //物理挂载 obj.transform.SetParent(m_equipModel.gunSlots[slotNum].transform, false); obj.transform.localPosition = Vector3.zero; //数据挂载 GunItem item = new GunItem(obj.transform, equipSlotDic, it.name, it.id, it.weaponType, it.hurtNum, it.steadyNum, it.prefabPath, it.bulletCap); Debug.Log("prefabPath:" + item.ScenePrefabPath); if (m_equipModel.gunItems.TryGetValue(slotNum, out GunItem element)) { m_equipModel.gunItems[slotNum] = item; } else { m_equipModel.gunItems.Add(slotNum, item); } //触发更新人物枪支数据 Debug.Log("槽数:" + slotNum); LiteEventManager.Instance.TriggerEvent(EquipType.weapon_gun, new ValueInfo <int, int, float, int>(slotNum, it.hurtNum, it.steadyNum, it.bulletCap)); //挂载完成,将该槽设置为已挂载 m_equipModel.gunSlots[slotNum].isEmpty = false; }