using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using GCGame.Table; using Module.Log; // 原为超值首冲活动提示 // 现为一种活动的mini提示工具,需要活动提示的信息会成为队列信息,依次显示。 // 直到所有信息显示完毕,界面关闭;新的活动类型信息传入时,重新显示 // 一旦一个活动的信息显示过,后续不再显示该类型。 // 若存在多个信息存于队列中,点击关闭按钮会显示后一个,而不是全部关闭。 public class SuperBenefitFirstRechargeTip : MonoBehaviour { public Button closeBtn; // 关闭按钮 public Button rechargeBtn; // 充值按钮,点击跳转充值界面 public Button bgBtn; // 背景作为按钮,点击跳转到超值首冲活动界面 public UICameraTexture model; // 模型 // 在该活动中,resImg和协议的iconPath的安排如下 // 0:背景 // 1:标题 // 2:关闭按钮 // 3:描述 // 4:充值/跳转到活动描述 public Image[] resImg = new Image[5]; // 资源素材 private Queue tipQueues; // 消息队列 private int curActId; // 当前活动id private int curEntranceId; // 活动入口ID private static List actList = new List(); public static bool IsActTipsExist(int actID) { if(actList.Contains(actID)) { return true; } else { actList.Add(actID); return false; } } public RectTransform animStartAnchor; // 该组件是动画的上一层节点,用于控制动画的初始位置 private Vector3 oriPos; // 记录原始位置,如果找不到目标位置,则使用这个。 private enum Side { left, right } private Side leftOrRightAnim = Side.right; // 使用左侧还是右侧动画,-1 左侧,1 右侧 ///// ///// 判断该活动的提示信息是否能被显示 ///// ///// 活动入口ID ///// //public static bool IsTipCanShow(int actID) //{ // // 不合法活动ID 或 已显示过的不再显示 // if(actID < 0 || finishTips.Contains(actID)) // { // return false; // } // return true; //} private static SuperBenefitFirstRechargeTip instance; public static SuperBenefitFirstRechargeTip Instance { get { return instance; } } public void Awake() { if(instance == null) { instance = this; oriPos = animStartAnchor.position; rechargeBtn.onClick.AddListener(OnRechargeBtnClick); closeBtn.onClick.AddListener(Close); bgBtn.onClick.AddListener(OnBgBtnClick); tipQueues = new Queue(); curActId = -1; curEntranceId = -100; } } private void OnDestroy() { instance = null; } private void Close() { FinishOne(); } private void OnEnable() { } #region 消息发送与接收 public void ShowInfo(object packet) { MarketingNewPayTip data = packet as MarketingNewPayTip; if(data != null) { if (tipQueues.Count <= 0) { tipQueues.Enqueue(data); StartCoroutine("ShowHeadTips"); } else { tipQueues.Enqueue(data); } } } private void FinishOne() { if (curActId != -1) { //if (!finishTips.Contains(curActId)) //{ // finishTips.Add(curActId); //} tipQueues.Dequeue(); actList.Remove(curActId); curActId = -1; } // 动画内已由CanvasGroup控制整体Tip的交互功能,所以可以取消SetActive(false) PlayHideTipsAnim(); StartCoroutine("ShowHeadTips"); } private IEnumerator ShowHeadTips() { // 2.0 秒时间内判断,当前是否已经播放完动画。 for(int i = 0; i < 4; ++i) { AnimatorStateInfo animatorInfo = _ShowTipAnim.GetCurrentAnimatorStateInfo(0); if(animatorInfo.IsName("None")) { if (tipQueues.Count > 0) { ShowTip(); } else { model.gameObject.SetActive(false); } yield break; } else if((animatorInfo.IsName("RightHide") || animatorInfo.IsName("LeftHide")) && animatorInfo.normalizedTime >= 0.99f) { if (tipQueues.Count > 0) { ShowTip(); } else { model.gameObject.SetActive(false); } yield break; } yield return new WaitForSeconds(0.5f); } LogModule.ErrorLog("Can't show tip."); } private void ShowTip() { MarketingNewPayTip curData = tipQueues.Peek(); curActId = curData.actID; curEntranceId = curData.entrance; if (curData.iconPath.Count != resImg.Length) { Close(); LogModule.ErrorLog("SuperBenefitFirstRechargeTip: iconPath.count is wrong !"); return; } InitPos(curEntranceId, curActId); PlayShowTipsAnim(); // 将iconPath和Image一一对应 for (int i = 0; i < resImg.Length; ++i) { if (!string.IsNullOrEmpty(curData.iconPath[i])) { resImg[i].gameObject.SetActive(true); LoadAssetBundle.Instance.SetImageSprite(resImg[i], curData.iconPath[i], (bool isSucess, GameObject obj)=> { if(isSucess) { for(int j = 0; j < resImg.Length; ++j) { resImg[j].SetNativeSize(); } } }); } else { resImg[i].gameObject.SetActive(false); } } // 显示模型 Tab_CharModel tab_W = TableManager.GetCharModelByID(curData.ModelId, 0); if (tab_W != null) { model.gameObject.SetActive(true); model.InitModelPath(tab_W.ResPath, tab_W); } else { model.gameObject.SetActive(false); } } #endregion private void OnRechargeBtnClick() { if (curEntranceId < -1) { Close(); return; } switch (curEntranceId) { // vip跳转 case -1: YuanBaoShopLogic.OpenVipPage(); break; // 充值商店 case 0: YuanBaoShopLogic.OpenChargePage(); break; default: if (MarketingActsRoot.Instance() != null) { if (isJustEntranceId(curEntranceId, curActId) == true) { MarketingActsRoot.Instance().ShowActById(curEntranceId); } else { // Todo } } break; } FinishOne(); } // 背景按钮点击,跳转活动界面 private void OnBgBtnClick() { if (curActId == -1) { Close(); return; } ItemGetPathPopRoot.GotoOperationalAct(curEntranceId, curActId); //switch(curEntranceId) //{ // // vip跳转 // case -1: // YuanBaoShopLogic.OpenVipPage(); // break; // // 福利大厅 // case 0: // UIManager.ShowUI(UIInfo.WelfareRoot, // (bool bSuccess, object param) => // { // if (bSuccess) // { // WelfareRootCtr.Instance.OpenWith((int)param); // } // }, curActId); // break; // default: // if (MarketingActsRoot.Instance() != null) // { // if(isJustEntranceId(curEntranceId, curActId) == true) // { // MarketingActsRoot.Instance().ShowActById(curEntranceId); // } // else // { // // Todo // } // } // break; //} FinishOne(); } /// /// 判断入口ID和活动ID是否用同一个预制体,是的话,不用二级打开 /// /// 入口 ID /// 活动 ID /// private bool isJustEntranceId(int enhanceID, int actID) { Tab_ActInfoClient tab_En = TableManager.GetActInfoClientByID(enhanceID, 0); Tab_ActInfoClient tab_Act = TableManager.GetActInfoClientByID(actID, 0); if (tab_En != null && tab_Act != null) { if (tab_En.UIPath == tab_Act.UIPath) { return true; } } return false; } #region 动画控制 // 跟随左侧所有按钮的位移动画 // FunctionBaseShowPanel public Animator _ShowAnim; public void ShowBtns() { _ShowAnim.Play("Show", 0, 0); } public void HideBtns() { _ShowAnim.Play("Hide", 0, 0); } // 单纯该提示的动画 public Animator _ShowTipAnim; public void PlayShowTipsAnim() { if (leftOrRightAnim == Side.left) { _ShowTipAnim.Play("LeftShow"); } else { _ShowTipAnim.Play("RightShow"); } } public void PlayHideTipsAnim() { if (leftOrRightAnim == Side.left) { _ShowTipAnim.Play("LeftHide"); } else { _ShowTipAnim.Play("RightHide"); } } // 初始化显示位置 public void InitPos(int enhanceID, int actID) { Vector3 targetPos = oriPos; switch (enhanceID) { // vip 需要左上角人物框下的Vip位置 // ButtonMarket case -1: if(PlayerFrameLogic.Instance() != null && PlayerFrameLogic.Instance().gameObject.activeInHierarchy == true) { Transform target = PlayerFrameLogic.Instance().m_VipLevel.transform; if(target != null) { targetPos = target.position; } } leftOrRightAnim = Side.left ; break; // 福利大厅 case 0: if (FunctionButtonLogic.Instance() != null && FunctionButtonLogic.Instance().gameObject.activeInHierarchy == true) { LogModule.DebugLog(FunctionButtonLogic.Instance().gameObject.name); Transform target = FunctionButtonLogic.Instance().gameObject.transform.Find("Anchor-RightTop/FunctionWindow/FunctionButtonOffset/TopBtns/TopBtns/ButtonLingJiang"); if (target != null) { targetPos = target.position; } } leftOrRightAnim = Side.right; break; // 其他运营活动 default: leftOrRightAnim = Side.right; // 找到活动入口的位置 if (MarketingActsRoot.Instance() != null && MarketingActsRoot.Instance().gameObject.activeInHierarchy) { MarketingMainMenu actIconCS = null; actIconCS = MarketingActsRoot.Instance().GetContainItem(enhanceID); if (actIconCS != null) { targetPos = actIconCS.transform.position; // 运营活动中 左是0,右是1 if(actIconCS.MyActState.leftOrRight == 0) { leftOrRightAnim = Side.left; } } } break; } // 如果没找到初始位置,使用默认位置,也用左边的动画 animStartAnchor.localPosition = animStartAnchor.parent.InverseTransformVector(targetPos); } #endregion }