/// <summary> /// 将任务id push到队列中 /// </summary> /// <param name="source"></param> /// <param name="targetTaskIDs"></param> /// <param name="targetTaskPoints"></param> private void PushDialoguePointTask(DialoguePoint source, Queue <int> targetTaskIDs = null, Queue <DialoguePoint> targetTaskPoints = null) { DialogueValue dialogueValue = dialogueStructData.SearchDialogueValueByID(source.dialogueID); if (targetTaskPoints != null && !targetTaskPoints.Contains(source)) { targetTaskPoints.Enqueue(source); } int taskID; if (!string.IsNullOrEmpty(dialogueValue.otherValue) && int.TryParse(dialogueValue.otherValue, out taskID)) { if (targetTaskIDs != null && !targetTaskIDs.Contains(taskID)) { targetTaskIDs.Enqueue(taskID); } } if (source.childDialoguePoints != null && source.childDialoguePoints.Length > 0)//如果存在子节点 { foreach (DialoguePoint childPoint in source.childDialoguePoints) { PushDialoguePointTask(childPoint, targetTaskIDs, targetTaskPoints); } } }
/// <summary> /// 判断指定的节点是否存在指定的任务 /// </summary> /// <param name="target">查找的顶层节点</param> /// <param name="taskID">查找任务id</param> /// <param name="taskPoint">查找到的节点</param> /// <returns></returns> private bool DialoguePointHasThisTask(DialoguePoint target, string taskID, out DialoguePoint taskPoint) { taskPoint = null; if (string.IsNullOrEmpty(taskID)) { return(false); } DialogueValue dialogueValue = dialogueStructData.SearchDialogueValueByID(target.dialogueID); if (!string.IsNullOrEmpty(dialogueValue.otherValue) && string.Equals(dialogueValue.otherValue.Trim(), taskID.Trim())) { taskPoint = target; return(true); } else { if (target.childDialoguePoints != null && target.childDialoguePoints.Length > 0)//如果存在子节点 { foreach (DialoguePoint child in target.childDialoguePoints) { bool result = DialoguePointHasThisTask(child, taskID, out taskPoint); if (result) { return(true); } } } return(false); } }
/// <summary> /// 初始化对话 /// 展示如下对话 /// </summary> /// <param name="dialogueCodition">对话数据</param> private void InitTalk(DialogueCondition dialogueCodition) { this.dialogueCodition = dialogueCodition; this.nowDialoguePoint = this.dialogueCodition.topPoint; showLeftOrRight = true; ShowTalk(); }
/// <summary> /// 初始化不显示的节点 /// </summary> private void InitDontShowTalk(DialogueCondition dialogueCodition) { dontShowDialoguePointList = new List <DialoguePoint>(); //查找所有的存在任务id的节点 Queue <int> taskIDQueue = new Queue <int>(); Queue <DialoguePoint> taskPointQueue = new Queue <DialoguePoint>(); PushDialoguePointTask(dialogueCodition.topPoint, taskIDQueue, taskPointQueue); //判断可以接取的任务 TaskMap.RunTimeTaskInfo[] runTimeTaskInfos = iNowTaskState.GetWaitTask(null); var waitTaskIDs = runTimeTaskInfos.Select(temp => temp.ID); var waitTaskIDArray = waitTaskIDs.Intersect(taskIDQueue).ToArray(); foreach (DialoguePoint dialoguePoint in taskPointQueue) { DialoguePoint tempDP = null; foreach (int taskID in waitTaskIDArray) { if (DialoguePointHasThisTask(dialoguePoint, taskID.ToString(), out tempDP))//如果找到了则直接返回 { break; } } //如果没有找到,则表示节点下没有任务或者只存在过期的任务,放入不显示节点中 if (tempDP == null) { dontShowDialoguePointList.Add(dialoguePoint); } } }
public GameObject cinematic; // only applicable to the cinematic camera type // execute the camera action public override void Execute() { Interaction currentInteraction = Dialogue.GetActiveInteraction(); if (null != currentInteraction) { DialoguePoint currentDialoguePoint = currentInteraction.GetCurrentDialoguePoint(); Interaction.SetUpNewCamera(this, (null != currentDialoguePoint) ? currentDialoguePoint.caller : null, currentInteraction.GetAllDialoguePoints()); } }
/// <summary> /// 设置父节点 /// </summary> /// <param name="parent"></param> public void SetParent(DialoguePoint parent) { this.parentDialoguePoint = parent; if (childDialoguePoints != null && childDialoguePoints.Length > 0) { foreach (DialoguePoint child in childDialoguePoints) { child.SetParent(this); } } }
/// <summary> /// 下一个任务或结束任务 /// </summary> void NextTalkOrEnd() { if (nowDialoguePoint.childDialoguePoints != null && nowDialoguePoint.childDialoguePoints.Length > 0) { nowDialoguePoint = nowDialoguePoint.childDialoguePoints[0]; ShowTalk(); } else { gameObject.SetActive(false); //接受任务 //iNowTaskState.StartTask = runTimeTaskInfo.ID; } }
/// <summary> /// 根据现有数据创建控件 /// </summary> private void CreateControlByData() { int[] dialogueConditionIDs = dialogueAnalysisData.GetDialogueConditionAllID; foreach (int dialogueConditionID in dialogueConditionIDs) { DialogueCondition dialogueCondition = dialogueAnalysisData.GetDialogueConditionIDByID(dialogueConditionID); if (dialogueCondition == null) { continue; } DialogueConditionControl dialogueConditionControl = CreateNewTopNode(dialogueCondition, false); DialoguePoint dialoguePoint = dialogueCondition.topPoint; CreateControlByData(dialogueConditionControl, dialoguePoint); ResetControlRect(dialogueConditionControl.Parent); dialogueConditionControl.Parent.Refresh(); } ResetBackRect(); }
/// <summary> /// 初始化对话 /// </summary> private void InitTalk() { fisrtKeyUP = false; int touchNPCID = iInteractiveState.ClickInteractiveNPCID; TaskMap.RunTimeTaskInfo[] runTimeTaskInfos = runtimeTasksData.GetAllToDoList() .Where(temp => temp.TaskInfoStruct.ReceiveTaskNpcId == touchNPCID && temp.IsOver == false && temp.IsStart == false) .ToArray(); //首先选择 TaskMap.RunTimeTaskInfo runTimeTaskInfo = runTimeTaskInfos.Where(temp => temp.TaskInfoStruct.TaskType == TaskMap.Enums.EnumTaskType.Spur).FirstOrDefault(); if (runTimeTaskInfo == null) { runTimeTaskInfo = runTimeTaskInfos.Where(temp => temp.TaskInfoStruct.TaskType == TaskMap.Enums.EnumTaskType.Repeat).FirstOrDefault(); } if (runTimeTaskInfo != null) { this.runTimeTaskInfo = runTimeTaskInfo;//这个表示当前的任务 DialogueCondition[] dialogueConditions = dialogueStructData.SearchDialogueConditionsByNPCID(runTimeTaskInfo.TaskInfoStruct.ReceiveTaskNpcId, temp => temp.enumDialogueType == EnumDialogueType.Ask).ToArray(); DialoguePoint taskPoint; dialogueCodition = dialogueConditions.Where(temp => DialoguePointHasThisTask(temp.topPoint, this.runTimeTaskInfo.ID.ToString(), out taskPoint)).FirstOrDefault(); if (dialogueCodition != null)//如果存在该任务 { this.nowDialoguePoint = this.dialogueCodition.topPoint; InitDontShowTalk(dialogueCodition); ShowTalk(); } else { gameObject.SetActive(false); } } else { gameObject.SetActive(false); } }
/// <summary> /// 设置(重建)对话节点的子节点数据 /// </summary> /// <param name="parent">对话节点对象</param> /// <param name="childControls">子控件</param> private void SetDialoguePointData_Child(DialoguePoint parent, params Control[] childControls) { List <DialoguePoint> tempDialoguePointList = new List <DialoguePoint>(); foreach (Control childControl in childControls) { DialoguePointControl pointControl = childControl as DialoguePointControl; if (pointControl == null) { continue; } DialoguePoint childPoint = new DialoguePoint(); childPoint.dialogueID = pointControl.GetDialogueValue().dialogueID; tempDialoguePointList.Add(childPoint); if (childControl.Tag != null && childControl.Tag.GetType().Equals(typeof(List <Control>)) && (childControl.Tag as List <Control>).Count > 0) { SetDialoguePointData_Child(childPoint, (childControl.Tag as List <Control>).ToArray()); } } parent.childDialoguePoints = tempDialoguePointList.ToArray(); }
/// <summary> /// 设置数据 /// 传入ToString函数返回的字符串 /// </summary> /// <param name="data">数据字符串</param> public void SetData(string data) { if (data.Length > 2) { data = data.Trim().Remove(0, 1); data = data.Remove(data.Length - 1, 1); int splitIndex = data.IndexOf(idSplits); if (splitIndex > 0) { bool canSetID = int.TryParse(data.Substring(0, splitIndex), out dialogueID); if (canSetID) { string nextStr = data.Substring(splitIndex + 1, data.Length - (splitIndex + 1)); int[][] splitArray = GetNextStringSplit(nextStr); childDialoguePoints = new DialoguePoint[splitArray.GetLength(0)]; for (int i = 0; i < childDialoguePoints.Length; i++) { childDialoguePoints[i] = new DialoguePoint(); childDialoguePoints[i].SetData(nextStr.Substring(splitArray[i][0], splitArray[i][1])); } } } } }
/// <summary> /// 展示对话 /// </summary> private void ShowTalk() { DialogueValue dialogueValue = dialogueStructData.SearchDialogueValueByID(nowDialoguePoint.dialogueID); titleText.text = dialogueValue.showValue; int childCount = selectItemBackTrans.childCount; Transform[] childTransfroms = new Transform[childCount]; for (int i = 0; i < childCount; i++) { childTransfroms[i] = selectItemBackTrans.GetChild(i); } for (int i = 0; i < childCount; i++) { if (!Transform.Equals(childTransfroms[i], exampleItemObj.transform))//如果不是例子对象则销毁 { GameObject.DestroyImmediate(childTransfroms[i].gameObject); } } showItemList.Clear(); //添加 Action <string, Action <Transform> > AddItemAction = (showValue, ClickCallback) => { GameObject createItemObj = GameObject.Instantiate <GameObject>(exampleItemObj); createItemObj.transform.SetParent(selectItemBackTrans); createItemObj.SetActive(true); Transform itemTextTrans = createItemObj.transform.GetChild(0); Text itemText = itemTextTrans.GetComponent <Text>(); itemText.text = showValue; showItemList.Add(createItemObj.transform); //添加事件 EventTrigger eventTrigger = createItemObj.AddComponent <EventTrigger>(); eventTrigger.triggers = new List <EventTrigger.Entry>(); //点击事件 EventTrigger.Entry entry_Click = new EventTrigger.Entry(); entry_Click.eventID = EventTriggerType.PointerClick; entry_Click.callback = new EventTrigger.TriggerEvent(); entry_Click.callback.AddListener(temp => ClickCallback(createItemObj.transform)); eventTrigger.triggers.Add(entry_Click); //鼠标进入事件 EventTrigger.Entry entry_Enter = new EventTrigger.Entry(); entry_Enter.eventID = EventTriggerType.PointerEnter; entry_Enter.callback = new EventTrigger.TriggerEvent(); entry_Enter.callback.AddListener(temp => { createItemObj.GetComponent <Image>().color = new Color(1, 1, 1, 0.4f); selectItemIndex = showItemList.IndexOf(createItemObj.transform); }); eventTrigger.triggers.Add(entry_Enter); //鼠标离开事件 EventTrigger.Entry entry_Leave = new EventTrigger.Entry(); entry_Leave.eventID = EventTriggerType.PointerExit; entry_Leave.callback = new EventTrigger.TriggerEvent(); entry_Leave.callback.AddListener(temp => createItemObj.GetComponent <Image>().color = new Color(1, 1, 1, 0)); eventTrigger.triggers.Add(entry_Leave); }; DialoguePoint[] childPoints = nowDialoguePoint.childDialoguePoints; foreach (DialoguePoint dialoguePoint in childPoints) //便利添加子选项 { if (dontShowDialoguePointList.Contains(dialoguePoint)) //不显示的不添加 { continue; } DialogueValue childDialogueValue = dialogueStructData.SearchDialogueValueByID(dialoguePoint.dialogueID); AddItemAction(childDialogueValue.titleValue, temp => { int index = showItemList.IndexOf(temp); DialoguePoint[] nowShowChildsPoints = nowDialoguePoint.childDialoguePoints.Where(point => !dontShowDialoguePointList.Contains(point)).ToArray(); if (index < 0 || index >= nowShowChildsPoints.Length) { return; } DialoguePoint clickPoint = nowShowChildsPoints[index]; if (clickPoint.childDialoguePoints == null || clickPoint.childDialoguePoints.Length == 0) //如果有任务则接取,如果没有则不做处理 { DialogueValue clickValue = dialogueStructData.SearchDialogueValueByID(clickPoint.dialogueID); if (!string.IsNullOrEmpty(clickValue.otherValue)) { int taskID = -1; if (int.TryParse(clickValue.otherValue, out taskID)) { TaskMap.RunTimeTaskInfo runTimeTaskInfo = runtimeTasksData.GetTasksWithID(taskID); if (runTimeTaskInfo != null && runTimeTaskInfo.IsOver == false && runTimeTaskInfo.IsStart == false) { iNowTaskState.StartTask = runTimeTaskInfo.ID; gameObject.SetActive(false); } } } } else //继续进入下面节点 { nowDialoguePoint = clickPoint; ShowTalk(); } }); } //最后添加一个返回选项 AddItemAction("返回", temp => { if (nowDialoguePoint.parentDialoguePoint != null) { nowDialoguePoint = nowDialoguePoint.parentDialoguePoint; ShowTalk(); } else { gameObject.SetActive(false); } }); StartCoroutine(UpdateContentSizeFitter(panelContentSizeFitter)); //选择第一个下标 selectItemIndex = 0; SetSelectItemIndex(); }
/// <summary> /// 设置数据 /// 传入ToString函数返回的字符串 /// </summary> /// <param name="data">数据字符串</param> public void SetData(string data) { if (string.IsNullOrEmpty(data)) { return; } string[] lines = data.Split(relationLineSplit, StringSplitOptions.RemoveEmptyEntries); string[][] valuesArray = lines.Select(temp => temp.Split(relationValueSplit, StringSplitOptions.RemoveEmptyEntries)) .Where(temp => temp.Length == 2).ToArray(); foreach (string[] values in valuesArray) { switch (values[0]) { case "topPoint": if (!string.IsNullOrEmpty(values[1])) { topPoint = new DialoguePoint(); topPoint.SetData(values[1].Trim()); } break; case "text": text = values[1].Trim(); break; case "touchNPCID": int.TryParse(values[1].Trim(), out touchNPCID); break; case "enumDialogueType": try { enumDialogueType = (EnumDialogueType)Enum.Parse(typeof(EnumDialogueType), values[1].Trim()); } catch { } break; case "maxLevel": int.TryParse(values[1].Trim(), out maxLevel); break; case "minLevel": int.TryParse(values[1].Trim(), out minLevel); break; case "overTask": int.TryParse(values[1].Trim(), out overTask); break; case "thisTask": int.TryParse(values[1].Trim(), out thisTask); break; case "minGoodAndEvil": int.TryParse(values[1].Trim(), out minGoodAndEvil); break; case "maxGoodAndEvil": int.TryParse(values[1].Trim(), out maxGoodAndEvil); break; case "race": try { race = (RoleOfRace)Enum.Parse(typeof(RoleOfRace), values[1].Trim()); } catch { } break; } } //递归设置父节点 if (topPoint != null) { topPoint.SetParent(null); } }
/// <summary> /// 保存方案 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void 保存方案ToolStripMenuItem_Click(object sender, EventArgs e) { //重建对话关系数据集合以及对话数据字典 List <DialogueCondition> dialogueConditionList = new List <DialogueCondition>(); Dictionary <int, DialogueValue> dialogueValueDic = new Dictionary <int, DialogueValue>(); foreach (Panel panel in FlowLayoutPanel_Main.Controls.OfType <Panel>()) { DialogueConditionControl dialogueConditionContorl = panel.Controls.OfType <DialogueConditionControl>().FirstOrDefault(); if (dialogueConditionContorl == null) { continue; } //对话条件 DialogueCondition dialogueCondition = dialogueConditionContorl.GetDialogueCondition(); //对话关系 if (dialogueConditionContorl.Tag != null && dialogueConditionContorl.Tag.GetType().Equals(typeof(List <Control>)) && (dialogueConditionContorl.Tag as List <Control>).Count > 0) { List <Control> childControlList = dialogueConditionContorl.Tag as List <Control>; DialoguePointControl topPointControl = childControlList[0] as DialoguePointControl; if (topPointControl != null) { DialoguePoint topPoint = new DialoguePoint(); topPoint.dialogueID = topPointControl.GetDialogueValue().dialogueID; if (childControlList[0].Tag != null && childControlList[0].Tag.GetType().Equals(typeof(List <Control>)) && (childControlList[0].Tag as List <Control>).Count > 0) { SetDialoguePointData_Child(topPoint, (childControlList[0].Tag as List <Control>).ToArray()); } dialogueCondition.topPoint = topPoint; } } else { dialogueCondition.topPoint = null; } dialogueConditionList.Add(dialogueCondition); //对话数据 foreach (DialoguePointControl dialoguePointControl in panel.Controls.OfType <DialoguePointControl>()) { DialoguePointControl topPointControl = dialoguePointControl as DialoguePointControl; if (topPointControl != null) { if (!dialogueValueDic.ContainsKey(topPointControl.GetDialogueValue().dialogueID)) { dialogueValueDic.Add(topPointControl.GetDialogueValue().dialogueID, topPointControl.GetDialogueValue()); } } } } dialogueAnalysisData.ResetData(dialogueConditionList, dialogueValueDic); string dialogueConditionStr, dialogueValueStr; dialogueAnalysisData.GetData(out dialogueConditionStr, out dialogueValueStr); //保存 string folderPath = Path.GetDirectoryName(projectPath); File.WriteAllText(folderPath + "\\" + dialogueConditionFileName + ".txt", dialogueConditionStr, Encoding.UTF8); File.WriteAllText(folderPath + "\\" + dialogueValueFileName + ".txt", dialogueValueStr, Encoding.UTF8); }