笔者介绍:姜雪伟,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 initialization
void Start () {
GameStateManager.Instance.EnterDefaultState();
}

另外在它的Update函数中要进行状态的更新。函数代码例如以下所看到的:

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

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

Unity3D优化技巧系列七的更多相关文章

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

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

  2. 【转】MyEclipse 2015优化技巧

    MyEclipse 2015优化技巧 MyEclipse 2015优化速度方案仍然主要有这么几个方面:去除无需加载的模块.取消冗余的配置.去除不必要的检查.关闭更新. 第一步: 去除不需要加载的模块 ...

  3. Unity3D脚本中文系列教程(十三)

    http://dong2008hong.blog.163.com/blog/static/469688272014032334486/ Unity3D脚本中文系列教程(十二) ◆ function G ...

  4. Unity3D脚本中文系列教程(三)

    http://dong2008hong.blog.163.com/blog/static/4696882720140302323886/ Unity3D脚本中文系列教程(二) 示,属性不被序列化或显示 ...

  5. Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)

    Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager) 本篇主要讲解iOS开发中的网络监控 前言 在开发中,有时候我们需要获取这些信息: 手机是否联网 ...

  6. information_schema系列七

    information_schema系列七   这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 第七篇主要看一下一下 ...

  7. 10个CSS简写/优化技巧-摘自网友

    10个CSS简写/优化技巧23来源/作者:未知 类别:前端开发 字体大小:大|中|小 背景颜色:蓝|白|灰 ? ? CSS简写就是指将多行的CSS属性简写成一行,又称为CSS代码优化或CSS缩写.CS ...

  8. MySQL 性能优化技巧

    原文地址:MySQL 性能优化技巧 博客地址:http://www.extlight.com 一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这 ...

  9. jQuery 性能优化技巧

    原文地址:jQuery 性能优化技巧 博客地址:http://www.extlight.com 一.使用最新版本 jQuery 类库 二.合理使用选择器 # 推荐使用 $("#id" ...

随机推荐

  1. love2d教程32--碎图打包器texturepacker

    texturepacker是一个碎图打包器,可以把小图合并成一张大图,并对大图做优化.我用的是特别版(只好用xx版了, 不然导出的图片会被变成红色),网盘下载,文件会提示有毒,我也是在网上找的,其实是 ...

  2. Android——寄存器和存储器的区别

    寄存器和存储器的区别   从根本上讲,寄存器与RAM的物理结构不一样. 一般寄存器是指由基本的RS触发器结构衍生出来的D触发, 就是一些与非门构成的结构,这个在数电里面大家都看过: 而RAM则有自己的 ...

  3. 介绍编译的less的几种IDE工具

    介绍编译的less的两种IDE工具 现在css预编译越来越普及了,著名的有less.sass.stylus等等等等.功能上基本上都是大同小异.这些个玩意儿主要表达的意思就是:“像编程一样的编写你的cs ...

  4. C/C++基础问题归集

    include " ":先从本地目录,后从系统路径include <>: 先从系统路径,后从本地目录 一般用哪个都没关系,只是速度有差别罢了

  5. OSX监听全局键盘按下事件并捕获事件源的硬件接口位置

    在OSX系统全局监听键盘的按下事件,并可以捕获事件源的硬件的接口位置,用于区分是哪个键盘产生的事件.下面的代码只是以键盘为例子,其实是可以适用于其他输入外设的.如有需要可搜索相关外设的匹配字典的创建代 ...

  6. [工具使用] 如何访问github

    1.ping github.com,记录github的ip:192.30.252.129 2.找到系统的 hosts文件位置: C:\Windows\System32\drivers\etc\host ...

  7. 阿里云ecs开启x11图形化桌面

    阿里云帮助文档:https://www.alibabacloud.com/help/zh/faq-detail/41227.htm 安装云服务器 ECS CentOS 7 图形化桌面 以安装 MATE ...

  8. 浅析 Hadoop 中的数据倾斜

    转自:http://my.oschina.net/leejun2005/blog/100922 最近几次被问到关于数据倾斜的问题,这里找了些资料也结合一些自己的理解. 在并行计算中我们总希望分配的每一 ...

  9. 下列JSP代码:

    下列JSP代码: <html> <body> <% for(int i = 0; i < 10; i++) { //1 } %> </body> ...

  10. c#用run32dll打开系统dll(如系统图片查看器,并置最顶层)

    [DllImport("user32.dll", EntryPoint = "SetWindowPos",CharSet = CharSet.Auto)] st ...