unity 新手引导

            case (int)GSToGC.MsgID.eMsgToGCFromGS_GuideResp:
            print ("eMsgToGCFromGS_GuideResp");
                OnNetMsg_NotifyGuideResp(stream);
                break;

    Int32 OnNetMsg_NotifyGuideResp(Stream stream)
    {
        GSToGC.GuideCSStepInfo pMsg;
        if (!ProtoDes(out pMsg, stream))
        {
            return PROTO_DESERIALIZE_ERROR;
        }
        bool comp = pMsg.allcomp;  //是不是所有新手引导都已经完成  comp :complete 
        UIGuideModel.Instance.mIsGuideComp = comp;
        if (!comp)
        {
            UIGuideCtrl.Instance.GuideRespStep(pMsg); //处理新手引导的信息
        }

        return (Int32)EErrorCode.eNormal;
    }

UIGuideCtrl.cs

        public void GuideRespStep(GSToGC.GuideCSStepInfo pMsg)
        {
            UIGuideModel.Instance.GuideFinishModelList(pMsg.taskid);
        }

UIGuideModel.cs

   public void GuideFinishModelList(List<uint> pList)
        {
            mGuideFinishList = pList;
            mCurrentTaskModelId  = mGuideStepInfo.GuideStepNull;
            foreach (mGuideStepInfo step in Enum.GetValues(typeof(mGuideStepInfo)))
            {
                if (step == mGuideStepInfo.GuideStepNull)
                {
                    continue;
                }
                if (!mGuideFinishList.Contains((uint)step))
                {
                    mCurrentTaskModelId = step;
                    break;
                }
            }
            if (mCurrentTaskModelId != mGuideStepInfo.GuideStepNull)
            {
                GamePlayGuideCtrl.Instance.StartModelTask(mCurrentTaskModelId);
                UIGuideCtrl.Instance.Enter();
            }
        }

GamePlayGuideCtrl.cs

        /// <summary>
        /// 开始执行模块的引导
        /// </summary>
        /// <param name="modelId"></param>
        public void StartModelTask(mGuideStepInfo modelId)
        {
            GamePlayGuideModel.Instance.StartModelTask(modelId);
        }

