//-------------------------------------------------------- // [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(); 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(); 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)); } } }