Unity3D优化技巧系列七
来源:互联网 发布:金石造价软件下载 编辑:程序博客网 时间:2024/05/16 07:58
笔者介绍:姜雪伟,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模式,并将其应用到项目开发中去,各个模块之间使用的是封装的消息传递,降低了模块之间的耦合性。我们使用该模式实现了多款游戏,总体上感觉还是不错的。
0 0
- Unity3D优化技巧系列七
- Unity3D优化技巧系列四
- Unity3D优化技巧系列五
- Unity3D优化技巧系列六
- Unity3D优化技巧系列八
- Unity3D模型优化技巧
- Unity3D渲染优化技巧
- Unity3d优化技巧
- Unity3d常见性能优化技巧
- UNITY3D优化的常规技巧
- unity3d 常规性能优化技巧
- unity3d 手游端一些优化技巧
- Unity3D静态对象优化系列
- Unity3D脚本中文系列教程(七)
- Unity3D脚本中文系列教程(七)
- Unity3D教程:常规性能优化技巧
- Unity3D性能优化13个技巧
- unity3d 性能优化技巧(持续更新)
- 冒泡排序的步骤
- Lintcode 下一个排列
- OpenCV 中图像的算术运算、平滑处理、阈值化及图像金字塔
- 大数据IMF传奇行动绝密课程第93课:SparkStreaming updateStateByKey案例实战和内置源码解密
- 【SSH网上商城项目实战28】使用Ajax技术局部更新商品数量和总价
- Unity3D优化技巧系列七
- bzoj4806: 炮
- Throwable类详解
- nyoj 301 递推求值(矩阵快速幂)
- 【BZOJ 4491】我也不知道题目名字是什么【差分+线段树维护】
- CCD的驱动程序
- 【SSH网上商城项目实战29】使用JsChart技术在后台显示商品销售报表
- Border Layout
- node.js学习(二十二、mongodb安装)