//--------------------------------------------------------
|
// [Author]: 第二世界
|
// [ Date ]: Tuesday, November 21, 2017
|
//--------------------------------------------------------
|
|
using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
using UnityEngine.EventSystems;
|
|
namespace vnxbqy.UI
|
{
|
|
public class NewBieWin : Window
|
{
|
[SerializeField] RectTransform m_RaycasterMask;
|
|
[SerializeField] Transform m_NewFunction;
|
[SerializeField] Transform m_ContainerFunctionBg;
|
[SerializeField] Text m_FunctionName;
|
[SerializeField] Transform m_ContainerFlyObject;
|
|
[SerializeField] Transform m_NewBieGuide;
|
[SerializeField] NewBieMask m_NewBieMask;
|
[SerializeField] Button m_ClickEmptyComplete;
|
[SerializeField] Transform m_ContainerDialogue;
|
[SerializeField] RectTransform m_BubbleArrow;
|
[SerializeField] Text m_Dialogue;
|
[SerializeField] RectTransform m_ClickHintRoot;
|
[SerializeField] RectTransform m_ClickHint;
|
[SerializeField] RectTransform m_ContainerArrow;
|
[SerializeField] NewBieGuideUsher m_newBieGuideUsher;
|
[SerializeField] Image m_Arrow;
|
[SerializeField] PositionTween m_ArrowTween;
|
[SerializeField] Button m_Skip;
|
[SerializeField] UIEffect m_Effect2;
|
|
Transform m_ClickTarget;
|
|
RectTransform selectBox;
|
NewBieGuideScriptableObject.SelectBoxPattern selectBoxPatternBuf;
|
|
#region Built-in
|
protected override void BindController()
|
{
|
}
|
|
protected override void AddListeners()
|
{
|
m_Skip.AddListener(SkipNewBieGuide);
|
}
|
|
protected override void OnPreOpen()
|
{
|
m_ClickTarget = null;
|
|
m_NewFunction.SetActive(false);
|
m_NewBieGuide.SetActive(false);
|
m_RaycasterMask.SetActive(true);
|
}
|
|
protected override void OnAfterOpen()
|
{
|
NewBieCenter.Instance.guideStepChangeEvent += OnStepChange;
|
}
|
|
protected override void OnPreClose()
|
{
|
NewBieCenter.Instance.guideStepChangeEvent -= OnStepChange;
|
if (NewBieCenter.Instance.currentGuide != 0)
|
{
|
m_newBieGuideUsher.Stop();
|
UnAttachTrigger();
|
m_ClickTarget = null;
|
NewBieCenter.Instance.FinishCurrentGuideWithoutCloseWin();
|
}
|
}
|
|
protected override void OnAfterClose()
|
{
|
|
}
|
|
protected override void OnActived()
|
{
|
|
base.OnActived();
|
var config = GuideConfig.Get(NewBieCenter.Instance.currentGuide);
|
if (config.TriggerType == (int)GuideTriggerType.FunctionOpen
|
|| config.TriggerType == (int)GuideTriggerType.ManualFunctionOpen
|
|| config.TriggerType == (int)GuideTriggerType.RuneInlay)
|
{
|
|
DisplayFunctionUnLock(config.Condition);
|
if (config.Steps == null || config.Steps.Length == 0)
|
{
|
Clock.AlarmAfter(5,
|
() =>
|
{
|
var guideId = config.ID;
|
if (NewBieCenter.Instance.currentGuide != 0 && NewBieCenter.Instance.currentGuide == guideId)
|
{
|
NewBieCenter.Instance.FinishNewBieGuide(guideId);
|
}
|
}
|
);
|
}
|
}
|
else
|
{
|
DisplayGuide();
|
}
|
}
|
#endregion
|
|
|
private void DisplayFunctionUnLock(int _functionId)
|
{
|
|
|
|
m_NewFunction.SetActive(true);
|
m_NewBieGuide.SetActive(false);
|
|
var instance = UIUtility.CreateWidget("FunctionUnlockFlyObject", "FunctionUnlockFlyObject");
|
var flyObject = instance.GetComponent<FunctionUnlockFlyObject>();
|
|
flyObject.transform.SetParentEx(m_ContainerFlyObject.transform, Vector3.zero, Vector3.zero, Vector3.one);
|
flyObject.SetContent(FunctionUnlockType.Normal, _functionId);
|
|
var config = FuncOpenLVConfig.Get(_functionId);
|
m_FunctionName.text = config.Remark;
|
m_ContainerFunctionBg.SetActive(true);
|
|
StartCoroutine(Co_FunctionUnLockDelay(flyObject));
|
}
|
|
private void SkipNewBieGuide()
|
{
|
UnAttachTrigger();
|
m_ClickTarget = null;
|
m_Effect2.Stop();
|
NewBieCenter.Instance.FinishNewBieGuide(NewBieCenter.Instance.currentGuide);
|
}
|
|
private void DisplayGuide()
|
{
|
var config = GuideConfig.Get(NewBieCenter.Instance.currentGuide);
|
m_Skip.SetActive(config.CanSkip == 1);
|
m_Effect2.Stop();
|
StartCoroutine(Co_DisplayGuide());
|
}
|
|
private void ReportStepOver()
|
{
|
m_newBieGuideUsher.Stop();
|
NewBieCenter.Instance.ReportGuideStepComplete(NewBieCenter.Instance.guideStep);
|
|
UnAttachTrigger();
|
m_ClickTarget = null;
|
}
|
|
private void OnStepChange()
|
{
|
DisplayGuide();
|
}
|
|
private void OnFunctionalUnLockShowEnd()
|
{
|
var guideConfig = GuideConfig.Get(NewBieCenter.Instance.currentGuide);
|
if (guideConfig.Steps == null || guideConfig.Steps.Length == 0)
|
{
|
NewBieCenter.Instance.FinishNewBieGuide(NewBieCenter.Instance.currentGuide);
|
}
|
else
|
{
|
DisplayGuide();
|
}
|
}
|
|
IEnumerator Co_FunctionUnLockDelay(FunctionUnlockFlyObject _flyObject)
|
{
|
yield return WaitingForSecondConst.WaitMS2000;
|
|
m_ContainerFunctionBg.SetActive(false);
|
m_NewBieGuide.SetActive(false);
|
_flyObject.Begin(OnFunctionalUnLockShowEnd);
|
}
|
|
IEnumerator Co_DisplayGuide()
|
{
|
yield return new WaitForEndOfFrame();
|
|
m_NewFunction.SetActive(false);
|
m_NewBieGuide.SetActive(false);
|
|
while (WindowCenter.Instance.asyncLoad.busy)
|
{
|
yield return null;
|
}
|
|
var step = NewBieCenter.Instance.guideStep;
|
var stepConfig = ScriptableObjectLoader.LoadSoNewBieGuideStep(step);
|
|
var timer = 0f;
|
while (m_ClickTarget == null)
|
{
|
try
|
{
|
FindAndAttachTrigger(stepConfig);
|
}
|
catch (Exception ex)
|
{
|
DebugEx.Log(ex);
|
NewBieCenter.Instance.FinishNewBieGuide(NewBieCenter.Instance.currentGuide);
|
}
|
|
timer += Time.deltaTime;
|
if (timer > 1f)
|
{
|
DebugEx.LogErrorFormat("新手引导:{0} 无法找到引导点击目标(检查配置)或者 因为其他界面中断引导(程序检查是否合理打断)!", NewBieCenter.Instance.currentGuide);
|
NewBieCenter.Instance.FinishNewBieGuide(NewBieCenter.Instance.currentGuide);
|
yield break;
|
}
|
|
yield return null;
|
}
|
|
WindowCenter.Instance.Close<ChatWin>();
|
m_RaycasterMask.SetActive(false);
|
m_NewBieGuide.SetActive(true);
|
|
m_NewBieMask.Display(step);
|
m_Dialogue.text = stepConfig.GetTipContent(GuideType.NewBie);
|
m_ContainerDialogue.transform.localPosition = stepConfig.tipPosition;
|
|
m_ClickHintRoot.localPosition = stepConfig.clickPosition;
|
m_ClickHintRoot.sizeDelta = stepConfig.clickSize;
|
|
if (stepConfig.selectBox != selectBoxPatternBuf || selectBox == null)
|
{
|
var selectBosAssetName = string.Empty;
|
switch (stepConfig.selectBox)
|
{
|
case NewBieGuideScriptableObject.SelectBoxPattern.Pattern1:
|
selectBosAssetName = "SelectBox1";
|
break;
|
case NewBieGuideScriptableObject.SelectBoxPattern.Pattern2:
|
selectBosAssetName = "SelectBox2";
|
break;
|
}
|
|
if (selectBox != null)
|
{
|
Destroy(selectBox.gameObject);
|
}
|
|
selectBox = UIUtility.CreateWidget(selectBosAssetName, selectBosAssetName).transform as RectTransform;
|
selectBox.MatchWhith(m_ClickHint);
|
selectBoxPatternBuf = stepConfig.selectBox;
|
}
|
|
m_ContainerArrow.SetActive(stepConfig.arrowPosition != NewBieGuideScriptableObject.ArrowPosition.None);
|
if (stepConfig.arrowPosition != NewBieGuideScriptableObject.ArrowPosition.None)
|
{
|
switch (stepConfig.arrowPosition)
|
{
|
case NewBieGuideScriptableObject.ArrowPosition.Left:
|
m_ContainerArrow.localPosition = new Vector2(-stepConfig.clickSize.x * 0.5f - m_ContainerArrow.rect.width * 0.5f, 0f);
|
m_Arrow.transform.localEulerAngles = new Vector3(0, 0, 90);
|
m_ArrowTween.from = new Vector3(8, 0, 0);
|
m_ArrowTween.to = new Vector3(-8, 0, 0);
|
break;
|
case NewBieGuideScriptableObject.ArrowPosition.Right:
|
m_ContainerArrow.localPosition = new Vector2(stepConfig.clickSize.x * 0.5f + m_ContainerArrow.rect.width * 0.5f, 0f);
|
m_Arrow.transform.localEulerAngles = new Vector3(0, 0, 270);
|
m_ArrowTween.from = new Vector3(8, 0, 0);
|
m_ArrowTween.to = new Vector3(-8, 0, 0);
|
break;
|
case NewBieGuideScriptableObject.ArrowPosition.Top:
|
m_ContainerArrow.localPosition = new Vector2(0f, stepConfig.clickSize.y * 0.5f + m_ContainerArrow.rect.height * 0.5f);
|
m_Arrow.transform.localEulerAngles = new Vector3(0, 0, 0);
|
m_ArrowTween.from = new Vector3(0, 8, 0);
|
m_ArrowTween.to = new Vector3(0, -8, 0);
|
break;
|
case NewBieGuideScriptableObject.ArrowPosition.Bottom:
|
m_ContainerArrow.localPosition = new Vector2(0f, -stepConfig.clickSize.y * 0.5f - m_ContainerArrow.rect.height * 0.5f);
|
m_Arrow.transform.localEulerAngles = new Vector3(0, 0, 180);
|
m_ArrowTween.from = new Vector3(0, 8, 0);
|
m_ArrowTween.to = new Vector3(0, -8, 0);
|
break;
|
}
|
}
|
|
m_newBieGuideUsher.rectTransform.localPosition = stepConfig.usherPosition;
|
m_newBieGuideUsher.rectTransform.localEulerAngles = new Vector3(0, stepConfig.usherOrientation == NewBieGuideScriptableObject.UsherOrientation.Normal ? 0 : 180, 0);
|
|
StartCoroutine(Co_DelayAmendBubbleArrow());
|
|
m_newBieGuideUsher.Stop();
|
if (stepConfig.usherAction != 0)
|
{
|
m_newBieGuideUsher.Play(stepConfig.usherAction);
|
}
|
|
if (stepConfig.voice != 0)
|
{
|
SoundPlayer.Instance.PlayNewBieAudio(stepConfig.voice);
|
}
|
|
if (stepConfig.effect2 != 0)
|
{
|
m_Effect2.effect = stepConfig.effect2;
|
m_Effect2.Play();
|
}
|
|
}
|
|
protected override void LateUpdate()
|
{
|
base.LateUpdate();
|
|
if (m_ClickTarget != null && m_ClickTarget.position != m_ClickHintRoot.position)
|
{
|
m_NewBieMask.mask.center = m_NewBieMask.mask.transform.InverseTransformPoint(m_ClickTarget.position);
|
m_ClickHintRoot.position = m_ClickTarget.position;
|
}
|
}
|
|
private void FindAndAttachTrigger(NewBieGuideScriptableObject _stepConfig)
|
{
|
m_ClickTarget = WindowCenter.Instance.uiRoot.transform.Find(_stepConfig.UIElementPath);
|
|
m_ClickEmptyComplete.RemoveAllListeners();
|
if (_stepConfig.clickAnyWhereComplete)
|
{
|
m_ClickEmptyComplete.SetActive(true);
|
m_ClickEmptyComplete.AddListener(ReportStepOver);
|
}
|
else
|
{
|
m_ClickEmptyComplete.SetActive(false);
|
|
if (m_ClickTarget != null)
|
{
|
var trigger = _stepConfig.pointerDownComplete ?
|
NewBieEventTrigger.SetPointDown(m_ClickTarget.gameObject)
|
: (NewBieEventTrigger)NewBieEventTrigger.SetPointClick(m_ClickTarget.gameObject);
|
|
if (trigger != null)
|
{
|
trigger.onClick.RemoveAllListeners();
|
trigger.onClick.AddListener(ReportStepOver);
|
}
|
}
|
}
|
|
}
|
|
private void UnAttachTrigger()
|
{
|
if (m_ClickTarget != null)
|
{
|
NewBieEventTrigger.Release(m_ClickTarget.gameObject);
|
}
|
}
|
|
IEnumerator Co_DelayAmendBubbleArrow()
|
{
|
yield return null;
|
m_BubbleArrow.position = m_BubbleArrow.position.SetX(m_newBieGuideUsher.transform.position.x);
|
var bubbleArrowParent = m_BubbleArrow.parent as RectTransform;
|
var xOffset = bubbleArrowParent.rect.width * 0.5f - m_BubbleArrow.rect.width * 0.5f;
|
m_BubbleArrow.anchoredPosition = m_BubbleArrow.anchoredPosition.SetX(Mathf.Clamp(m_BubbleArrow.anchoredPosition.x, -xOffset, xOffset));
|
}
|
|
}
|
|
}
|
|
|
|
|