using System.Text; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; namespace BFEditor { public class TutorialConfigWindow : EditorWindow { #if UNITY_EDITOR && UNITY_STANDALONE int selectIndex = -1;//当前选中的引导Index const float WidthOfLeftPanel = 850; const float WidthOfMiddlePanel = 350; const float WidthOfRightPanel = 300; Vector2 leftScrollPos; Vector2 middleScrollPos; Vector2 rightScrollPos; const int DEFAULT_MASK_COLOR = 156;//默认遮罩颜色 void Awake() { TutorialConfigBridge.Instance.LoadTutorialExcel(); } void OnGUI() { DrawOverviewArea(); DrawDetailArea(); DrawHelpArea(); } void DrawOverviewArea() { GUILayout.BeginArea(new Rect(0, 0, WidthOfLeftPanel, position.height)); leftScrollPos = EditorGUILayout.BeginScrollView(leftScrollPos); for (int i = TutorialConfigBridge.EXTRA_ROW_NUM; i < TutorialConfigBridge.Instance.GetRowNum(); i++) { GUILayout.BeginHorizontal(); EditorGUILayout.LabelField(string.Format("ID:{0}", TutorialConfigBridge.Instance.GetID(i)), GUILayout.Width(80)); EditorGUILayout.LabelField(string.Format("类型:{0}", TutorialConfigBridge.Instance.GetGuideTypeStr(i)), GUILayout.Width(200)); EditorGUILayout.LabelField(string.Format("说明:{0}", TutorialConfigBridge.Instance.GetGuideDescribeStr(i)), GUILayout.Width(300)); if (GUILayout.Button("查看", GUILayout.Width(50))) { selectIndex = i; } if (GUILayout.Button("上方插入", GUILayout.Width(60))) { TutorialConfigBridge.Instance.InsertRow(i); Repaint(); } if (GUILayout.Button("下方插入", GUILayout.Width(60))) { TutorialConfigBridge.Instance.InsertRow(i + 1); Repaint(); } if (GUILayout.Button("删除", GUILayout.Width(50))) { TutorialConfigBridge.Instance.DeleteRow(i); Repaint(); } GUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); GUILayout.EndArea(); } void DrawDetailArea() { GUILayout.BeginArea(new Rect(WidthOfLeftPanel + 20, 0, WidthOfMiddlePanel, position.height)); middleScrollPos = EditorGUILayout.BeginScrollView(middleScrollPos); if (TutorialConfigBridge.EXTRA_ROW_NUM <= selectIndex && selectIndex < TutorialConfigBridge.Instance.GetRowNum()) { var id = TutorialConfigBridge.Instance.GetID(selectIndex); var idType = TutorialIdType.NONE; // 引导大类型 if (!string.IsNullOrEmpty(id)) { idType = (TutorialIdType)(int.Parse(id) / 10000); } //版本 if (idType == TutorialIdType.VERSION) { DrawID(); } //其他(强引导1,功能开启2,功能指引4,跳转8) else { DrawID(); DrawNext(); DrawType(); DrawGuideTypeStr(); DrawDescribeStr(); EditorGUILayout.Space(); DrawImportantAndSteps(); EditorGUILayout.Space(); DrawTarget(); EditorGUILayout.Space(); DrawStage(); DrawCondition(); DrawNextCondition(); DrawAction(); DrawParams(); EditorGUILayout.Space(); DrawHandPos(); DrawBoxPos(); DrawArrow(); DrawBoxHead(); DrawBoxHeadAct(); DrawBoxHeadFlip(); DrawBoxHeadPosition(); DrawAnimationPos(); DrawBoxHeadScale(); DrawHighlight(); DrawRadius(); DrawMaskColor(); EditorGUILayout.Space(); DrawVoice(); } } EditorGUILayout.EndScrollView(); GUILayout.EndArea(); } void DrawHelpArea() { GUILayout.BeginArea(new Rect(WidthOfLeftPanel + WidthOfMiddlePanel + 40, 0, WidthOfRightPanel, position.height)); rightScrollPos = EditorGUILayout.BeginScrollView(rightScrollPos); DrawGuideTypeHelp(); DrawImportantTypeHelp(); DrawConditionTypeHelp(); DrawActionTypeHelp(); EditorGUILayout.EndScrollView(); GUILayout.EndArea(); } //详细绘制 ******************************************************************************************* void DrawID() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("ID(int):", TutorialConfigBridge.Instance.GetID(selectIndex)); if (EditorGUI.EndChangeCheck()) { int parseInt = 0; if (int.TryParse(value, out parseInt)) { TutorialConfigBridge.Instance.SetID(selectIndex, value); UpdateExcel(); } else { Debug.LogError("ID需要为5位整数"); } } EditorGUILayout.EndHorizontal(); } void DrawNext() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("NextID(int):", TutorialConfigBridge.Instance.GetNextID(selectIndex)); if (EditorGUI.EndChangeCheck()) { int parseInt = 0; if (int.TryParse(value, out parseInt)) { TutorialConfigBridge.Instance.SetNextID(selectIndex, value); UpdateExcel(); } else { Debug.LogError("NextID需要为5位整数"); } } EditorGUILayout.EndHorizontal(); } void DrawType() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curType = TutorialConfigBridge.Instance.GetType(selectIndex); var curTypeEnum = TutorialType.NONE; if (!string.IsNullOrEmpty(curType)) { curTypeEnum = (TutorialType)int.Parse(curType); } var newType = (TutorialType)EditorGUILayout.EnumPopup("引导类型:", curTypeEnum); if (EditorGUI.EndChangeCheck()) { var value = ((int)newType).ToString(); TutorialConfigBridge.Instance.SetType(selectIndex, value); //自动配置TypeStr TutorialConfigBridge.Instance.SetGuideTypeStr(selectIndex, TutorialConfigBridge.Instance.GetDefaultGuideTypeStr(newType)); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawGuideTypeStr() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("类型说明(string):", TutorialConfigBridge.Instance.GetGuideTypeStr(selectIndex)); if (EditorGUI.EndChangeCheck()) { TutorialConfigBridge.Instance.SetGuideTypeStr(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawDescribeStr() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("引导说明(string):", TutorialConfigBridge.Instance.GetGuideDescribeStr(selectIndex)); if (EditorGUI.EndChangeCheck()) { TutorialConfigBridge.Instance.SetGuideDescribeStr(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawStage() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("触发关卡(int):", TutorialConfigBridge.Instance.GetStage(selectIndex)); if (EditorGUI.EndChangeCheck()) { int parseInt = 0; if (int.TryParse(value, out parseInt)) { TutorialConfigBridge.Instance.SetStage(selectIndex, value); UpdateExcel(); } else { Debug.LogError("Stage需要为整数"); } } EditorGUILayout.EndHorizontal(); } void DrawImportantAndSteps() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("关键节点类型(string):", TutorialConfigBridge.Instance.GetImportant(selectIndex)); if (EditorGUI.EndChangeCheck()) { TutorialConfigBridge.Instance.SetImportant(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); //Steps if (!string.IsNullOrEmpty(value)) { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value2 = EditorGUILayout.TextField("中断时重启步骤([int]):", TutorialConfigBridge.Instance.GetSteps(selectIndex)); if (EditorGUI.EndChangeCheck()) { TutorialConfigBridge.Instance.SetSteps(selectIndex, value2); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } else { var value2 = TutorialConfigBridge.Instance.GetSteps(selectIndex); if (!string.IsNullOrEmpty(value2)) { //清空steps TutorialConfigBridge.Instance.SetSteps(selectIndex, string.Empty); UpdateExcel(); } } } void DrawTarget() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("UI目标(string):", TutorialConfigBridge.Instance.GetTarget(selectIndex)); if (EditorGUI.EndChangeCheck()) { TutorialConfigBridge.Instance.SetTarget(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawCondition() { //type EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curCondition = TutorialConfigBridge.Instance.GetCondition(selectIndex); var curConditionTypeEnum = TutorialConditionType.NONE; var curConditionValue = 0; if (!string.IsNullOrEmpty(curCondition)) { Vector2Int formatCurCondition = SplitStringToVector2Int(curCondition); curConditionTypeEnum = (TutorialConditionType)formatCurCondition.x; curConditionValue = formatCurCondition.y; } var newConditionType = (TutorialConditionType)EditorGUILayout.EnumPopup("触发条件类型:", curConditionTypeEnum); if (EditorGUI.EndChangeCheck()) { //如果设置为None 则清空数据 if (newConditionType == TutorialConditionType.NONE) { TutorialConfigBridge.Instance.SetCondition(selectIndex, string.Empty); UpdateExcel(); } //正常更新type else { var newValue = Vector2IntToString(new Vector2Int((int)newConditionType, curConditionValue)); TutorialConfigBridge.Instance.SetCondition(selectIndex, newValue); UpdateExcel(); } } EditorGUILayout.EndHorizontal(); //value if (curConditionTypeEnum != TutorialConditionType.NONE) { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("触发条件参数(int):", curConditionValue.ToString()); if (EditorGUI.EndChangeCheck()) { int parseInt = 0; if (int.TryParse(value, out parseInt)) { var newValue2 = Vector2IntToString(new Vector2Int((int)newConditionType, parseInt)); TutorialConfigBridge.Instance.SetCondition(selectIndex, newValue2); UpdateExcel(); } else { Debug.LogError("触发条件参数需要为整数"); } } EditorGUILayout.EndHorizontal(); } } void DrawNextCondition() { //type EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curCondition = TutorialConfigBridge.Instance.GetNextCondition(selectIndex); var curConditionTypeEnum = TutorialConditionType.NONE; var curConditionValue = 0; if (!string.IsNullOrEmpty(curCondition)) { Vector2Int formatCurCondition = SplitStringToVector2Int(curCondition); curConditionTypeEnum = (TutorialConditionType)formatCurCondition.x; curConditionValue = formatCurCondition.y; } var newConditionType = (TutorialConditionType)EditorGUILayout.EnumPopup("结束条件类型:", curConditionTypeEnum); if (EditorGUI.EndChangeCheck()) { //如果设置为None 则清空数据 if (newConditionType == TutorialConditionType.NONE) { TutorialConfigBridge.Instance.SetNextCondition(selectIndex, string.Empty); UpdateExcel(); } //正常更新type else { var newValue = Vector2IntToString(new Vector2Int((int)newConditionType, curConditionValue)); TutorialConfigBridge.Instance.SetNextCondition(selectIndex, newValue); UpdateExcel(); } } EditorGUILayout.EndHorizontal(); //value if (curConditionTypeEnum != TutorialConditionType.NONE) { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("结束条件参数(int):", curConditionValue.ToString()); if (EditorGUI.EndChangeCheck()) { int parseInt = 0; if (int.TryParse(value, out parseInt)) { var newValue2 = Vector2IntToString(new Vector2Int((int)newConditionType, parseInt)); TutorialConfigBridge.Instance.SetNextCondition(selectIndex, newValue2); UpdateExcel(); } else { Debug.LogError("结束条件参数需要为整数"); } } EditorGUILayout.EndHorizontal(); } } void DrawAction() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curType = TutorialConfigBridge.Instance.GetAction(selectIndex); var curTypeEnum = TutorialActionType.NONE; if (!string.IsNullOrEmpty(curType)) { curTypeEnum = (TutorialActionType)int.Parse(curType); } var newType = (TutorialActionType)EditorGUILayout.EnumPopup("特殊行为:", curTypeEnum); if (EditorGUI.EndChangeCheck()) { var value = ((int)newType).ToString(); TutorialConfigBridge.Instance.SetAction(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawParams() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("特殊参数([int]):", TutorialConfigBridge.Instance.GetActionParams(selectIndex)); if (EditorGUI.EndChangeCheck()) { TutorialConfigBridge.Instance.SetActionParams(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } //表现相关 void DrawHandPos() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curValue = TutorialConfigBridge.Instance.GetHandPos(selectIndex); Vector2Int formatCurValue = SplitStringToVector2Int(curValue); var newValue = EditorGUILayout.Vector2IntField("手指偏移:", formatCurValue); if (EditorGUI.EndChangeCheck()) { var value = Vector2IntToString(newValue); TutorialConfigBridge.Instance.SetHandPos(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawBoxPos() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curValue = TutorialConfigBridge.Instance.GetBoxPos(selectIndex); Vector2Int formatCurValue = SplitStringToVector2Int(curValue); var newValue = EditorGUILayout.Vector2IntField("文本框偏移:", formatCurValue); if (EditorGUI.EndChangeCheck()) { var value = Vector2IntToString(newValue); TutorialConfigBridge.Instance.SetBoxPos(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawArrow() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curValue = TutorialConfigBridge.Instance.GetArrow(selectIndex); var toggleValue = EditorGUILayout.Toggle("文本框箭头:", curValue == "1"); if (EditorGUI.EndChangeCheck()) { var value = toggleValue ? "1" : string.Empty; TutorialConfigBridge.Instance.SetArrow(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawBoxHead() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("引导员形象(string):", TutorialConfigBridge.Instance.GetBoxHead(selectIndex)); if (EditorGUI.EndChangeCheck()) { TutorialConfigBridge.Instance.SetBoxHead(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawBoxHeadAct() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curValue = TutorialConfigBridge.Instance.GetBoxHeadAct(selectIndex); var toggleValue = EditorGUILayout.Toggle("引导员show动作(仅对话类):", curValue == "1"); if (EditorGUI.EndChangeCheck()) { var value = toggleValue ? "1" : string.Empty; TutorialConfigBridge.Instance.SetBoxHeadAct(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawBoxHeadFlip() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curValue = TutorialConfigBridge.Instance.GetBoxHeadFlip(selectIndex); var toggleValue = EditorGUILayout.Toggle("引导员翻转:", curValue == "1"); if (EditorGUI.EndChangeCheck()) { var value = toggleValue ? "1" : string.Empty; TutorialConfigBridge.Instance.SetBoxHeadFlip(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawBoxHeadPosition() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curValue = TutorialConfigBridge.Instance.GetBoxHeadPosition(selectIndex); var toggleValue = EditorGUILayout.Toggle("引导员是否在左边(剧情专用):", curValue == "1"); if (EditorGUI.EndChangeCheck()) { var value = toggleValue ? "1" : string.Empty; TutorialConfigBridge.Instance.SetBoxHeadPosition(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawAnimationPos() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curValue = TutorialConfigBridge.Instance.GetAnimationPosition(selectIndex); Vector2Int formatCurValue = SplitStringToVector2Int(curValue); var newValue = EditorGUILayout.Vector2IntField("引导员偏移:", formatCurValue); if (EditorGUI.EndChangeCheck()) { var value = Vector2IntToString(newValue); TutorialConfigBridge.Instance.SetAnimationPosition(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawBoxHeadScale() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("引导员缩放(1000标准值)(int):", TutorialConfigBridge.Instance.GetBoxHeadScale(selectIndex)); if (EditorGUI.EndChangeCheck()) { int parseInt = 0; if (int.TryParse(value, out parseInt)) { TutorialConfigBridge.Instance.SetBoxHeadScale(selectIndex, value); UpdateExcel(); } else { Debug.LogError("BoxHeadScale需要为整数"); } } EditorGUILayout.EndHorizontal(); } void DrawHighlight() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curValue = TutorialConfigBridge.Instance.GetHighlight(selectIndex); var toggleValue = EditorGUILayout.Toggle("高亮形状(默认圆,勾上为方形):", curValue == "1"); if (EditorGUI.EndChangeCheck()) { var value = toggleValue ? "1" : string.Empty; TutorialConfigBridge.Instance.SetHighlight(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawRadius() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("高亮半径(默认100)(int):", TutorialConfigBridge.Instance.GetRadius(selectIndex)); if (EditorGUI.EndChangeCheck()) { int parseInt = 0; if (int.TryParse(value, out parseInt)) { TutorialConfigBridge.Instance.SetRadius(selectIndex, value); UpdateExcel(); } else { Debug.LogError("Radius需要为整数"); } } EditorGUILayout.EndHorizontal(); } void DrawMaskColor() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var curValue = TutorialConfigBridge.Instance.GetMaskColor(selectIndex); var curSliderValue = DEFAULT_MASK_COLOR; if (!string.IsNullOrEmpty(curValue)) { curSliderValue = int.Parse(curValue); } var sliderValue = EditorGUILayout.IntSlider("遮罩颜色值(剧情类无效):", curSliderValue, 0, 255); if (EditorGUI.EndChangeCheck()) { var value = sliderValue.ToString(); TutorialConfigBridge.Instance.SetMaskColor(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } void DrawVoice() { EditorGUILayout.BeginHorizontal(); EditorGUI.BeginChangeCheck(); var value = EditorGUILayout.TextField("语音(string):", TutorialConfigBridge.Instance.GetVoice(selectIndex)); if (EditorGUI.EndChangeCheck()) { TutorialConfigBridge.Instance.SetVoice(selectIndex, value); UpdateExcel(); } EditorGUILayout.EndHorizontal(); } //帮助绘制 ******************************************************************************************* void DrawGuideTypeHelp() { //TODO } void DrawImportantTypeHelp() { //TODO } void DrawConditionTypeHelp() { //TODO } void DrawActionTypeHelp() { //TODO } //通用接口 ******************************************************************************************* /// /// 将[a,b,c...,x]格式的string类型转为int[]类型 /// /// int[] SplitStringToIntArray(string value) { int[] array = null; if (value.StartsWith("[") && value.EndsWith("]")) { var valueStrs = value.Split(',', '[', ']'); array = new int[valueStrs.Length]; for (int i = 0; i < array.Length - 2; i++) { array[i] = int.Parse(valueStrs[i + 1]); } } return array; } string IntArrayToString(int[] array) { string stringValue = string.Empty; if (array != null && array.Length > 0) { stringValue = "["; for (int i = 0; i < array.Length; i++) { stringValue = stringValue + array[i]; if (i < array.Length - 1) { stringValue = stringValue + ","; } } stringValue = stringValue + "]"; } return stringValue; } /// /// 将[a,b]格式的string类型转为Vector2Int类型 /// /// Vector2Int SplitStringToVector2Int(string value) { Vector2Int array = new Vector2Int(); if (value.StartsWith("[") && value.EndsWith("]")) { var valueStrs = value.Split(',', '[', ']'); if (valueStrs.Length == 4) { for (int i = 0; i < 2; i++) { array[i] = int.Parse(valueStrs[i + 1]); } } } return array; } string Vector2IntToString(Vector2Int value) { string stringValue = string.Empty; stringValue = string.Format("[{0},{1}]", value.x, value.y); return stringValue; } /// /// 更新Excel /// void UpdateExcel() { TutorialConfigBridge.Instance.SaveExcel(); } #endif } }