private void ReCalculateDialogGroups()
        {
            chatDialogGroups.Clear();
            taskDialogGroups.Clear();

            for (int i = 0; i < dialogGroups.Count; i++)
            {
                DialogGroup dg = dialogGroups [i];

                bool normalDg = true;

                for (int j = 0; j < npc.tasks.Count; j++)
                {
                    if (!normalDg)
                    {
                        break;
                    }
                    normalDg = normalDg && dg != npc.tasks [j].taskDialogGroup;
                }

                if (!normalDg)
                {
                    taskDialogGroups.Add(dg);
                }
                else
                {
                    chatDialogGroups.Add(dg);
                }
            }
        }
        public void SetUpChatPlane()
        {
            mainNPCPlane.gameObject.SetActive(false);

            currentDialogId = 0;

            DialogGroup dg = null;

            for (int i = 0; i < currentEnteredNpc.chatDialogGroups.Count; i++)
            {
                if (currentEnteredNpc.chatDialogGroups [i].accordGameLevel == currentLevelIndex)
                {
                    dg = currentEnteredNpc.chatDialogGroups [i];
                }
            }

            if (dg == null)
            {
                Debug.LogError(string.Format("第{0}关没有npc{1}", currentLevelIndex, currentEnteredNpc.npcName));
            }

            currentDialogGroup = dg;

            SetUpDialogPlane(currentDialogGroup.dialogs [0]);
        }
