Unity开发 MMORPG类游戏引导系统
下面展示一些 MMORPG类游戏引导系统逻辑代码
。
using LitJson;using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;
class GuideController : MonoBehaviour { public static GuideController instance; public List<GameObject> tapTipList; public List<GameObject> Guides;//引导窗口 public List<GameObject> tapTips;//点击提示窗口 public List<GameObject> playSkillTips;//技巧提示 [HideInInspector] public GameObject swapTip; //判断Unity端引导过程是否结束 [HideInInspector] public bool inGuide; [HideInInspector] public int nextStep; /// <summary> /// 玩家当前引导步数 /// </summary> [HideInInspector] public int StepSign = 0; [HideInInspector] //引导是否没有 public bool fromBegin; [HideInInspector] /// <summary> /// 用于判断是否第一次触发了吃饼干,只用一次 /// </summary> public bool afterFood; [HideInInspector] /// <summary> /// 用于判断是否第一次触发了zombi死亡,只用一次 /// </summary> public bool zombi; [HideInInspector] /// <summary> /// 用于判断是否第一次触发了mummy死亡 /// </summary> public bool mummy; MainView mainView; [HideInInspector] /// <summary> /// 用于存储引导键值对 /// </summary> public Dictionary<string, string> guideDic = new Dictionary<string, string>(); public IEnumerator stopGuide2; void Awake() { instance = this; mainView = MainView.instance; stopGuide2 = null; foreach (GameObject temp in Guides) { temp.SetActive(false); } } //temp Before blackDragon enter. public void ShowBlackDragonGuide() { KnapsackView kView = KnapsackView.instance; MainView mView = MainView.instance; //先让蒙版遮住所有,获取物品的面板消失 kView.settleMentPop.SetActive(false); mView.guideMask.SetActive(true); mView.guideMask.transform.SetAsLastSibling(); mView.blackDragonTip.transform.SetAsLastSibling(); kView.closeButton.interactable = false; if (kView.inventoryPopup.closeButton) kView.inventoryPopup.closeButton.interactable = false; foreach (GameObject item in tapTipList) { item.SetActive(false); } mView.blackDragonTip.SetActive(true); //游戏暂停 //Time.timeScale = 0; } public IEnumerator ShowRedDragonGuide() { KnapsackView kView = KnapsackView.instance; MainView mView = MainView.instance; yield return new WaitForSeconds(2); //先让蒙版遮住所有,获取物品的面板消失 kView.settleMentPop.SetActive(false); mView.guideMask.SetActive(true); mView.guideMask.transform.SetAsLastSibling(); mView.redDragonTip.transform.SetAsLastSibling(); kView.closeButton.interactable = false; if (kView.inventoryPopup.closeButton) kView.inventoryPopup.closeButton.interactable = false; foreach (GameObject item in tapTipList) { item.SetActive(false); } mView.redDragonTip.SetActive(true); //游戏暂停 //Time.timeScale = 0; } /// <summary> /// 常规引导流程,常规引导操作 /// </summary> void GuidePrepare() { KnapsackView kView = KnapsackView.instance; MainView mView = MainView.instance; //先让蒙版遮住所有,获取物品的面板消失 kView.settleMentPop.SetActive(false); mView.guideMask.SetActive(true); mView.guideMask.transform.SetAsLastSibling(); kView.closeButton.interactable = false; if (kView.inventoryPopup.closeButton) kView.inventoryPopup.closeButton.interactable = false; foreach (GameObject item in tapTipList) { item.SetActive(false); } //tapTipList[nextStep - 1].SetActive(true); //Operations.GuideStepUpdate(PlayerController.instance.PlayerMe.UserId, nextStep 1); //游戏暂停 //Time.timeScale = 0; } //public void UpdateStepRequest() //{ // Operations.GuideStepUpdate(PlayerController.instance.PlayerMe.UserId, nextStep 1); //} //喂食引导,挂在按钮上调用 public void ObjectGuideOn() { MainView mView = MainView.instance; //KnapsackView kView = KnapsackView.instance; mView.objectPanel.SetActive(true); //激活华夫饼跳动 //kView.objectItUI.GetComponentInChildren<ObjectButton>().objectImgAnim.enabled = true; GuidePrepare(); mView.objectPanel.transform.SetParent(mView.knapsackCanvas.transform); mView.objectPanel.transform.SetAsLastSibling(); //出小手 ShowGuideSolo(6); } public void ObjectGuideOff() { MainView mainView = MainView.instance; mainView.objectPanel.transform.SetParent(mainView.bottomButtonGroup.transform); mainView.objectPanel.transform.SetSiblingIndex(1); AfterGuide(); } public void DelayPet1GuideOn(float time, int step) { //if (delayPet1Guide_cor == null) //{ delayPet1Guide_cor = DelayPet1GuideOnCor(time, step); //} StartCoroutine(delayPet1Guide_cor); } public void DelayPet1GuideOff() { if (delayPet1Guide_cor != null) StopCoroutine(delayPet1Guide_cor); } IEnumerator delayPet1Guide_cor; //等两秒,跳过物品展示框后,出现召唤怪物引导 IEnumerator DelayPet1GuideOnCor(float time, int step) { yield return new WaitForSeconds(time); KnapsackView kView = KnapsackView.instance; //如果按钮上有东西或者是需要切换宠物,才能触发引导 if (kView.pet1ItUI.inventoryItem != null || step == 8) { //Debug.LogError(222); Pet1GuideOn(step); } } public void Pet1GuideOn(int step) { MainView mView = MainView.instance; GuidePrepare(); mView.pet1Panel.transform.SetParent(mView.knapsackCanvas.transform); mView.pet1Panel.transform.SetAsLastSibling(); //出小手 ShowGuideSolo(step); } public void Pet1GuideOff() { MainView mainView = MainView.instance; mainView.pet1Panel.transform.SetParent(mainView.bottomButtonGroup.transform); mainView.pet1Panel.transform.SetSiblingIndex(1); AfterGuide(); } public void SkillGuideOn() { MainView mView = MainView.instance; mView.clickSkillPanel.SetActive(true); //GuidePrepare(); //mView.clickSkillPanel.transform.SetParent(mView.mainCanvas.transform); //mView.clickSkillPanel.transform.SetAsLastSibling(); //引导中才可以跳动 //if (inGuide) //{ // mView.clickSkillPanel.GetComponentInChildren<SkillButton>().skillImageAnim.enabled = true; //} } public void SkillGuideOff() { //MainView mainView = MainView.instance; //mainView.clickSkillPanel.transform.SetParent(mainView.bottomButtonGroup.transform); //mainView.clickSkillPanel.transform.SetSiblingIndex(1); //AfterGuide(); } /// <summary> /// 辅助的单独的引导,往往是再次提醒和引导,只需出现三次,不会暂停游戏 /// </summary> void ShowGuideSolo(int step) { //Debug.LogError(111); tapTipList[step - 1].SetActive(true); } public void ShowGuide(int step) { tapTipList[step - 1].SetActive(true); } /// <summary> /// 引导步骤大于7的话,就结束Unity端的引导喽 /// </summary> /// <param name="newStep"></param> /// <param name="onGet"> 是get到的step还是更新的step</param> public void GuideStepChange(int newStep, bool onGet) { nextStep = newStep; Debug.LogError("nextStep: " nextStep); //3D端引导完,nextStep值为7 if (nextStep > 1) { inGuide = false; BattleController.instance.CountDown(); //不能在这里将InGuide设为0,因为这个时候不一定打完引导中的怪 } else { inGuide = true; } //if (onGet) //{ // //如果大招引导没执行,还是要先召唤宠物 // if (nextStep == 4) // { // DelayGuide4(); // } // //回退一步 // else if (nextStep == 5) // { // nextStep = 4; // DelayGuide4(); // } // return; //} 避免背包过早打开,误触发引导 //if (nextStep == 1) //{ // MainView.instance.backPack.SetActive(false); //} 提示选择宠物蛋 //else if (nextStep == 2) //{ // ShowGuide(2); //} //else if (nextStep == 3) //{ // ShowGuide(3); //} //else if (nextStep == 4) //{ // DisableGuide(); //} //else if (nextStep == 5) //{ // DisableGuide(); //} //else if (nextStep == 6) //{ // DisableGuide(); //} //else if (nextStep == 7) //{ // DisableGuide(); //} } public void AfterGuide() { MainView mView = MainView.instance; KnapsackView kView = KnapsackView.instance; Time.timeScale = 1; mView.guideMask.SetActive(false); kView.closeButton.interactable = true; if (kView.inventoryPopup.closeButton) kView.inventoryPopup.closeButton.interactable = true; foreach (GameObject item in tapTipList) item.SetActive(false); } /// <summary> /// 打开引导弹窗 /// </summary> /// <param name="step"> 步骤</param> public void StepControl(int step,float time) { PlayerController playerCon = PlayerController.instance; Debug.Log("StepSign:" StepSign " 参数step :" step); if (step > StepSign) { StepSign ; if (step >= 4) { StepSign = step; } foreach (GameObject temp in Guides) { if (temp != null) temp.SetActive(false); } step -= 1;//数组里是从0开始的 //if (StepSign == 3) //{ // mainView.Guides[2].SetActive(true); // stopGuide2 = StopGuide(5); // StartCoroutine(stopGuide2); //} if (StepSign != 6 && Guides[step] != null) { Guides[step].SetActive(true); } // StepSign == 6 则引导结束 if (playerCon.PlayerMe != null) { string val = ""; if (guideDic.TryGetValue("BattleStep", out val)) { guideDic["BattleStep"] = StepSign.ToString(); } else { //不存在,则添加 guideDic.Add("BattleStep", StepSign.ToString()); } Operations.GuideStepUpdate(playerCon.PlayerMe.UserId, JsonMapper.ToJson(guideDic)); } if (time > 0) { StartCoroutine(StopGuide(time)); } } Debug.LogError("StepSign : " StepSign); } public void CloseGuide() { foreach (GameObject temp in Guides) { if (temp != null) temp.SetActive(false); } foreach (GameObject temp in tapTips) { if (temp != null) temp.SetActive(false); } } IEnumerator StopGuide(float time) { yield return new WaitForSeconds(time); foreach (GameObject temp in Guides) { if (temp != null) temp.SetActive(false); } foreach (GameObject temp in tapTips) { if (temp != null) temp.SetActive(false); } } public void OpenTipsPanel(int index, float time) { for(int i = 0;i< tapTips.Count;i ) { if (tapTips[i] != null) { if(i == index) tapTips[i].SetActive(true); else tapTips[i].SetActive(false); } } if (time > 0) { StartCoroutine(StopGuide(time)); } } public void OpenTipsPanel(int index, float time,string texts) { foreach (GameObject temp in tapTips) { if (temp != null) temp.SetActive(false); } if (tapTips[index] != null) { if (texts != null) { tapTips[index].transform.Find("Text").GetComponent<Text>().text = texts; } tapTips[index].SetActive(true); } if (time > 0) { StartCoroutine(StopGuide(time)); } } public void GetPlayerGuide() { UnityPhotonClient unityPhotonClient = UnityPhotonClient.Instance; //Debug.Log("player.UserId :" unityPhotonClient.player.UserId); //如果是注册,第一次登录 if (unityPhotonClient.player.Registered) { Debug.Log("第一次注册,发送引导请求"); //Operations.GuideStepUpdate(player.UserId, 1);//------------------------------cl Operations.GetGuideStep(unityPhotonClient.player.UserId);//------------------------------cl } //以后登录 else { //获取玩家引导步数,方便判断是否需要引导 Operations.GetGuideStep(unityPhotonClient.player.UserId);//------------------------------cl Debug.Log("战斗前先获取引导Guide :" StepSign); //if (guideCon.StepSign == 0) { //} } } }
效果如下图:
赞 (0)