少年修仙传客户端基础资源
client_Hale
2019-11-05 857470a8e17241c4c920ad4366c3f5cdd9a52465
Assets/Editor/ScriptEditor/NewBieGuideEditorWindow.cs
@@ -4,604 +4,616 @@
using UnityEditor;
using Snxxz.UI;
using UnityEngine.UI;
using TableConfig;
public class NewBieGuideEditorWindow : EditorWindow
public class NewBieGuideEditorWindow : EditorWindow
{
    [MenuItem("程序/新手调试器")]
    public static void Create()
    {
        var window = GetWindow(typeof(NewBieGuideEditorWindow), false, "新手调试器") as NewBieGuideEditorWindow;
        window.Show();
        window.autoRepaintOnSceneChange = true;
    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<UIRoot>()); }
        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();
    }
    UIRoot m_UIRoot;
    UIRoot uiroot {
        get { return m_UIRoot ?? (m_UIRoot = FindObjectOfType<UIRoot>()); }
        set { m_UIRoot = value; }
    private void ImportNewBieConfig()
    {
        var fileName = StringUtility.Contact("NewBieGuideStep_", stepId, ".asset");
        var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName);
        var so = AssetDatabase.LoadAssetAtPath<NewBieGuideScriptableObject>(path);
        if (newBieWin == null)
        {
            var newBieWin = FindObjectOfType<NewBieWin>();
            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<UIRoot>();
                    if (uiroot == null)
                    {
                        var rootPrefab = BuiltInLoader.LoadPrefab("UIRoot");
                        var root = GameObject.Instantiate(rootPrefab, Vector3.zero, Quaternion.identity);
                        root.name = "UIRoot";
                        uiroot = root.GetComponent<UIRoot>();
                    }
                    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<Transform>("Container_Function");
            this.functionalUnLock.gameObject.SetActive(false);
            this.newbieMask = this.newBieWin.GetComponent<NewBieMask>("Container_Guide/Mask");
            this.newBiecontainerDialogue = this.newBieWin.GetComponent<Transform>("Container_Guide/Container_Dialogue");
            this.newBieDialogueContent = this.newBieWin.GetComponent<Text>("Container_Guide/Container_Dialogue/Txt_Dialogue");
            this.newBieImageHint = this.newBieWin.GetComponent<RectTransform>("Container_Guide/Container_ClickHint");
            this.newBieHintEffectContainer = this.newBieWin.GetComponent<RectTransform>("Container_Guide/Container_ClickHint/Img_Effect");
            this.newBieContainerArrow = this.newBieWin.GetComponent<RectTransform>("Container_Guide/Container_ClickHint/Container_Arrow");
            this.newBieArrowImage = this.newBieWin.GetComponent<Image>("Container_Guide/Container_ClickHint/Container_Arrow/Img_Arrow");
            this.newbieUsherMMContainer = this.newBieWin.GetComponent<RectTransform>("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();
    }
    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 ExportNewBieConfig()
    {
        var fileName = StringUtility.Contact("NewBieGuideStep_", stepId, ".asset");
        var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName);
        AssetDatabase.DeleteAsset(path);
        var so = CreateInstance<NewBieGuideScriptableObject>();
        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 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 ImportRecommondConfig()
    {
        var fileName = StringUtility.Contact("FunctionalGuideStep_", stepId, ".asset");
        var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName);
        var so = AssetDatabase.LoadAssetAtPath<NewBieGuideScriptableObject>(path);
        if (recommendWin == null)
        {
            var recommendWin = FindObjectOfType<FunctionalGuideWin>();
            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<UIRoot>();
                    if (uiroot == null)
                    {
                        var rootPrefab = BuiltInLoader.LoadPrefab("UIRoot");
                        var root = GameObject.Instantiate(rootPrefab, Vector3.zero, Quaternion.identity);
                        root.name = "UIRoot";
                        uiroot = root.GetComponent<UIRoot>();
                    }
                    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<FunctionalGuideBehaviour>();
            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 ImportNewBieConfig()
    {
        var fileName = StringUtility.Contact("NewBieGuideStep_", stepId, ".asset");
        var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName);
        var so = AssetDatabase.LoadAssetAtPath<NewBieGuideScriptableObject>(path);
        if (newBieWin == null)
        {
            var newBieWin = FindObjectOfType<NewBieWin>();
            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<UIRoot>();
                    if (uiroot == null)
                    {
                        var rootPrefab = Resources.Load<GameObject>("UI/Prefabs/UIRoot");
                        var root = GameObject.Instantiate(rootPrefab, Vector3.zero, Quaternion.identity);
                        root.name = "UIRoot";
                        uiroot = root.GetComponent<UIRoot>();
                    }
                    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<Transform>("Container_Function");
            this.functionalUnLock.gameObject.SetActive(false);
            this.newbieMask = this.newBieWin.GetComponent<NewBieMask>("Container_Guide/Mask");
            this.newBiecontainerDialogue = this.newBieWin.GetComponent<Transform>("Container_Guide/Container_Dialogue");
            this.newBieDialogueContent = this.newBieWin.GetComponent<Text>("Container_Guide/Container_Dialogue/Txt_Dialogue");
            this.newBieImageHint = this.newBieWin.GetComponent<RectTransform>("Container_Guide/Container_ClickHint");
            this.newBieHintEffectContainer = this.newBieWin.GetComponent<RectTransform>("Container_Guide/Container_ClickHint/Img_Effect");
            this.newBieContainerArrow = this.newBieWin.GetComponent<RectTransform>("Container_Guide/Container_ClickHint/Container_Arrow");
            this.newBieArrowImage = this.newBieWin.GetComponent<Image>("Container_Guide/Container_ClickHint/Container_Arrow/Img_Arrow");
            this.newbieUsherMMContainer = this.newBieWin.GetComponent<RectTransform>("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 ExportRecommondConfig()
    {
        var fileName = StringUtility.Contact("FunctionalGuideStep_", stepId, ".asset");
        var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName);
        AssetDatabase.DeleteAsset(path);
        var so = CreateInstance<NewBieGuideScriptableObject>();
        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 ExportNewBieConfig()
    {
        var fileName = StringUtility.Contact("NewBieGuideStep_", stepId, ".asset");
        var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName);
        AssetDatabase.DeleteAsset(path);
        var so = CreateInstance<NewBieGuideScriptableObject>();
        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 StartNewBieGuide()
    {
        NewBieCenter.Instance.currentGuide = guideId;
        NewBieCenter.Instance.StartNewBieGuide(guideId);
    }
    private void ImportRecommondConfig()
    {
        var fileName = StringUtility.Contact("FunctionalGuideStep_", stepId, ".asset");
        var path = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoNewBieGuide/", fileName);
        var so = AssetDatabase.LoadAssetAtPath<NewBieGuideScriptableObject>(path);
        if (recommendWin == null)
        {
            var recommendWin = FindObjectOfType<FunctionalGuideWin>();
            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<UIRoot>();
                    if (uiroot == null)
                    {
                        var rootPrefab = Resources.Load<GameObject>("UI/Prefabs/UIRoot");
                        var root = GameObject.Instantiate(rootPrefab, Vector3.zero, Quaternion.identity);
                        root.name = "UIRoot";
                        uiroot = root.GetComponent<UIRoot>();
                    }
                    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<FunctionalGuideBehaviour>();
            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;
            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 StartFunctionalGuide()
    {
        FunctionalGuideCenter.Instance.StartGuide(guideId);
    }
    private GameObject GetUsherMM(int _action)
    {
        var instance = UIUtility.CreateWidget("GuideUsher", "GuideUsher");
        return instance;
    }
    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<NewBieGuideScriptableObject>();
        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;
            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,//功能性引导,推荐性的。
    enum GuideType
    {
        NewBie,        //新手引导,半强制性的。
        Recommend,//功能性引导,推荐性的。
    }
    List<NewBieGuide> newbieGuides = null;
    List<FunctionalGuide> functionalGuides = null;
    List<FunctionalGuide> functionalGuides = null;
    private Vector2 scrollPosition;
    void DrawNewbieGuides()
    {
        if (ConfigManager.Instance.inited && newbieGuides == null)
        {
            newbieGuides = new List<NewBieGuide>();
            var guides = ConfigManager.Instance.GetAllValues<GuideConfig>();
            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 DrawNewbieGuides()
    {
        if (ConfigInitiator.done && newbieGuides == null)
        {
            newbieGuides = new List<NewBieGuide>();
            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 (ConfigManager.Instance.inited && functionalGuides == null)
        {
            functionalGuides = new List<FunctionalGuide>();
            var guides = ConfigManager.Instance.GetAllValues<GuideConfig>();
            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();
                }
                EditorGUILayout.Space();
                EditorGUILayout.EndHorizontal();
            }
            GUILayout.EndScrollView();
        }
    void DrawFunctionalGuides()
    {
        if (ConfigInitiator.done && functionalGuides == null)
        {
            functionalGuides = new List<FunctionalGuide>();
            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 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 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);
        }
    }