UIGuideCtrl.cs

    public class UIGuideCtrl : Singleton<UIGuideCtrl>
    {
        public void Enter()
        {
            EventCenter.Broadcast(EGameEvent.eGameEvent_PlayGuideEnter);
        }

GamePlayGuideModel.cs

        /// <summary>
        /// 开始模块Id
        /// </summary>
        /// <param name="modelId"></param>
        public void StartModelTask(mGuideStepInfo modelId)
        {
            foreach (var item in ConfigReader.GuideTaskMgrInfoDict)
            {
                if ((mGuideStepInfo)item.Value.mTasktype == modelId)
                {
                    NowTaskId = item.Key;
                    return;
                }
            }
        }

ConfigReader.cs

 public static Dictionary<int, GuideMgrInfo> GuideTaskMgrInfoDict
    {
        get
        {
            if (guideTaskMgrInfoDict.Count == 0)
            {
                ReadGuideManagerTaskConfig rdTaskMgr = new ReadGuideManagerTaskConfig("Config/taskmanager");
            }
            return guideTaskMgrInfoDict;
        }
    }

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<taskmanager xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <info id="90001">
        <childtype>17</childtype>
        <childid>17000</childid>
        <endtype>2</endtype>
        <endid>17000</endid>
        <nexttaskid>90002</nexttaskid>
        <tasktype>1001</tasktype>
    </info>
    <info id="90002">
        <childtype>17</childtype>
        <childid>17001</childid>
        <endtype>2</endtype>
        <endid>17001</endid>
        <nexttaskid>90003</nexttaskid>
        <tasktype>1001</tasktype>
    </info>

上面xml文本解析:

            string typeName = (infoNodeList[i] as XmlElement).GetAttributeNode("id").InnerText;

            GuideMgrInfo mgrInfo = new GuideMgrInfo();
            mgrInfo.TaskId = Convert.ToInt32(typeName); //请看这里

                    case "childtype":
                        mgrInfo.ChildTaskType = GameMethod.ResolveToIntList(xEle.InnerText);
                        break;  
                    case "childid":
                        mgrInfo.ChildTaskId = GameMethod.ResolveToIntList(xEle.InnerText);
                        break;
                    case "endtype":
                        mgrInfo.TaskEndType = (TaskCheckType)Convert.ToInt32(xEle.InnerText);
                        break;
                    case "endid":
                        mgrInfo.EndTaskChildId = Convert.ToInt32(xEle.InnerText);
                        break;
                    case "nexttaskid":
                        mgrInfo.NextTaskId = Convert.ToInt32(xEle.InnerText);
                        break;
                    case "close":
                        mgrInfo.mToServerType = Convert.ToInt32(xEle.InnerText);
                        break;
                    case "tasktype":
                        mgrInfo.mTasktype = Convert.ToInt32(xEle.InnerText);
                        break;
                    case "moduleend":
                        mgrInfo.moduleend = Convert.ToInt32(xEle.InnerText) == 1 ? true : false;
                        break;
ConfigReader.guideTaskMgrInfoDict.Add(mgrInfo.TaskId, mgrInfo);


UIGuideCtrl.cs

    public class UIGuideCtrl : Singleton<UIGuideCtrl>
    {
        public void Enter()
        {
            EventCenter.Broadcast(EGameEvent.eGameEvent_PlayGuideEnter);
        }

GamePlayGuideWindow.cs

        public override void Init()
        {
            EventCenter.AddListener(EGameEvent.eGameEvent_PlayGuideEnter, Show);
            EventCenter.AddListener(EGameEvent.eGameEvent_PlayGuideExit, Hide);
            //EventCenter.AddListener<GameObject>(EGameEvent.eGameEvent_UIGuideEvent, OnUiGuideAddButtonEvent);
        }


show 方法中 执行 onenable
GamePlayGuideWindow.cs

   public override void OnEnable()
        {
            EventCenter.AddListener(EGameEvent.eGameEvent_PlayTaskModelFinish, ExecuteNextGuide);
            EventCenter.AddListener<GuideTaskType, int>(EGameEvent.eGameEvent_PlayChildTaskFinish, OnFinishChildTask);
            EventCenter.AddListener(EGameEvent.eGameEvent_SdkLogOff, SdkLogOff);
            if (GamePlayGuideModel.Instance.GuideTaskExecuteList.Count == 0)
            {
                ExecuteNextGuide();  //注意这里
            }
        }



GamePlayGuideWindow.cs

  /// <summary>
        /// 或许模块要执行的Id
        /// </summary>
        private void ExecuteNextGuide()
        {
            int taskId = GamePlayGuideModel.Instance.NowTaskId;
            if (!ConfigReader.GuideTaskMgrInfoDict.ContainsKey(taskId))
            {
                return;
            }
            List<int> idList = ConfigReader.GuideTaskMgrInfoDict[taskId].ChildTaskId;
            List<int> TypeList = ConfigReader.GuideTaskMgrInfoDict[taskId].ChildTaskType;
            for (int tp = 0; tp < TypeList.Count; tp++)
            {
                GuideTaskBase task = null;
                GuideTaskType type = (GuideTaskType)TypeList[tp];
                switch (type)
                {
                    case GuideTaskType.ClickButtonTask:
                        task = new GuideClickButtonTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.PathTask:
                        task = new GuidePathTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.TimeCtrlTask:
                        task = new GuideTimeCtrlTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.MoveCameraTask:
                        task = new GuideCameraTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.TipTask:
                        task = new GuideTipTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.PopTipTask:
                        task = new GuidePopTipTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.ObstructTask:
                        task = new GuideObstructTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.VoiceTask:
                        task = new GuideVoiceTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.ObjFlashTask:
                        task = new GuideFlashTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.ObjShowTask:
                        task = new GuideShowObjTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.AbsorbTask:
                        task = new GuideAbsorbTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.SenderSoldierTask:
                        task = new GuideSendNpcTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.SenderHeroTask:
                        task = new GuideSendHeroTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.KillTask:
                        task = new GuideKillTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.RewardTipTask:
                        task = new GuideRewardTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.ForceClickTask:
                        task = new GuideForceClick(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.ScreenClickTask:
                        task = new GuideScreenClickTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.KillHeroTask:
                        task = new GuideKillHeroTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.GetHeroTask:
                        task = new GuideGetHeroTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.GetGuideToAdGuide:
                        task = new GuideToAdGuideTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.LevelToBuyRunes:
                        task = new GuideLevelToBuyRuneTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.GetRuneTask:
                        task = new GuideGetRuneTask(idList[tp], type, mRoot.gameObject);
                        break;
                    case GuideTaskType.EquipRuneTask:
                        task = new GuideEquipRuneTask(idList[tp], type, mRoot.gameObject);
                        break;

                }
                task.EnterTask();
                GamePlayGuideModel.Instance.GuideTaskExecuteList.Add(task);
            }
        }

GamePlayGuideWindow.cs脚本

        //每帧更新
        public override void Update(float deltaTime)
        {
            base.Update(deltaTime);
            for (int i = GamePlayGuideModel.Instance.GuideTaskExecuteList.Count - 1; i >= 0; i--)
            {
                GamePlayGuideModel.Instance.GuideTaskExecuteList[i].ExcuseTask();
            }
        }


经过测试,首次会执行:

taskid :90001
type : ForceClickTask


case GuideTaskType.ForceClickTask:
    task = new GuideForceClick(idList[tp], type, mRoot.gameObject);
    break;


GuideForceClick.cs

 public override void EnterTask()
 {
      EventCenter.AddListener<GameObject>(EGameEvent.eGameEvent_UIGuideEvent, OnUiGuideAddButtonEvent);
            DeltTask();
 }
  public override void ExcuseTask()
  {
            Debug.Log ("GuideForceClick  :   ExcuseTask()"); 
  }




     /// <summary>
        /// 将要触发事件的新手引导的按钮放入列表
        /// </summary>
        /// <param name="gobj"></param>
        public void AddUiGuideEventBtn(GameObject gobj)
        {
            if (gobj == null || UIGuideModel.Instance.UiGuideButtonGameObjectList.Contains(gobj))
            {
                return;
            }
            Debug.Log ("UIGuideCtrl --- AddUiGuideEventBtn---gobj:  "+gobj.name);
            UIGuideModel.Instance.UiGuideButtonGameObjectList.Add(gobj);
            EventCenter.Broadcast(EGameEvent.eGameEvent_UIGuideEvent, gobj);//注意这一行
        }


这里写图片描述



FR:海涛高软(hunk Xu) QQ技术交流群:386476712

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值