Unity3D优化技巧系列七

本文介绍了游戏开发中状态管理器的设计与实现,包括状态类型的枚举定义、状态切换的处理及单例模式的应用。通过具体的代码示例展示了如何在游戏场景中使用状态管理器,并讨论了其在降低模块间耦合性方面的优势。

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

优快云视频网址:http://edu.youkuaiyun.com/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模式。并将其应用到项目开发中去,各个模块之间使用的是封装的消息传递。减少了模块之间的耦合性。我们使用该模式实现了多款游戏,整体上感觉还是不错的。

转载于:https://www.cnblogs.com/jzssuanfa/p/7364908.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
居民消费是指居民在日常生活中为满足衣食住行、教育、医疗、文娱等各方面需求而进行的商品购买和服务支出。它不仅反映了居民生活水平和消费结构的变化,也是衡量经济活力和社会发展状况的重要指标。在宏观经济中,居民消费是拉动内需、推动经济增长的关键动力之一 本次团队分享的是中国31个省份居民消费水平、消费结构数据,包括393个居民消费的相关指标数据,数据年份为2000-2023年 一、数据介绍 数据名称:中国地区居民消费水平、结构393个指标 数据范围:31个省份 时间范围:2000-2023年 样本数量:31省*24年 数据来源:中国住户调查年鉴 更新时间:2025年4月 二、数据指标 全体居民消费支出 食品烟酒支出 衣着支出 居住支出 生活用品及服务支出 交通通信支出 教育文化娱乐支出 医疗保健支出 其他用品及服务支出 食品烟酒支出比重 衣着支出比重 居住支出比重 生活用品及服务支出比重 交通通信支出比重 教育文化娱乐支出比重 医疗保健支出比重 其他用品及服务支出比重 全体居民现金消费支出 城镇居民消费支出 城镇居民现金消费支出 农村居民消费支出 农村居民现金消费支出 城镇居民家庭全年现金消费支出 食品支出 粮食支出 淀粉及薯类支出 干豆类及豆制品支出 油脂类支出 肉禽及制品支出 蛋类支出 水产品类支出 菜类支出 调味品支出 糖类支出 烟草支出 酒和饮料支出 干鲜瓜果类支出 坚果及果仁支出 糕点类支出 奶及奶制品支出 其他食品支出 在外用餐支出 食品加工服务费支出 服装支出 衣着材料支出 鞋类支出 衣着加工服务费支出 住房支出 水电燃料及其他支出 家庭设备及用品支出 耐用消费品支出 室内装饰品支出 床上用品支出 家庭日用杂品支出 家具材料支出 家庭服务支出 交通支出 通信支出 文教娱乐支出 文化娱乐用品支出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值