//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Wednesday, November 22, 2017 //-------------------------------------------------------- using UnityEngine; using System.Collections; using UnityEngine.UI; using TableConfig; using System; namespace Snxxz.UI { public class FunctionalGuideBehaviour : MonoBehaviour { [SerializeField] RectTransform m_Pivot; [SerializeField] RectTransform m_ClickHintRoot; [SerializeField] RectTransform m_ClickHint; public RectTransform clickHintRoot { get { return m_ClickHintRoot; } } [SerializeField] RectTransform m_ContainerLeft; [SerializeField] RectTransform m_ContainerRight; [SerializeField] Text m_DialogueLeft; [SerializeField] Text m_DialogueRight; [SerializeField] RectTransform m_ContainerArrow; [SerializeField] Image m_Arrow; [SerializeField] PositionTween m_ArrowTween; RectTransform selectBox; int selectBoxPatternBuf = -1; int m_Guide; public int guide { get { return m_Guide; } private set { m_Guide = value; } } float protectTimer = 0f; Transform m_ClickTarget; RectTransform rectTransform { get { return this.transform as RectTransform; } } public void BeginGuide(int _guide) { guide = _guide; var guideConfig = Config.Instance.Get(guide); var stepConfig = ScriptableObjectLoader.LoadSoFunctionalGuideStep(guideConfig.Steps[0]); if (string.IsNullOrEmpty(stepConfig.tipContent)) { m_ContainerLeft.gameObject.SetActive(false); m_ContainerRight.gameObject.SetActive(false); } else { if (stepConfig.clickPosition.x > 0) { m_ContainerLeft.gameObject.SetActive(true); m_ContainerRight.gameObject.SetActive(false); m_DialogueLeft.text = stepConfig.tipContent; } else { m_ContainerLeft.gameObject.SetActive(false); m_ContainerRight.gameObject.SetActive(true); m_DialogueRight.text = stepConfig.tipContent; } } m_ContainerArrow.gameObject.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_ClickHintRoot.localPosition = stepConfig.clickPosition; m_ClickHintRoot.sizeDelta = stepConfig.clickSize; if ((int)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; case NewBieGuideScriptableObject.SelectBoxPattern.None: selectBosAssetName = ""; break; } if (selectBox != null) { Destroy(selectBox.gameObject); selectBox = null; } if (!string.IsNullOrEmpty(selectBosAssetName)) { selectBox = UIUtility.CreateWidget(selectBosAssetName, selectBosAssetName).transform as RectTransform; selectBox.MatchWhith(m_ClickHint); } selectBoxPatternBuf = (int)stepConfig.selectBox; } m_ClickTarget = null; m_ClickHintRoot.gameObject.SetActive(false); FindClickTarget(); protectTimer = 0f; } private void ReportGuideComplete() { UnAttachTrigger(); m_ClickTarget = null; FunctionalGuideCenter.Instance.FinishGuide(guide); FunctionalGuideBehaviourPool.Recycle(this.gameObject); } private void ClickToCompleteGuide() { UnAttachTrigger(); m_ClickTarget = null; var config = Config.Instance.Get(guide); if (config != null) { if (config.CannotCompleteByClick != 1) { FunctionalGuideCenter.Instance.FinishGuide(guide); } } FunctionalGuideBehaviourPool.Recycle(this.gameObject); } private void LateUpdate() { FindClickTarget(); } private void FindClickTarget() { if (m_ClickTarget == null) { try { protectTimer += Time.deltaTime; var guideConfig = Config.Instance.Get(guide); var stepConfig = ScriptableObjectLoader.LoadSoFunctionalGuideStep(guideConfig.Steps[0]); FindAndAttachTrigger(stepConfig.UIElementPath); } catch (Exception ex) { DebugEx.Log(ex); ReportGuideComplete(); } if (protectTimer > 3f) { Debug.LogFormat("新手引导:{0}因为点击对象获取超时异常结束,张维杰,请检查配置!", guide); ReportGuideComplete(); protectTimer = 0f; } } if (m_ClickTarget != null) { if (m_ClickTarget.gameObject.activeInHierarchy) { if (m_ClickTarget != null && m_ClickTarget.position != m_ClickHintRoot.position) { var screenPoint = CameraManager.uiCamera.WorldToViewportPoint(m_ClickTarget.position).SetZ(0); if (screenPoint.x < 1f && screenPoint.x > 0f && screenPoint.y < 1f && screenPoint.y > 0f) { m_ClickHintRoot.gameObject.SetActive(true); m_ClickHintRoot.position = m_ClickTarget.position; } else { m_ClickHintRoot.gameObject.SetActive(false); } } } else { m_ClickHintRoot.gameObject.SetActive(false); } } } private void FindAndAttachTrigger(string _path) { m_ClickTarget = WindowCenter.Instance.uiRoot.transform.Find(_path); if (m_ClickTarget != null) { var trigger = NewBieEventTrigger.SetPointClick(m_ClickTarget.gameObject); if (trigger != null) { trigger.onClick.RemoveAllListeners(); trigger.onClick.AddListener(ClickToCompleteGuide); } var mask = m_ClickTarget.GetComponentInParent(); if (mask != null) { this.rectTransform.sizeDelta = mask.rectTransform.sizeDelta; this.rectTransform.anchorMax = mask.rectTransform.anchorMax; this.rectTransform.anchorMin = mask.rectTransform.anchorMin; this.rectTransform.pivot = mask.rectTransform.pivot; this.rectTransform.position = mask.rectTransform.position; this.m_Pivot.MatchWhith(this.rectTransform); this.m_Pivot.pivot = new Vector2(0.5f, 0.5f); this.m_Pivot.sizeDelta = this.m_Pivot.sizeDelta + new Vector2(0, 20); this.m_Pivot.AddMissingComponent(); } else { var rectMask2D = this.rectTransform.GetComponent(); if (rectMask2D != null) { Destroy(rectMask2D); } } } } private void UnAttachTrigger() { if (m_ClickTarget != null) { NewBiePointerClickTrigger.Release(m_ClickTarget.gameObject); } } } public class FunctionalGuideBehaviourPool { static GameObjectPoolManager.GameObjectPool pool = null; public static FunctionalGuideBehaviour Require() { if (pool == null) { var prefab = UILoader.LoadPrefab("FunctionalGuideBehaviour"); if (prefab != null) { pool = GameObjectPoolManager.Instance.RequestPool(prefab); } } if (pool != null) { var instance = pool.Request(); return instance.GetComponent(); } else { return null; } } public static void Recycle(GameObject _gameObject) { if (pool != null) { pool.Release(_gameObject); _gameObject.transform.SetParent(null); _gameObject.SetActive(false); } } public static void Clear() { if (pool != null) { pool.Clear(); pool = null; } } } }