unity 新手引導
阿新 • • 發佈:2019-02-20
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