Exemple #3
0
 public Task(DialogGroup taskDialogGroup, string taskDescription, TaskType taskType, int accordMonsterOrItemId, int accordMonsterOrItemCount, int dialogIdWhenTaskAccomplished, int accordGameLevel)
 {
     this.taskDialogGroup              = taskDialogGroup;
     this.taskDescription              = taskDescription;
     this.taskType                     = taskType;
     this.accordMonsterOrItemId        = accordMonsterOrItemId;
     this.accordMonsterOrItemCount     = accordMonsterOrItemCount;
     this.dialogIdWhenTaskAccomplished = dialogIdWhenTaskAccomplished;
     this.accordGameLevel              = accordGameLevel;
 }
        private void CreateDialogGroupGUI(DialogGroup dg, List <bool> foldoutList, List <int> rewardTypeCountList)
        {
            EditorGUILayout.Separator();
            EditorGUILayout.LabelField("************************对话组编辑区*************************", new GUILayoutOption[] {
                GUILayout.Height(20),
                GUILayout.Width(600)
            });

            // 对话组对应关卡id编辑行
            EditorGUILayout.BeginHorizontal();

            EditorGUILayout.LabelField("对话组对应关卡id:", labelLayouts);
            dg.accordGameLevel = EditorGUILayout.IntField(dg.accordGameLevel, normalInputLayouts);

            EditorGUILayout.EndHorizontal();


            List <Dialog> dialogs = dg.dialogs;


            // 对话组内部对话编辑区
            EditorGUILayout.BeginHorizontal();

            EditorGUILayout.PrefixLabel("____");

            EditorGUILayout.BeginVertical();

            EditorGUILayout.BeginHorizontal();

            bool createNewDialog = GUILayout.Button("新建对话", new GUILayoutOption[] {
                GUILayout.Height(20),
                GUILayout.Width(150)
            });

            bool removeLastDialog = GUILayout.Button("删除尾部对话", new GUILayoutOption[] {
                GUILayout.Height(20),
                GUILayout.Width(150)
            });

            EditorGUILayout.EndHorizontal();

            if (createNewDialog)
            {
                Dialog dialog = new Dialog();
                dialogs.Add(dialog);
                bool foldout = true;
                foldoutList.Add(foldout);
                int rewardIdCount = 0;
                rewardTypeCountList.Add(rewardIdCount);
                dialog.choices = new List <Choice> {
                    new Choice(), new Choice()
                };
            }

            if (removeLastDialog && dialogs.Count > 0)
            {
                dialogs.RemoveAt(dialogs.Count - 1);
                foldoutList.RemoveAt(foldoutList.Count - 1);
            }

            for (int i = 0; i < dialogs.Count; i++)
            {
                Dialog dialog = dialogs [i];

                int dialogGroupIndex = dialogGroups.FindIndex(delegate(DialogGroup obj) {
                    return(obj == dg);
                });

                int dialogIndex = 0;

                for (int j = 0; j < dialogGroupIndex; j++)
                {
                    dialogIndex += dialogGroups [j].dialogs.Count;
                }

                dialogIndex += i;

                dialog.dialogId = dialogIndex;

                foldoutList[i] = EditorGUILayout.Foldout(foldoutList[i], "对话编辑区");

                if (foldoutList [i])
                {
                    CreateDialogGUI(dialog, rewardTypeCountList, i);
                }
            }

            EditorGUILayout.EndVertical();

            EditorGUILayout.EndHorizontal();


            EditorGUILayout.LabelField("************************对话组编辑区*************************", new GUILayoutOption[] {
                GUILayout.Height(20),
                GUILayout.Width(600)
            });
            EditorGUILayout.Separator();
        }
        public void OnGUI()
        {
            Rect windowRect = npcEditor.position;

            scrollPos = EditorGUILayout.BeginScrollView(scrollPos, new GUILayoutOption[] {
                GUILayout.Height(windowRect.height),
                GUILayout.Width(windowRect.width)
            });

            EditorGUILayout.LabelField("please input information of npc");

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("npc数据源", labelLayouts);

            rect        = EditorGUILayout.GetControlRect(GUILayout.Width(300));
            npcDataPath = EditorGUI.TextField(rect, npcDataPath);
            //如果鼠标正在拖拽中或拖拽结束时,并且鼠标所在位置在文本输入框内
            if ((UnityEngine.Event.current.type == UnityEngine.EventType.DragUpdated ||
                 UnityEngine.Event.current.type == UnityEngine.EventType.DragExited) &&
                rect.Contains(UnityEngine.Event.current.mousePosition))
            {
                //改变鼠标的外表
                DragAndDrop.visualMode = DragAndDropVisualMode.Generic;
                if (DragAndDrop.paths != null && DragAndDrop.paths.Length > 0)
                {
                    npcDataPath = DragAndDrop.paths [0];
                }
            }


            EditorGUILayout.EndHorizontal();

            bool loadNpcData = GUILayout.Button("加载npc数据", new GUILayoutOption[] {
                GUILayout.Height(20),
                GUILayout.Width(150)
            });

            if (loadNpcData)
            {
                dialogGroups.Clear();
                chatDialogGroups.Clear();
                taskDialogGroups.Clear();

                dialogGroupFoldoutList.Clear();
                dialogFoldoutList.Clear();
                rewardTypeCountList.Clear();
                taskFoldoutList.Clear();

                string npcDataFileName = Path.GetFileName(npcDataPath);

                npcDataPath = string.Format("{0}/NPCs/{1}", CommonData.originDataPath, npcDataFileName);

                string npcTypeStr = npcDataFileName.Split(new char[] { '_' }, StringSplitOptions.RemoveEmptyEntries)[0];


                npc = DataHandler.LoadDataToSingleModelWithPath <MyNpc> (npcDataPath);



                switch (npcTypeStr)
                {
                case "Normal":
                    npcType = NPCType.Normal;
                    break;

                case "Trader":
                    npcType          = NPCType.Trader;
                    goodsIdsInString = TransferGoodsIdsToString(npc);
                    break;
                }

                Debug.Log(npcDataPath);

                for (int i = 0; i < npc.chatDialogGroups.Count; i++)
                {
                    dialogGroups.Add(npc.chatDialogGroups [i]);
                    chatDialogGroups.Add(npc.chatDialogGroups [i]);

                    bool foldout = false;
                    dialogGroupFoldoutList.Add(foldout);

                    List <bool> foldoutList = new List <bool> ();
                    dialogFoldoutList.Add(foldoutList);

                    List <int> rewardTypeCounts = new List <int> ();
                    rewardTypeCountList.Add(rewardTypeCounts);

                    for (int j = 0; j < npc.chatDialogGroups [i].dialogs.Count; j++)
                    {
                        Dialog d             = npc.chatDialogGroups [i].dialogs [j];
                        bool   dialogFoldout = false;
                        foldoutList.Add(dialogFoldout);

                        rewardTypeCounts.Add(d.rewardIds.Length);
                    }
                }

                for (int i = 0; i < npc.tasks.Count; i++)
                {
                    dialogGroups.Add(npc.tasks [i].taskDialogGroup);
                    bool foldout = false;
                    taskFoldoutList.Add(foldout);
                    dialogGroupFoldoutList.Add(dialogGroupFoldout);
                    List <bool> foldoutList = new List <bool> ();
                    dialogFoldoutList.Add(foldoutList);
                    List <int> rewardTypeCounts = new List <int> ();
                    rewardTypeCountList.Add(rewardTypeCounts);

                    for (int j = 0; j < npc.tasks [i].taskDialogGroup.dialogs.Count; j++)
                    {
                        Dialog d             = npc.tasks [i].taskDialogGroup.dialogs [j];
                        bool   dialogFoldout = false;
                        foldoutList.Add(dialogFoldout);

                        rewardTypeCounts.Add(d.rewardIds.Length);
                    }
                }

                for (int i = 0; i < npc.attachedFunctions.Length; i++)
                {
                    if (npc.attachedFunctions [i] == NPCAttachedFunctionType.SkillPromotion)
                    {
                        skillPromotionFunction = true;
                    }
                    if (npc.attachedFunctions [i] == NPCAttachedFunctionType.PropertyPromotion)
                    {
                        propertyPromotionFunction = true;
                    }
                    if (npc.attachedFunctions [i] == NPCAttachedFunctionType.Task)
                    {
                        taskFunction = true;
                    }
                    if (npc.attachedFunctions [i] == NPCAttachedFunctionType.CharactersTrade)
                    {
                        characterTradeFunction = true;
                    }
                }
            }

            CreateNPCBaseInformationGUI();



            EditorGUILayout.BeginHorizontal();
            bool createNewDialogGroup = GUILayout.Button("新建对话组", new GUILayoutOption[] {
                GUILayout.Height(20),
                GUILayout.Width(200)
            });

            bool removeLastDialogGroup = GUILayout.Button("删除尾部对话组", new GUILayoutOption[] {
                GUILayout.Height(20),
                GUILayout.Width(200)
            });

            EditorGUILayout.EndHorizontal();

            if (createNewDialogGroup)
            {
                DialogGroup chatDialogGroup = new DialogGroup();
                dialogGroups.Add(chatDialogGroup);
                bool foldout = true;
                dialogGroupFoldoutList.Add(foldout);
                List <bool> foldoutList = new List <bool> ();
                dialogFoldoutList.Add(foldoutList);
                List <int> rewardTypeCounts = new List <int> ();
                rewardTypeCountList.Add(rewardTypeCounts);
                ReCalculateDialogGroups();
            }

            if (removeLastDialogGroup && chatDialogGroups.Count > 0)
            {
                DialogGroup dg = chatDialogGroups [chatDialogGroups.Count - 1];

                int index = dialogGroups.FindIndex(delegate(DialogGroup obj) {
                    return(obj == dg);
                });
                dialogGroupFoldoutList.RemoveAt(index);
                dialogFoldoutList.RemoveAt(index);
                rewardTypeCountList.RemoveAt(index);

                chatDialogGroups.Remove(dg);
                dialogGroups.Remove(dg);

                ReCalculateDialogGroups();
            }



            for (int i = 0; i < chatDialogGroups.Count; i++)
            {
                DialogGroup dg = chatDialogGroups [i];

                int index = dialogGroups.FindIndex(delegate(DialogGroup obj) {
                    return(obj == dg);
                });

                List <bool> currentDialogFoldoutList = dialogFoldoutList [index];

                List <int> currentDialogRewardTypeCountList = rewardTypeCountList [index];

                dialogGroupFoldoutList [index] = EditorGUILayout.Foldout(dialogGroupFoldoutList [index], "对话组编辑区");

                if (dialogGroupFoldoutList [index])
                {
                    CreateDialogGroupGUI(dg, currentDialogFoldoutList, currentDialogRewardTypeCountList);
                }
            }


            EditorGUILayout.BeginHorizontal();
            bool createNewTask = GUILayout.Button("新建任务", new GUILayoutOption[] {
                GUILayout.Height(20),
                GUILayout.Width(200)
            });

            bool removeLastTask = GUILayout.Button("删除尾部任务", new GUILayoutOption[] {
                GUILayout.Height(20),
                GUILayout.Width(200)
            });

            EditorGUILayout.EndHorizontal();


            if (createNewTask)
            {
                Task task = new Task();
                npc.tasks.Add(task);
                DialogGroup taskDialogGroup = new DialogGroup();
                dialogGroups.Add(taskDialogGroup);
                task.taskDialogGroup = taskDialogGroup;
                bool foldout = true;
                taskFoldoutList.Add(foldout);
                dialogGroupFoldoutList.Add(dialogGroupFoldout);
                List <bool> foldoutList = new List <bool> ();
                dialogFoldoutList.Add(foldoutList);
                List <int> rewardIdsCount = new List <int> ();
                rewardTypeCountList.Add(rewardIdsCount);
                ReCalculateDialogGroups();
            }

            if (removeLastTask && npc.tasks.Count > 0)
            {
                Task task = npc.tasks [npc.tasks.Count - 1];

                npc.tasks.RemoveAt(npc.tasks.Count - 1);

                taskFoldoutList.RemoveAt(taskFoldoutList.Count - 1);



                int index = dialogGroups.FindIndex(delegate(DialogGroup obj) {
                    return(obj == task.taskDialogGroup);
                });

                dialogGroupFoldoutList.RemoveAt(index);
                dialogFoldoutList.RemoveAt(index);
                rewardTypeCountList.RemoveAt(index);

                taskDialogGroups.Remove(task.taskDialogGroup);
                dialogGroups.Remove(task.taskDialogGroup);

                ReCalculateDialogGroups();
            }

            for (int i = 0; i < npc.tasks.Count; i++)
            {
                Task task = npc.tasks [i];
                taskFoldoutList [i] = EditorGUILayout.Foldout(taskFoldoutList [i], "任务编辑区");
                if (taskFoldoutList [i])
                {
                    CreateTaskGUI(task);
                }
            }

//			EditorGUILayout.Separator ();
//			EditorGUILayout.LabelField ("************************结束*************************", new GUILayoutOption[] {
//				GUILayout.Height (20),
//				GUILayout.Width (600)
//			});
            bool saveNpcData = GUILayout.Button("保存NPC数据", new GUILayoutOption[] {
                GUILayout.Width(500),
                GUILayout.Height(20)
            });

            if (saveNpcData)
            {
                SaveNpcData();
            }



            EditorGUILayout.EndScrollView();
        }