笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144、

上篇博客实现了LoginState的封装,其实作为UI的各个窗口,每个窗口都对应着自己的State也就是状态类。这么多状态类,不能鼓孤立的存在着,它也需要我们封装一个状态管理类去处理所有的状态,它的主要功能是注册状态, 状态之间的切换等操作,该函数继承于单例模式,代码如下所示:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;namespace Game.GameState
{public enum GameStateType{GS_Continue,GS_Login,GS_User,GS_Lobby,GS_Room,GS_Hero,GS_Loading,GS_Play,GS_Over,}public class GameStateManager : Singleton<GameStateManager>{Dictionary<GameStateType, IGameState> gameStates;IGameState currentState;public GameStateManager(){gameStates = new Dictionary<GameStateType, IGameState>();IGameState gameState;gameState = new LoginState();gameStates.Add(gameState.GetStateType(), gameState);gameState = new UserState();gameStates.Add(gameState.GetStateType(), gameState);gameState = new LobbyState();gameStates.Add(gameState.GetStateType(), gameState);gameState = new RoomState();gameStates.Add(gameState.GetStateType(), gameState);gameState = new HeroState();gameStates.Add(gameState.GetStateType(), gameState);gameState = new LoadingState();gameStates.Add(gameState.GetStateType(), gameState);gameState = new PlayState();gameStates.Add(gameState.GetStateType(), gameState);gameState = new OverState();gameStates.Add(gameState.GetStateType(), gameState);}public IGameState GetCurState(){return currentState;}public void ChangeGameStateTo(GameStateType stateType){if (currentState != null && currentState.GetStateType() != GameStateType.GS_Loading && currentState.GetStateType() == stateType)return;if (gameStates.ContainsKey(stateType)){if (currentState != null){currentState.Exit();}currentState = gameStates[stateType];currentState.Enter();}}public void EnterDefaultState(){ChangeGameStateTo(GameStateType.GS_Login);}public void FixedUpdate(float fixedDeltaTime){if (currentState != null){currentState.FixedUpdate(fixedDeltaTime);}}public void Update(float fDeltaTime){GameStateType nextStateType = GameStateType.GS_Continue;if (currentState != null){nextStateType = currentState.Update(fDeltaTime);}if (nextStateType > GameStateType.GS_Continue){ChangeGameStateTo(nextStateType);}}public IGameState getState(GameStateType type){if (!gameStates.ContainsKey(type)){return null;}return gameStates[type];}}
}

该类首先定一个枚举用于表示各个状态,然后实现了状态之间的切换功能。接下来我们开始使用我们编写的脚步,实现起来比较简单,新建一个i额场景用于逻辑的编写,定义一个类比如GameLogic,在它的Awake函数和Start函数中分别调用接口如下:

void Awake(){WindowManager.Instance.ChangeScenseToLogin(EScenesType.EST_None);}// Use this for initializationvoid Start () {GameStateManager.Instance.EnterDefaultState();}

另外在它的Update函数中要进行状态的更新,函数代码如下所示:

       //更新游戏状态机GameStateManager.Instance.Update(Time.deltaTime);//UI更新WindowManager.Instance.Update(Time.deltaTime);

这样就可以实现MVC模式,并将其应用到项目开发中去,各个模块之间使用的是封装的消息传递,降低了模块之间的耦合性。我们使用该模式实现了多款游戏,总体上感觉还是不错的。

Unity3D优化技巧系列七相关推荐

  1. Unity3D优化技巧系列一

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  2. Unity3D优化技巧系列三

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  3. Unity3D优化技巧系列二

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  4. Unity3D优化技巧系列八

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  5. 系列笔记 | 深度学习连载(5):优化技巧(下)

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 深度学习中我们总结出 5 大技巧: 本节继续从第三个开始讲起. 3. Early stoppi ...

  6. Unity3D脚本中文系列教程(七)

    http://dong2008hong.blog.163.com/blog/static/4696882720140311445677/?suggestedreading&wumii Unit ...

  7. Android Studio使用技巧系列教程(七)

    尊重劳动成果,转载请注明出处:http://blog.csdn.net/growth58/article/details/47134819 关注新浪微博:@于卫国 邮箱:yuweiguocn@gmai ...

  8. 介绍Brook+的kernel到IL的转化方法和优化技巧

    引言      进行GPGPU编程,很多人(包括我在内)会选择从Brook+入手.Brook+的kernel编写是基于C语言的,易于编写和理解,而且Brook+的运行时处理了很多繁琐的细节,使到GPG ...

  9. php 随机在文章中添加锚文本_seo网站优化技巧之:8种优质锚文本的做法

    众所周知,质量最高的外链就是锚文本形式的外链,这种外链又称为锚链,当锚文本中嵌入了我们的目标关键词之后,这种锚链的权重传递效率最高.锚文本链接的质量高低,对关键词排名及网站权重的影响非常大. seo网 ...

最新文章

  1. 比目前世界上最快的超级计算机快 4 倍,英伟达这波玩大了!
  2. 另一个git进程似乎在这个存储库中运行
  3. (JAVA)Object类之Scanner
  4. 【设计模式 03】装饰模式——俄罗斯套娃?
  5. php头像上传思路,PHP头像上传,php头像上传_PHP教程
  6. linux下Vim的使用
  7. MongoDb学习(四)--Repository
  8. SpringBoot2.0整合jsp
  9. 在Winform中屏蔽UnityWebPlayer的右键以及自带Logo解决方案整理
  10. android 布局如何居中,Android ConstraintLayout约束布局的居中详解
  11. 【IMU】BMI160 Driver分析及使用
  12. 自定义chromium浏览器
  13. 『.NET Core CLI工具文档』dotnet-publish
  14. 域名访问限制不严格漏洞 修复
  15. javaSE探赜索隐之四<final与抽象类>
  16. Linux中 strsep 函数 详解
  17. python3项目源代码下载_GitHub 上适合新手的 Python 开源项目
  18. Android 集成微信登陆不走回调onResp
  19. 阿里云服务器端口开放操作
  20. 【机器人学习】三自由度康复机器人运动学分析()

热门文章

  1. Precision(准确率)和Recall(召回率)介绍
  2. C#编程基础(下)第二课:创建Windows应用程序的方法,窗体的基本属性和方法、基本控件的使用
  3. 相位干涉仪测向的基础理论
  4. grafana登录失败无法从cookie中获取用户信息
  5. POJ 3095 Linear Pachinko 字符串模拟
  6. java分层窗格_java_拆分窗格_JSplitPane_图形界面
  7. 源码分析 merge 标签减少布局层级的秘密(Android Q)
  8. 今日晚间互联网科技新闻
  9. 【Prism系列】Prism子窗口实现
  10. java获取分贝_android 声音强度、分贝 大小检测 源码下载(as版)