using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEditor;
|
using vnxbqy.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<UIRoot>()); }
|
set { m_UIRoot = value; }
|
}
|
|
string guideContent = string.Empty;
|
Transform m_ClickTarget;
|
NewBieGuideScriptableObject.ArrowPosition arrowPosition = NewBieGuideScriptableObject.ArrowPosition.None;
|
NewBieGuideScriptableObject.SelectBoxPattern selectBox = NewBieGuideScriptableObject.SelectBoxPattern.Pattern1;
|
NewBieGuideScriptableObject.UseWindow useWindow = NewBieGuideScriptableObject.UseWindow.None;
|
|
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;
|
bool clickOthersComplete = 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);
|
clickOthersComplete = EditorGUILayout.Toggle("点击其他位置中断引导(会隐藏蒙版)", clickOthersComplete);
|
useWindow = (NewBieGuideScriptableObject.UseWindow)EditorGUILayout.EnumPopup("引导用途需做额外逻辑", useWindow);
|
|
|
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<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;
|
clickOthersComplete = so.clickOthersComplete;
|
useWindow = so.useWindow;
|
|
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<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.clickOthersComplete = clickOthersComplete;
|
so.pointerDownComplete = pointerDownComplete;
|
so.tipContent = guideContent;
|
so.useWindow = useWindow;
|
|
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<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 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 StartNewBieGuide()
|
{
|
NewBieCenter.Instance.currentGuide = guideId;
|
NewBieCenter.Instance.StartNewBieGuideEx(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<NewBieGuide> newbieGuides = null;
|
List<FunctionalGuide> functionalGuides = null;
|
private Vector2 scrollPosition;
|
|
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 (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.StartNewBieGuideEx(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);
|
}
|
|
}
|
|
|
|
}
|