《炉石传说》架构设计赏析(3):Gameplay初探
经过前面的分析,我们已经找到了两个关键的类Gameplay和GameState(当然还有我最感兴趣的Spell和SpellController,这两个还要在后面分析)。
首先我们看一下Gameplay这个类的Awake方法,它完成的主要工作是:
1.调用“GameState.Initialize()”创建一个新的GameState实例;
2.注册CreateGame事件:在Gameplay.OnCreateGame()中响应,主要是
- 初始化卡背;(本地玩家和远程玩家的卡背ID都通过Player类来读取);
- 启动一个Coroutine:NotifyPlayersOfBoardLoad,它做的主要工作是
- 等待BoardStandardGame对象加载完成;
- 然后调用所有Player的OnBoardLoaded(),它的主要工作是初始化法力水晶相关的管理逻辑;
3.使用AssetLoader加载AttackSpellController、SecretSpellController、TurnStartManager等;
这些类看上去都很重要,我们后续分析游戏逻辑时肯定用得到。
接下来我们要看一下Gameplay.Start()方法,它主要是注册了一些自己关心的网络消息,然后调用
- Network.StartCountdown()——发送网络消息“BeginPlaying”;
- Network.GetGameState()——发送网络消息“GetGameState”;
我们在看一下Gameplay.Update(),里面似乎正常情况只是调用GameState.Update()。
OK,以上就是从MonoBehavior继承来的三个被自动调用的函数。对于游戏逻辑来说,还是没有什么头绪。
再往下分析,遇到的一个最大的困难是很多操作应该是通过网络交互完成的,例如【认输】操作,分析它是从GameMenu.ConcedeButtonPressed()开始的,一直调用到ConnectAPI.Concede()向服务器发了一个GiveUp消息,但是无法确定它对应的服务器返回消息是什么。
接下来我们先分析一下游戏的回合的流转,还是先看一下相关的类图:
回合结束是由玩家点击右侧的【End Trun】操作来触发的,其对应的代码为:InputManager.DoEndTurnButton(),这个函数的逻辑有些费解,目前只能是猜测如下:
- 首先判断当前是否允许访问GameState的OptionsPacket,以及EndTurnButton是否可以操作;
- 然后根据GameState.GetResponseMode()来分两种情况处理:
- GameState.ResponseMode.OPTION——卖二手游戏初步猜测为游戏回合中的正常操作:
- 从GameState中取出所有的Network.Options,然后遍历,找到“OptionType.END_TURN”或者OptionType.PASS的对象,然后调用GameState.SetSelectedOption(i);GameState.SendOption();
- GameState.ResponseMode.CHOICE——初步猜测为游戏回合开始时,选择初始手牌的相关操作;
服务器端的行为就比较难以猜测了,只能等到客户端行为分析比较完整时再说了。
服务器端相关的返回大致是这样的,在Gameplay的Start中有这样一句:
- network.RegisterNetHandler(Network.PacketID.ALL_OPTIONS,new Network.NetHandler(this.OnAllOptions));
复制代码
想象中客户端使用Gameplay.OnAllOptions()处理网络层接收到的所有玩家操作,此函数主要是将Network.GetOptions()取出的数据发送到GameState.OnAllOptions()去处理,后者主要会触发事件GameState.FireOptionsReceivedEvent()。
我们通过对应的GameState.RegisterOptionsReceivedListener()成员函数,可以分析一下哪些对象会响应此事件。找到EndTurnButton.OnOptionsReceived()。
这阶段的分析难度越来越大了,这次分析算是有小小的收获,但是整个回合流转的流程还没有清晰。总结如下:
- 玩家的操作是在InputManager中处理的,重点的成员函数包括DoNetworkResponse()、DoEndTurnButton();
- 玩家的操作和网络发送来的操作都保存在GameState.m_options中;
- 其中有另外一个Entity类体系也需要进一步分析。
《炉石传说》架构设计赏析(3):Gameplay初探相关推荐
- 《炉石传说》架构设计赏析(4):Asset管理
话说,经过这段时间的学习和摸索,对于Unity3D的开发思路已经基本清晰了.唯独还剩下一个AssetBundle机制还没有搞透,这个涉及到前期项目的资源规划.资源管理代码的写法,以及自动更新机制的实现 ...
- 《炉石传说》架构设计赏析(1):游戏启动流程
今年的Unity Awards两项大奖颁给了暴雪的<炉石传说>,这真是对Unity一个再好不过的宣传了--你看,暴雪都开始用Unity了.大家都知道,目前Unity发布的游戏大多都没有对程 ...
- 《炉石传说》架构设计赏析(6):卡牌 技能数据的运行时组织
前一篇文章我们看到了<炉石传说>的核心卡牌数据的存储,今天我们继续探索卡牌&技能. 主要的类 通过之前的分析,卡牌&技能涉及到几个类体系:Entity,Actor,Card ...
- c语言炉石传说算法设计,CCF-CSP题解 201609-3 炉石传说
模拟. 注意随从的编号在\(summon\)和\(attack\)随从死亡时都可能改变. #include using namespace std; struct tNode { int attack ...
- c语言炉石传说算法设计,FZU Problem 2232 炉石传说(匈牙利算法)
Problem Description GG学长虽然并不打炉石传说,但是由于题面需要他便学会了打炉石传说.但是传统的炉石传说对于刚入门的GG学长来说有点复杂,所以他决定自己开发一个简化版的炉石传说. ...
- c语言炉石传说算法设计,炉石传说:下棋吃鸡还扣分?设计师:现在已经改回去了...
原标题:炉石传说:下棋吃鸡还扣分?设计师:现在已经改回去了 随着16.0补丁的上线,很多酒馆战棋的高分玩家发现了一件非常反常的事情.那就是补丁更新之后,赢一局不仅不加分而且会扣分(前四名),甚至于吃鸡 ...
- 《炉石传说》架构设计赏析(2):Scene管理
今天我们主要分析一下炉石这款游戏中一共有哪些Scene,他们各自负责什么,以及它内部的逻辑.UI的处理方式. 在正式开始之前,我来对前文中提到的Scene切换再做一些补充分析.前文中我们看到Scene ...
- 《炉石传说》架构设计赏析(7):使用Google.ProtocolBuffers处理网络消息
这段时间琢磨了一下Unity3D网络游戏开发中的网络消息处理.网络游戏的服务端一般都是自主开发的,所以对应的网络消息处理也要自己开发.客户端/服务端之间的消息传到目前使用JSON和Google.Pro ...
- 《炉石传说》架构设计赏析(5):卡牌 技能的静态数据组织
经过前面几次的尝试,我们对炉石的代码已经不陌生了.除了网络机制还没有了解以外,本机的逻辑已经比较熟悉了. 接下来继续向暴雪最NB的技能系统进发,我们的目标是: 分析技能的静态数据描述: 分析技能的运行 ...
最新文章
- 使用websocket-sharp来创建c#版本的websocket服务
- 高可用集群技术之RHCS应用详解(一)
- linux 信号灯超时时间到,急!!信号灯超时时间已到错误又出来了!!!!
- 9路棋盘java代码_Java ServiceContext类代码示例
- 【C#学习笔记】单精度和双精度浮点型操作留意。
- Ubuntu 16.04中zabbix显示 :Zabbix server is not running:te information displayed may not be current.
- typescript探索(一)
- nginx root alias 文件路径配置
- uniapp和原生开发区别_web app和原生app有什么区别?
- C# UDP通讯实例
- index.jsp中文乱码问题
- 在excel上画交换机面板_如何在Excel中创建面板图
- cmake practice学习记录
- SQL高级查询—实验报告
- 每日一题 [Zer0pts2020]musicblog
- 基于大数据的线上线下电商用户数据挖掘研究
- 求生之路怎么显示所有服务器,求生之路2怎么屏蔽rpg服务器 求生之路2屏蔽rpg服务器方法_游侠网...
- 【UE Unreal Camera】【保姆级教程二】手把手教你通过UE获取摄像头帧数据
- littlevgl教程 Linux,树莓派littlevGL系列教程:容器控件(lv_cont)
- (转载)有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别...
热门文章
- 腾讯JAVA岗位四面,腾讯Java社招四面面经分享(4年java经验者)
- java+stream+源码分析_java8学习之Stream源码分析
- tcp_nodelay memcached java_TCP_NODELAY 和 TCP_NOPUSH
- BIOS和Bootloader的区别
- Navicat导出表结构
- $.post $.getScript
- 浏览器输入url后发生了什么?
- Oracle学习笔记:备份、还原、恢复的一点理解
- 利用反射,实现动态调用winform窗体
- USB接口直接焊线的顺序记录