• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >游戏开发 > Unity3D优化技巧系列七

Unity3D优化技巧系列七

作者:姜雪伟个人博客 字体:[增加 减小] 来源:互联网 时间:2017-07-23

姜雪伟个人博客通过本文主要向大家介绍了Unity3D,优化技巧,MVC等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

笔者介绍:姜雪伟,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模式,并将其应用到项目开发中去,各个模块之间使用的是封装的消息传递,降低了模块之间的耦合性。我们使用该模式实现了多款游戏,总体上感觉还是不错的。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于Unity3DNetWork
  • 实现unity3d程序一键打印照片
  • Unity3D的混合问题
  • 如何用unity3d实现pokermango?
  • unity3d按键检测程序
  • Unity3D建立不了tcp服务器总是被提示“一个封锁操作被。。。。终止”
  • unity3D的一个安卓的游戏
  • unity54角色控制器怎么不能导入?
  • 有人用过unet嘛?有个云ID的问题想请教下
  • unity3d打包时这两个选项的意义是什么?对性能有影响吗?

相关文章

  • 2017-06-05 求助:天空盒子呈现出来的图像破碎问题
  • 2017-06-05 我想问,Cocos2d-x3x究竟是怎样跨平台开发和编译执行的
  • 2017-06-05 cocos2d-x310Sprite外发光效果怎么实现啊?是在触摸事件下的
  • 2022-04-30Unity 3D创建简单的几何模型
  • 2017-06-05 cocos2d-x做应用
  • 2022-04-30Unity 3D下载安装教程
  • 2017-06-05 游戏网络编程
  • 2017-06-05 unity平移物体
  • 2017-06-05 求斜率求起始坐标为左上角的向量斜率与角度
  • 2022-04-30Unity 3D人形角色动画(Avatar)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 请问游戏人物的影子是怎么实现的?
    • 网游服务端开发,有哪些书籍可供推荐?
    • ITweenRotation这个怎么用啊
    • cocos2dx35AssetsManager使用问题
    • Unity 3D OnGUI常用控件
    • Unity523版本怎么弄3D声音?
    • Unity 3D Box控件
    • 游戏各大引擎调研
    • Unity 3D导出资源包
    • Itween插件问题,求帮助,感谢!!!!!

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有