using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using Snxxz.UI; using UnityEngine.UI; public class NewBieGuideEditorWindow : EditorWindow { [MenuItem("程序/新手调试器")] public static void Create() { var window = GetWindow(typeof(NewBieGuideEditorWindow), false, "新手调试器") as NewBieGuideEditorWindow; window.Show(); window.autoRepaintOnSceneChange = true; } UIRoot m_UIRoot; UIRoot uiroot { get { return m_UIRoot ?? (m_UIRoot = FindObjectOfType()); } set { m_UIRoot = value; } } string guideContent = string.Empty; Transform m_ClickTarget; NewBieGuideScriptableObject.ArrowPosition arrowPosition = NewBieGuideScriptableObject.ArrowPosition.None; NewBieGuideScriptableObject.SelectBoxPattern selectBox = NewBieGuideScriptableObject.SelectBoxPattern.Pattern1; GameObject selectBoxGameObject; GuideType guideType = GuideType.NewBie; int stepId = 0; int guideId = 0; GameObject newBieWin; Transform functionalUnLock; NewBieMask newbieMask; Transform newBiecontainerDialogue; Text newBieDialogueContent; RectTransform newBieImageHint; RectTransform newBieHintEffectContainer; RectTransform newBieContainerArrow; Image newBieArrowImage; RectTransform newbieUsherMMContainer; int voice = 0; int effect2 = 0; int usherAction = 0; bool clickAnyWhereComplete = false; bool pointerDownComplete = false; NewBieGuideScriptableObject.UsherOrientation usherOrientation = NewBieGuideScriptableObject.UsherOrientation.Normal; GameObject usherMM; GameObject recommendWin; FunctionalGuideBehaviour recommendBehaviour; RectTransform recommendImageHint; private void Update() { if (newbieMask != null && newBieImageHint != null) { newbieMask.mask.center = newBieImageHint.localPosition; newbieMask.mask.cell = newBieImageHint.sizeDelta; } } private void OnGUI() { EditorGUILayout.BeginVertical(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.Space(); guideType = GUILayout.Toggle(guideType == GuideType.NewBie, "新手引导") ? GuideType.NewBie : GuideType.Recommend; guideType = GUILayout.Toggle(guideType == GuideType.Recommend, "功能推荐") ? GuideType.Recommend : GuideType.NewBie; EditorGUILayout.Space(); EditorGUILayout.EndHorizontal(); GUILayout.Space(30); EditorGUILayout.BeginHorizontal(); stepId = EditorGUILayout.IntField("步骤ID", stepId); if (GUILayout.Button("导入")) { switch (guideType) { case GuideType.NewBie: ImportNewBieConfig(); break; case GuideType.Recommend: ImportRecommondConfig(); break; } } if (GUILayout.Button("保存")) { switch (guideType) { case GuideType.NewBie: ExportNewBieConfig(); break; case GuideType.Recommend: ExportRecommondConfig(); break; } } EditorGUILayout.EndHorizontal(); guideContent = EditorGUILayout.TextField("引导内容", guideContent); m_ClickTarget = (Transform)EditorGUILayout.ObjectField("点击目标", m_ClickTarget, typeof(Transform), true); arrowPosition = (NewBieGuideScriptableObject.ArrowPosition)EditorGUILayout.EnumPopup("箭头方向", arrowPosition); selectBox = (NewBieGuideScriptableObject.SelectBoxPattern)EditorGUILayout.EnumPopup("选中框样式", selectBox); voice = EditorGUILayout.IntField("音效", voice); effect2 = EditorGUILayout.IntField("特效2", effect2); EditorGUILayout.BeginHorizontal(); usherAction = EditorGUILayout.IntField("引导MM动作", usherAction); usherOrientation = (NewBieGuideScriptableObject.UsherOrientation)EditorGUILayout.EnumPopup("引导MM方向", usherOrientation); EditorGUILayout.EndHorizontal(); clickAnyWhereComplete = EditorGUILayout.Toggle("点击任意位置完成引导", clickAnyWhereComplete); pointerDownComplete = EditorGUILayout.Toggle("鼠标按下即完成引导", pointerDownComplete); EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("重置所有引导")) { NewBieCenter.Instance.ResetAllGuides(); } if (GUILayout.Button("结束所有引导")) { NewBieCenter.Instance.CompleteAllGuides(); } EditorGUILayout.EndHorizontal(); switch (guideType) { case GuideType.NewBie: DrawNewbieGuides(); break; case GuideType.Recommend: DrawFunctionalGuides(); break; } EditorGUILayout.EndVertical(); } private void ImportNewBieConfig() { var fileName = StringUtility.Contact("NewBieGuideStep_", stepId, ".asset"); var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName); var so = AssetDatabase.LoadAssetAtPath(path); if (newBieWin == null) { var newBieWin = FindObjectOfType(); this.newBieWin = newBieWin != null ? newBieWin.gameObject : null; if (this.newBieWin == null) { var prefab = UILoader.LoadWindow("NewBieWin"); this.newBieWin = GameObject.Instantiate(prefab) as GameObject; this.newBieWin.name = "NewBieWin"; if (this.newBieWin != null) { uiroot = GameObject.FindObjectOfType(); if (uiroot == null) { var rootPrefab = BuiltInLoader.LoadPrefab("UIRoot"); var root = GameObject.Instantiate(rootPrefab, Vector3.zero, Quaternion.identity); root.name = "UIRoot"; uiroot = root.GetComponent(); } var parent = uiroot.systemCanvas.transform; (this.newBieWin.transform as RectTransform).MatchWhith(parent as RectTransform); PrefabUtility.DisconnectPrefabInstance(this.recommendWin); } } Selection.activeGameObject = this.newBieWin; this.functionalUnLock = this.newBieWin.GetComponent("Container_Function"); this.functionalUnLock.gameObject.SetActive(false); this.newbieMask = this.newBieWin.GetComponent("Container_Guide/Mask"); this.newBiecontainerDialogue = this.newBieWin.GetComponent("Container_Guide/Container_Dialogue"); this.newBieDialogueContent = this.newBieWin.GetComponent("Container_Guide/Container_Dialogue/Txt_Dialogue"); this.newBieImageHint = this.newBieWin.GetComponent("Container_Guide/Container_ClickHint"); this.newBieHintEffectContainer = this.newBieWin.GetComponent("Container_Guide/Container_ClickHint/Img_Effect"); this.newBieContainerArrow = this.newBieWin.GetComponent("Container_Guide/Container_ClickHint/Container_Arrow"); this.newBieArrowImage = this.newBieWin.GetComponent("Container_Guide/Container_ClickHint/Container_Arrow/Img_Arrow"); this.newbieUsherMMContainer = this.newBieWin.GetComponent("Container_Guide/Img_UsherMM"); } if (so != null) { m_ClickTarget = uiroot.transform.Find(so.UIElementPath); newbieMask.mask.center = so.clickPosition; newbieMask.mask.cell = so.clickSize; newBiecontainerDialogue.localPosition = so.tipPosition; newBieDialogueContent.text = so.tipContent; newBieImageHint.localPosition = so.clickPosition; newBieImageHint.sizeDelta = so.clickSize; var selectBosAssetName = so.selectBox == 0 ? "SelectBox1" : "SelectBox2"; var selectBoxGameObject = UIUtility.CreateWidget(selectBosAssetName, selectBosAssetName); ((RectTransform)selectBoxGameObject.transform).MatchWhith(newBieHintEffectContainer); newbieUsherMMContainer.localPosition = so.usherPosition; newbieUsherMMContainer.localEulerAngles = new Vector3(0, so.usherOrientation == 0 ? 0 : 180, 0); voice = so.voice; clickAnyWhereComplete = so.clickAnyWhereComplete; pointerDownComplete = so.pointerDownComplete; guideContent = so.tipContent; arrowPosition = so.arrowPosition; selectBox = so.selectBox; usherAction = so.usherAction; usherOrientation = so.usherOrientation; if (so.usherAction != 0) { if (usherMM != null) { GameObject.DestroyImmediate(usherMM); } usherMM = GetUsherMM(so.usherAction); usherMM.transform.SetParentEx(newbieUsherMMContainer, Vector3.zero, Vector3.zero, Vector3.one); usherMM.SetActive(true); } newBieContainerArrow.gameObject.SetActive(so.arrowPosition != NewBieGuideScriptableObject.ArrowPosition.None); if (so.arrowPosition != NewBieGuideScriptableObject.ArrowPosition.None) { switch (so.arrowPosition) { case NewBieGuideScriptableObject.ArrowPosition.Left: newBieContainerArrow.localPosition = so.clickPosition - new Vector2(so.clickSize.x * 0.5f + newBieContainerArrow.rect.width * 0.5f, 0f); newBieArrowImage.transform.localEulerAngles = new Vector3(0, 0, 90); break; case NewBieGuideScriptableObject.ArrowPosition.Right: newBieContainerArrow.localPosition = so.clickPosition + new Vector2(so.clickSize.x * 0.5f + newBieContainerArrow.rect.width * 0.5f, 0f); newBieArrowImage.transform.localEulerAngles = new Vector3(0, 0, 270); break; case NewBieGuideScriptableObject.ArrowPosition.Top: newBieContainerArrow.localPosition = so.clickPosition + new Vector2(0f, so.clickSize.y * 0.5f + newBieContainerArrow.rect.height * 0.5f); newBieArrowImage.transform.localEulerAngles = new Vector3(0, 0, 0); break; case NewBieGuideScriptableObject.ArrowPosition.Bottom: newBieContainerArrow.localPosition = so.clickPosition - new Vector2(0f, so.clickSize.y * 0.5f + newBieContainerArrow.rect.height * 0.5f); newBieArrowImage.transform.localEulerAngles = new Vector3(0, 0, 180); break; } } } Repaint(); } private void ExportNewBieConfig() { var fileName = StringUtility.Contact("NewBieGuideStep_", stepId, ".asset"); var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName); AssetDatabase.DeleteAsset(path); var so = CreateInstance(); AssetDatabase.CreateAsset(so, path); if (newBieWin != null) { so.stepId = stepId; so.clickPosition = newBieImageHint.transform.localPosition; so.clickSize = newBieImageHint.sizeDelta; so.tipPosition = newBiecontainerDialogue.localPosition; so.tipContent = newBieDialogueContent.text; so.arrowPosition = arrowPosition; so.selectBox = selectBox; so.usherOrientation = usherOrientation; so.effect2 = effect2; so.usherPosition = newbieUsherMMContainer.localPosition; so.usherAction = usherAction; so.voice = voice; so.clickAnyWhereComplete = clickAnyWhereComplete; so.pointerDownComplete = pointerDownComplete; so.tipContent = guideContent; if (m_ClickTarget != null) { so.UIElementPath = UIUtility.GetUIElementRelativePath(uiroot, m_ClickTarget); } } AssetDatabase.Refresh(); EditorUtility.SetDirty(so); AssetDatabase.SaveAssets(); } private void ImportRecommondConfig() { var fileName = StringUtility.Contact("FunctionalGuideStep_", stepId, ".asset"); var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName); var so = AssetDatabase.LoadAssetAtPath(path); if (recommendWin == null) { var recommendWin = FindObjectOfType(); this.recommendWin = recommendWin != null ? recommendWin.gameObject : null; if (this.recommendWin == null) { var prefab = UILoader.LoadWindow("FunctionalGuideWin"); this.recommendWin = GameObject.Instantiate(prefab) as GameObject; this.recommendWin.name = "FunctionalGuideWin"; if (this.recommendWin != null) { uiroot = GameObject.FindObjectOfType(); if (uiroot == null) { var rootPrefab = BuiltInLoader.LoadPrefab("UIRoot"); var root = GameObject.Instantiate(rootPrefab, Vector3.zero, Quaternion.identity); root.name = "UIRoot"; uiroot = root.GetComponent(); } var parent = uiroot.systemCanvas.transform; (this.recommendWin.transform as RectTransform).MatchWhith(parent as RectTransform); PrefabUtility.DisconnectPrefabInstance(this.recommendWin); } } Selection.activeGameObject = this.recommendWin; var instance = UIUtility.CreateWidget("FunctionalGuideBehaviour", "FunctionalGuideBehaviour"); var behaviourRectTransform = (RectTransform)instance.transform; recommendBehaviour = instance.GetComponent(); this.recommendWin.gameObject.SetActive(true); behaviourRectTransform.MatchWhith(this.recommendWin.transform as RectTransform); recommendBehaviour.gameObject.SetActive(true); this.recommendImageHint = this.recommendBehaviour.clickHintRoot; } if (so != null) { m_ClickTarget = uiroot.transform.Find(so.UIElementPath); recommendImageHint.transform.localPosition = so.clickPosition; recommendImageHint.sizeDelta = so.clickSize; guideContent = so.tipContent; arrowPosition = so.arrowPosition; selectBox = so.selectBox; effect2 = so.effect2; var selectBosAssetName = string.Empty; switch (so.selectBox) { case NewBieGuideScriptableObject.SelectBoxPattern.Pattern1: selectBosAssetName = "SelectBox1"; break; case NewBieGuideScriptableObject.SelectBoxPattern.Pattern2: selectBosAssetName = "SelectBox2"; break; case NewBieGuideScriptableObject.SelectBoxPattern.None: selectBosAssetName = string.Empty; break; } if (selectBoxGameObject != null) { DestroyImmediate(selectBoxGameObject); selectBoxGameObject = null; } if (!string.IsNullOrEmpty(selectBosAssetName)) { selectBoxGameObject = UIUtility.CreateWidget(selectBosAssetName, selectBosAssetName); ((RectTransform)selectBoxGameObject.transform).MatchWhith(recommendImageHint); } } Repaint(); } private void ExportRecommondConfig() { var fileName = StringUtility.Contact("FunctionalGuideStep_", stepId, ".asset"); var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName); AssetDatabase.DeleteAsset(path); var so = CreateInstance(); AssetDatabase.CreateAsset(so, path); if (recommendBehaviour != null) { so.stepId = stepId; so.clickPosition = recommendImageHint.transform.localPosition; so.clickSize = recommendImageHint.sizeDelta; so.tipContent = guideContent; so.arrowPosition = arrowPosition; so.selectBox = selectBox; so.effect2 = effect2; if (m_ClickTarget != null) { so.UIElementPath = UIUtility.GetUIElementRelativePath(uiroot, m_ClickTarget); } } AssetDatabase.Refresh(); EditorUtility.SetDirty(so); AssetDatabase.SaveAssets(); } private void StartNewBieGuide() { NewBieCenter.Instance.currentGuide = guideId; NewBieCenter.Instance.StartNewBieGuide(guideId); } private void StartFunctionalGuide() { FunctionalGuideCenter.Instance.StartGuide(guideId); } private GameObject GetUsherMM(int _action) { var instance = UIUtility.CreateWidget("GuideUsher", "GuideUsher"); return instance; } enum GuideType { NewBie, //新手引导,半强制性的。 Recommend,//功能性引导,推荐性的。 } List newbieGuides = null; List functionalGuides = null; private Vector2 scrollPosition; void DrawNewbieGuides() { if (ConfigInitiator.done && newbieGuides == null) { newbieGuides = new List(); var guides = GuideConfig.GetValues(); foreach (var config in guides) { if (config.Type == 1) { newbieGuides.Add(new NewBieGuide(config.ID)); } } } if (newbieGuides != null) { scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, false); foreach (var newbieGuide in newbieGuides) { EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.Space(); EditorGUILayout.LabelField("半强制引导Id:" + newbieGuide.guideId); EditorGUILayout.Toggle("Completed", newbieGuide.completed); GUI.skin.button.normal.textColor = newbieGuide.guideId == NewBieCenter.Instance.currentGuide ? Color.red : Color.white; if (GUILayout.Button("开始")) { newbieGuide.Begin(); } GUI.skin.button.normal.textColor = Color.white; if (GUILayout.Button("完成")) { newbieGuide.Finish(); } if (GUILayout.Button("重置")) { newbieGuide.Reset(); } EditorGUILayout.Space(); EditorGUILayout.EndHorizontal(); } GUILayout.EndScrollView(); } } void DrawFunctionalGuides() { if (ConfigInitiator.done && functionalGuides == null) { functionalGuides = new List(); var guides = GuideConfig.GetValues(); foreach (var config in guides) { if (config.Type == 2) { functionalGuides.Add(new FunctionalGuide(config.ID)); } } } if (functionalGuides != null) { scrollPosition = GUILayout.BeginScrollView(scrollPosition, false, false); foreach (var guide in functionalGuides) { EditorGUILayout.Space(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.Space(); EditorGUILayout.LabelField("自由引导Id:" + guide.guideId); EditorGUILayout.Toggle("Completed", guide.completed); GUI.skin.button.normal.textColor = FunctionalGuideCenter.Instance.GetUnderwayGuides().Contains(guide.guideId) ? Color.red : Color.white; if (GUILayout.Button("开始")) { guide.Begin(); } GUI.skin.button.normal.textColor = Color.white; if (GUILayout.Button("完成")) { guide.Finish(); } if (GUILayout.Button("重置")) { guide.Reset(); } EditorGUILayout.Space(); EditorGUILayout.EndHorizontal(); } GUILayout.EndScrollView(); } } public class NewBieGuide { public int guideId; public bool completed { get { return NewBieCenter.Instance.completeGuidesBuf.Contains(guideId); } } public NewBieGuide(int _guideId) { guideId = _guideId; } public void Begin() { NewBieCenter.Instance.StartNewBieGuide(guideId); } public void Finish() { NewBieCenter.Instance.FinishNewBieGuide(guideId); } public void Reset() { NewBieCenter.Instance.ResetGuide(guideId); } } public class FunctionalGuide { public int guideId; public bool completed { get { return NewBieCenter.Instance.completeGuidesBuf.Contains(guideId); } } public FunctionalGuide(int _guideId) { guideId = _guideId; } public void Begin() { FunctionalGuideCenter.Instance.StartGuide(guideId); } public void Finish() { FunctionalGuideCenter.Instance.RemoveGuide(guideId); } public void Reset() { NewBieCenter.Instance.ResetGuide(guideId); } } }