1. 程式人生 > >unity 新手引導

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