protected virtual void Init() { goodsMetaInfoMations = DataCenter.Instance.GetMetaData <GoodsMetaInfoMations>(); playerState = DataCenter.Instance.GetEntity <PlayerState>(); businessmanStates = DataCenter.Instance.GetEntity <BusinessmanStates>(); npcData = DataCenter.Instance.GetMetaData <NPCData>(); iGameState = GameState.Instance.GetEntity <IGameState>(); iInteractiveState = GameState.Instance.GetEntity <IInteractiveState>(); iPlayerState = GameState.Instance.GetEntity <IPlayerState>(); uiShowTip.gameObject.SetActive(false); }
private void OnGUI() { if (npcDataDic == null) { return; } if (tempNPCDataInfo == null) { tempNPCDataInfo = new NPCDataInfo(); if (nowIDList.Count > 0) { tempNPCDataInfo.NPCID = nowIDList.Max() + 1; } else { tempNPCDataInfo.NPCID = 0; } tempNPCDataInfo.NPCName = "Name"; tempNPCDataInfo.npcPrefabName = ""; tempNPCDataInfo.NPCType = EnumNPCType.Normal; } EditorGUILayout.BeginVertical(); scroll = EditorGUILayout.BeginScrollView(scroll); List <string> names = npcDataDic.Keys.OfType <string>().ToList(); int index = names.IndexOf(tempNPCDataInfo.npcPrefabName); if (tempNPCDataInfo.NPCObj) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(tempNPCDataInfo.npcPrefabName); if (GUILayout.Button("×", GUILayout.Width(25))) { if (EditorUtility.DisplayDialog("警告!", "是否重新选择预设提?", "是", "否")) { tempNPCDataInfo.npcPrefabName = ""; tempNPCDataInfo.InitNPCObjPrefab(); GameObject.DestroyImmediate(tempNPCDataInfo.NPCObj); tempNPCDataInfo.NPCObj = null; index = -1; isCreate = false; } } EditorGUILayout.EndHorizontal(); } else { index = EditorGUILayout.Popup(index, names.ToArray()); if (index >= 0) { tempNPCDataInfo.npcPrefabName = names[index]; } } if (index >= 0) { EditorGUILayout.ObjectField(npcDataDic[tempNPCDataInfo.npcPrefabName], typeof(GameObject), true); } int id = EditorGUILayout.IntField("NPC ID:", tempNPCDataInfo.NPCID); if (!nowIDList.Contains(id)) { tempNPCDataInfo.NPCID = id; } tempNPCDataInfo.NPCName = EditorGUILayout.TextField("NPC Name:", tempNPCDataInfo.NPCName); if (npcTypeToExplanList == null) { npcTypeToExplanList = new List <KeyValuePair <EnumNPCType, string> >(); FieldExplanAttribute.SetEnumExplanDic(npcTypeToExplanList); } List <EnumNPCType> npcTypeValues = npcTypeToExplanList.Select(temp => temp.Key).ToList(); string[] npcTypeExplans = npcTypeToExplanList.Select(temp => temp.Value).ToArray(); int npcTypeIndex = npcTypeValues.IndexOf(tempNPCDataInfo.NPCType); npcTypeIndex = EditorGUILayout.Popup("NPC Type:", npcTypeIndex, npcTypeExplans); if (npcTypeIndex >= 0) { tempNPCDataInfo.NPCType = npcTypeValues[npcTypeIndex]; } tempNPCDataInfo.OtherValue = EditorGUILayout.TextField("Other Data:", tempNPCDataInfo.OtherValue); if (isCreate) { EditorGUILayout.ObjectField("NPC Object:", tempNPCDataInfo.NPCObj, typeof(GameObject), true); } if (((!isCreate && index >= 0) || (tempNPCDataInfo.NPCObj == null && index >= 0)) && GUILayout.Button("Create NPC GameObject")) { GameObject createObj = GameObject.Instantiate <GameObject>(npcDataDic[tempNPCDataInfo.npcPrefabName]); tempNPCDataInfo.NPCObj = createObj; isCreate = true; } if (tempNPCDataInfo.NPCObj != null) { Selection.activeGameObject = tempNPCDataInfo.NPCObj; if (tempNPCDataInfo.NPCObj.GetComponent <TalkShowPosition>() == null) { tempNPCDataInfo.NPCObj.AddComponent <TalkShowPosition>(); } tempNPCDataInfo.NPCObj.GetComponent <TalkShowPosition>().tempNPCDataInfo = tempNPCDataInfo; tempNPCDataInfo.TalkShowOffset = EditorGUILayout.Vector3Field("Talk Show Offset:", tempNPCDataInfo.TalkShowOffset); Vector3 talkShowWorldVec = tempNPCDataInfo.TalkShowOffset + tempNPCDataInfo.NPCObj.transform.position; } Sprite tempSprite = (Sprite)EditorGUILayout.ObjectField("NPC Sprite:", tempNPCDataInfo.NPCSprite, typeof(Sprite), false); if (tempSprite != tempNPCDataInfo.NPCSprite && tempSprite != null) { tempNPCDataInfo.npcSpriteID = SpriteManager.GetName(tempSprite); tempNPCDataInfo.NPCSprite = tempSprite; } EditorGUILayout.LabelField("------------------显示条件------------------"); if (tempNPCDataInfo.NPCShowCondition == null && GUILayout.Button("创建显示条件")) { tempNPCDataInfo.NPCShowCondition = new NPCShowCondition(); } if (tempNPCDataInfo.NPCShowCondition != null) { if (GUILayout.Button("删除显示条件")) { if (EditorUtility.DisplayDialog("请再次确认!", "是否要删除显示条件?", "删除", "取消")) { tempNPCDataInfo.NPCShowCondition = null; } } } if (tempNPCDataInfo.NPCShowCondition != null) { if (taskStateTypeToExplanList == null) { taskStateTypeToExplanList = new List <KeyValuePair <TaskMap.Enums.EnumTaskProgress, string> >(); FieldExplanAttribute.SetEnumExplanDic(taskStateTypeToExplanList); } List <TaskMap.Enums.EnumTaskProgress> taskProgressValueList = taskStateTypeToExplanList.Select(temp => temp.Key).ToList(); string[] taskProgressExplanArray = taskStateTypeToExplanList.Select(temp => temp.Value).ToArray(); //显示与任务条件相关的函数 Func <NPCShowCondition.TaskCondition[], NPCShowCondition.TaskCondition[]> ShowAbourtTaskConditionFunc = (source) => { if (source == null) { source = new NPCShowCondition.TaskCondition[0]; } if (GUILayout.Button("添加", GUILayout.Width(50))) { NPCShowCondition.TaskCondition[] tempSource = new NPCShowCondition.TaskCondition[source.Length + 1]; Array.Copy(source, tempSource, source.Length); tempSource[source.Length] = new NPCShowCondition.TaskCondition(); source = tempSource; } List <NPCShowCondition.TaskCondition> removeList = new List <NPCShowCondition.TaskCondition>();//需要移除的列表 foreach (NPCShowCondition.TaskCondition taskCondition in source) { if (taskCondition == null) { continue; } EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("×", GUILayout.Width(20)))//删除 { if (EditorUtility.DisplayDialog("请再次确认!", "是否删除该条数据?", "删除", "取消")) { removeList.Add(taskCondition); } } EditorGUILayout.LabelField("任务ID:", GUILayout.Width(50)); taskCondition.TaskID = EditorGUILayout.IntField(taskCondition.TaskID, GUILayout.Width(20)); EditorGUILayout.LabelField("任务状态:", GUILayout.Width(60)); int taskStateIndex = taskProgressValueList.IndexOf(taskCondition.TaskState); taskStateIndex = EditorGUILayout.Popup(taskStateIndex, taskProgressExplanArray, GUILayout.Width(100)); if (taskStateIndex > -1) { TaskMap.Enums.EnumTaskProgress tskProgress = taskProgressValueList[taskStateIndex]; taskCondition.TaskState = tskProgress; } EditorGUILayout.EndHorizontal(); } if (removeList.Count > 0) { List <NPCShowCondition.TaskCondition> tempSource = new List <NPCShowCondition.TaskCondition>(source); foreach (NPCShowCondition.TaskCondition taskCondition in removeList) { tempSource.Remove(taskCondition); } source = tempSource.ToArray(); } return(source); }; tempNPCDataInfo.NPCShowCondition.TimeRange = EditorGUILayout.Vector2Field("在该时间范围内显示(都为0表示不受该项影响)", tempNPCDataInfo.NPCShowCondition.TimeRange); EditorGUILayout.LabelField("NPC的隐藏条件(满足任何一条则必须隐藏):"); tempNPCDataInfo.NPCShowCondition.TaskConditionsHide = ShowAbourtTaskConditionFunc(tempNPCDataInfo.NPCShowCondition.TaskConditionsHide); EditorGUILayout.LabelField("NPC的显示条件(满足任何一条则允许显示):"); tempNPCDataInfo.NPCShowCondition.TaskConditionShow = ShowAbourtTaskConditionFunc(tempNPCDataInfo.NPCShowCondition.TaskConditionShow); } EditorGUILayout.LabelField("------------------其他数据------------------"); switch (tempNPCDataInfo.NPCType) { case EnumNPCType.Businessman: //如果是商人,则otherValue的数据是BusinessmanDataInfo类型的数据 if (businessmanDataInfo == null) { businessmanDataInfo = BusinessmanDataInfo.DeSerializeNow <BusinessmanDataInfo>(tempNPCDataInfo.OtherValue); if (businessmanDataInfo == null) { businessmanDataInfo = new BusinessmanDataInfo(); } } if (goodsMetaInfoMations == null) { goodsMetaInfoMations = new GoodsMetaInfoMations(); goodsMetaInfoMations.Load(); } if (goodsTypeToExplanList == null) { goodsTypeToExplanList = new List <KeyValuePair <EnumGoodsType, string> >(); FieldExplanAttribute.SetEnumExplanDic(goodsTypeToExplanList, 0, temp => ((int)temp) % 1000 != 0); } if (goodsQualityTypeToExplanList == null) { goodsQualityTypeToExplanList = new List <KeyValuePair <EnumQualityType, string> >(); FieldExplanAttribute.SetEnumExplanDic(goodsQualityTypeToExplanList, 0); } //显示商人应该显示的列表 businessmanScroll = EditorGUILayout.BeginScrollView(businessmanScroll); { List <EnumGoodsType> enumGoodsTypes = goodsTypeToExplanList.Select(temp => temp.Key).ToList(); string[] enumGoodsExplans = goodsTypeToExplanList.Select(temp => temp.Value).ToArray(); EditorGUILayout.BeginHorizontal(); goodsTypeIndex = EditorGUILayout.Popup(goodsTypeIndex, enumGoodsExplans); if (GUILayout.Button("添加该物品")) { if (goodsTypeIndex > -1 && goodsTypeIndex < enumGoodsExplans.Length && !businessmanDataInfo.GoodsDic.ContainsKey(enumGoodsTypes[goodsTypeIndex])) { businessmanDataInfo.GoodsDic.Add(enumGoodsTypes[goodsTypeIndex], new BusinessmanDataInfo.GoodsDataInfoInner()); } else { EditorUtility.DisplayDialog("提示!", "添加失败!", "确定"); } } EditorGUILayout.EndHorizontal(); List <EnumQualityType> qualityTypes = goodsQualityTypeToExplanList.Select(temp => temp.Key).ToList(); string[] qualityExplans = goodsQualityTypeToExplanList.Select(temp => temp.Value).ToArray(); List <EnumGoodsType> removeGoodsTypes = new List <EnumGoodsType>(); foreach (KeyValuePair <EnumGoodsType, BusinessmanDataInfo.GoodsDataInfoInner> item in businessmanDataInfo.GoodsDic) { EditorGUILayout.BeginHorizontal(); int goodsTypeIndex = enumGoodsTypes.IndexOf(item.Key); if (goodsTypeIndex > -1) { EditorGUILayout.LabelField(enumGoodsExplans[goodsTypeIndex], GUILayout.Width(150)); int _qualityIndex_min = qualityTypes.IndexOf(item.Value.MinQualityType); int qualityIndex_min = EditorGUILayout.Popup(_qualityIndex_min, qualityExplans, GUILayout.Width(150)); if (_qualityIndex_min != qualityIndex_min && qualityIndex_min > -1) { item.Value.MinQualityType = qualityTypes[qualityIndex_min]; } int _qualityIndex_Max = qualityTypes.IndexOf(item.Value.MaxQualityType); int qualityIndex_max = EditorGUILayout.Popup(_qualityIndex_Max, qualityExplans, GUILayout.Width(150)); if (_qualityIndex_Max != qualityIndex_max && qualityIndex_max > -1) { item.Value.MaxQualityType = qualityTypes[qualityIndex_max]; } if (GUILayout.Button("×", GUILayout.Width(25))) { if (EditorUtility.DisplayDialog("请再次确认!", "是否删除?", "确定", "取消")) { removeGoodsTypes.Add(item.Key); } } } EditorGUILayout.EndHorizontal(); } removeGoodsTypes.ForEach(temp => businessmanDataInfo.GoodsDic.Remove(temp)); } EditorGUILayout.EndScrollView(); break; } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); }
/// <summary> /// 创建物品并将物品保存到存档中 /// </summary> /// <param name="playerState"></param> /// <param name="goodsMetaInfoMations"></param> /// <param name="baseGoodsType"></param> /// <param name="minQuality"></param> /// <param name="maxQuality"></param> /// <param name="count"></param> /// <returns></returns> public static PlayGoods CreatePlayGoodsAddToPlayData(PlayerState playerState, GoodsMetaInfoMations goodsMetaInfoMations, EnumGoodsType baseGoodsType, EnumQualityType minQuality, EnumQualityType maxQuality, int count) { PlayGoods playGoods = new PlayGoods(); Goods addGoods = goodsMetaInfoMations[baseGoodsType].Clone(true);//获取需要添加物品的原始属性 //如果是道具或炼金物品则可以叠加,但是没有品质 if (baseGoodsType > EnumGoodsType.Item && baseGoodsType < EnumGoodsType.SpecialItem) { int addGoodsID = playerState.PlayerAllGoods.Where(temp => temp.GoodsInfo.EnumGoodsType == baseGoodsType).Select(temp => temp.ID).FirstOrDefault(); if (addGoodsID == 0) { addGoodsID = NowTimeToID.GetNowID(DataCenter.Instance.GetEntity <GameRunnedState>()); playGoods = new PlayGoods(addGoodsID, addGoods, GoodsLocation.Package); playGoods.Count = count; playGoods.QualityType = EnumQualityType.White; playerState.PlayerAllGoods.Add(playGoods); } else { playGoods.Count += count; } } else { int addGoodsID = NowTimeToID.GetNowID(DataCenter.Instance.GetEntity <GameRunnedState>()); EnumQualityType qualityType = (EnumQualityType)UnityEngine.Random.Range((int)minQuality, (int)maxQuality + 1); float minRate = ((int)qualityType) * 0.2f + 0.8f; float maxRate = minRate + 0.2f; // 根据品质设置属性 if (qualityType != EnumQualityType.Red)//如果是唯一的则不用改变属性 { //将所有属性随机(根据品质) addGoods.goodsAbilities.ForEach(temp => { float min = temp.Value * minRate; float max = temp.Value * maxRate; temp.Value = (int)UnityEngine.Random.Range(min, max); }); //取出用于分割固定属性以及随机属性的条目 GoodsAbility goodsAbility_nothing = addGoods.goodsAbilities.FirstOrDefault(temp => temp.AbilibityKind == EnumGoodsAbility.Nothing); int index = -1; if (goodsAbility_nothing != null) { index = addGoods.goodsAbilities.IndexOf(goodsAbility_nothing); } //存在分割属性 if (index > -1 && index + 1 < addGoods.goodsAbilities.Count) { //取出分割项后的可变项 List <EnumGoodsAbility> randomAbilitys = Enumerable.Range(index + 1, addGoods.goodsAbilities.Count - index - 1). Select(temp => addGoods.goodsAbilities[temp]).Select(temp => temp.AbilibityKind).ToList(); int saveAbilityCount = (int)qualityType;//可保留的属性 while (randomAbilitys.Count > saveAbilityCount) { int removeIndex = UnityEngine.Random.Range(0, randomAbilitys.Count); EnumGoodsAbility removeGoodsAbility = randomAbilitys[removeIndex]; addGoods.goodsAbilities.RemoveAll(temp => temp.AbilibityKind == removeGoodsAbility); randomAbilitys.RemoveAt(removeIndex); } } addGoods.goodsAbilities.RemoveAll(temp => temp.AbilibityKind == EnumGoodsAbility.Nothing); playGoods = new PlayGoods(addGoodsID, addGoods, GoodsLocation.Package); playGoods.QualityType = qualityType; playGoods.Count = 1; playerState.PlayerAllGoods.Add(playGoods); } } return(playGoods); }
public override void ActionTrigger() { base.ActionTrigger(); if (!treasureBoxState) { //触发宝箱 treasureBoxState = true; if (animator != null) { animator.SetBool("TreasureBox", treasureBoxState); } //保存状态 SaveDataAction(true); //发放道具 Dictionary <EnumGoodsType, ActionInteractiveDataInfo.TreasureBoxStruct> dataDic = ActionInteractiveDataInfo.OtherValue as Dictionary <EnumGoodsType, ActionInteractiveDataInfo.TreasureBoxStruct>; if (dataDic != null) { //实例化数据并填入存档中 GoodsMetaInfoMations goodsMetaInfoMations = DataCenter.Instance.GetMetaData <GoodsMetaInfoMations>(); PlayerState playerState = DataCenter.Instance.GetEntity <PlayerState>(); foreach (KeyValuePair <EnumGoodsType, ActionInteractiveDataInfo.TreasureBoxStruct> data in dataDic) { EnumGoodsType baseGoodsType = data.Key; EnumQualityType qualityTypeMin = data.Value.MinQualityType; EnumQualityType qualityTypeMax = data.Value.MaxQualityType; Goods addGoods = goodsMetaInfoMations[baseGoodsType].Clone(true);//获取需要添加物品的原始属性 //如果是道具或炼金物品则可以叠加,但是没有品质 if (baseGoodsType > EnumGoodsType.Item && baseGoodsType < EnumGoodsType.SpecialItem) { //尝试从玩家道具中获取id,如果没有则新建一个(这个id并没有什么卵用) int addGoodsID = playerState.PlayerAllGoods.Where(temp => temp.GoodsInfo.EnumGoodsType == baseGoodsType).Select(temp => temp.ID).FirstOrDefault(); if (addGoodsID == 0) { addGoodsID = NowTimeToID.GetNowID(DataCenter.Instance.GetEntity <GameRunnedState>()); PlayGoods playGoods = new PlayGoods(addGoodsID, addGoods, GoodsLocation.Package); playGoods.QualityType = EnumQualityType.White; playGoods.Count = data.Value.Count; playerState.PlayerAllGoods.Add(playGoods); } else { PlayGoods playGoods = playerState.PlayerAllGoods.FirstOrDefault(temp => temp.ID == addGoodsID); playGoods.Count += data.Value.Count; } } //如果不是道具和炼金物品则不可以叠加,但是存在品质 else { int addGoodsID = NowTimeToID.GetNowID(DataCenter.Instance.GetEntity <GameRunnedState>()); EnumQualityType qualityType = (EnumQualityType)UnityEngine.Random.Range((int)qualityTypeMin, (int)qualityTypeMax + 1); // 根据品质设置属性 if (qualityType != EnumQualityType.Red)//如果是唯一的则不用改变属性 { //将所有属性随机 addGoods.goodsAbilities.ForEach(temp => { float min = temp.Value * 0.8f; float max = temp.Value * 1.2f; temp.Value = (int)UnityEngine.Random.Range(min, max); }); //取出用于分割固定属性以及随机属性的条目 GoodsAbility goodsAbility_nothing = addGoods.goodsAbilities.FirstOrDefault(temp => temp.AbilibityKind == EnumGoodsAbility.Nothing); int index = -1; if (goodsAbility_nothing != null) { index = addGoods.goodsAbilities.IndexOf(goodsAbility_nothing); } //存在分割属性 if (index > -1 && index + 1 < addGoods.goodsAbilities.Count) { //取出分割项后的可变项 List <EnumGoodsAbility> randomAbilitys = Enumerable.Range(index + 1, addGoods.goodsAbilities.Count - index - 1). Select(temp => addGoods.goodsAbilities[temp]).Select(temp => temp.AbilibityKind).ToList(); int saveAbilityCount = (int)qualityType;//可保留的属性 while (randomAbilitys.Count > saveAbilityCount) { int removeIndex = UnityEngine.Random.Range(0, randomAbilitys.Count); EnumGoodsAbility removeGoodsAbility = randomAbilitys[removeIndex]; addGoods.goodsAbilities.RemoveAll(temp => temp.AbilibityKind == removeGoodsAbility); randomAbilitys.RemoveAt(removeIndex); } } } addGoods.goodsAbilities.RemoveAll(temp => temp.AbilibityKind == EnumGoodsAbility.Nothing); PlayGoods playGoods = new PlayGoods(addGoodsID, addGoods, GoodsLocation.Package); playGoods.QualityType = qualityType; playGoods.Count = 1; playerState.PlayerAllGoods.Add(playGoods); } } } } }