经过前面的分析,我们已经找到了两个关键的类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中有这样一句:

  1. 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初探相关推荐

  1. 《炉石传说》架构设计赏析(4):Asset管理

    话说,经过这段时间的学习和摸索,对于Unity3D的开发思路已经基本清晰了.唯独还剩下一个AssetBundle机制还没有搞透,这个涉及到前期项目的资源规划.资源管理代码的写法,以及自动更新机制的实现 ...

  2. 《炉石传说》架构设计赏析(1):游戏启动流程

    今年的Unity Awards两项大奖颁给了暴雪的<炉石传说>,这真是对Unity一个再好不过的宣传了--你看,暴雪都开始用Unity了.大家都知道,目前Unity发布的游戏大多都没有对程 ...

  3. 《炉石传说》架构设计赏析(6):卡牌 技能数据的运行时组织

    前一篇文章我们看到了<炉石传说>的核心卡牌数据的存储,今天我们继续探索卡牌&技能. 主要的类 通过之前的分析,卡牌&技能涉及到几个类体系:Entity,Actor,Card ...

  4. c语言炉石传说算法设计,CCF-CSP题解 201609-3 炉石传说

    模拟. 注意随从的编号在\(summon\)和\(attack\)随从死亡时都可能改变. #include using namespace std; struct tNode { int attack ...

  5. c语言炉石传说算法设计,FZU Problem 2232 炉石传说(匈牙利算法)

     Problem Description GG学长虽然并不打炉石传说,但是由于题面需要他便学会了打炉石传说.但是传统的炉石传说对于刚入门的GG学长来说有点复杂,所以他决定自己开发一个简化版的炉石传说. ...

  6. c语言炉石传说算法设计,炉石传说:下棋吃鸡还扣分?设计师:现在已经改回去了...

    原标题:炉石传说:下棋吃鸡还扣分?设计师:现在已经改回去了 随着16.0补丁的上线,很多酒馆战棋的高分玩家发现了一件非常反常的事情.那就是补丁更新之后,赢一局不仅不加分而且会扣分(前四名),甚至于吃鸡 ...

  7. 《炉石传说》架构设计赏析(2):Scene管理

    今天我们主要分析一下炉石这款游戏中一共有哪些Scene,他们各自负责什么,以及它内部的逻辑.UI的处理方式. 在正式开始之前,我来对前文中提到的Scene切换再做一些补充分析.前文中我们看到Scene ...

  8. 《炉石传说》架构设计赏析(7):使用Google.ProtocolBuffers处理网络消息

    这段时间琢磨了一下Unity3D网络游戏开发中的网络消息处理.网络游戏的服务端一般都是自主开发的,所以对应的网络消息处理也要自己开发.客户端/服务端之间的消息传到目前使用JSON和Google.Pro ...

  9. 《炉石传说》架构设计赏析(5):卡牌 技能的静态数据组织

    经过前面几次的尝试,我们对炉石的代码已经不陌生了.除了网络机制还没有了解以外,本机的逻辑已经比较熟悉了. 接下来继续向暴雪最NB的技能系统进发,我们的目标是: 分析技能的静态数据描述: 分析技能的运行 ...

最新文章

  1. 使用websocket-sharp来创建c#版本的websocket服务
  2. 高可用集群技术之RHCS应用详解(一)
  3. linux 信号灯超时时间到,急!!信号灯超时时间已到错误又出来了!!!!
  4. 9路棋盘java代码_Java ServiceContext类代码示例
  5. 【C#学习笔记】单精度和双精度浮点型操作留意。
  6. Ubuntu 16.04中zabbix显示 :Zabbix server is not running:te information displayed may not be current.
  7. typescript探索(一)
  8. nginx root alias 文件路径配置
  9. uniapp和原生开发区别_web app和原生app有什么区别?
  10. C# UDP通讯实例
  11. index.jsp中文乱码问题
  12. 在excel上画交换机面板_如何在Excel中创建面板图
  13. cmake practice学习记录
  14. SQL高级查询—实验报告
  15. 每日一题 [Zer0pts2020]musicblog
  16. 基于大数据的线上线下电商用户数据挖掘研究
  17. 求生之路怎么显示所有服务器,求生之路2怎么屏蔽rpg服务器 求生之路2屏蔽rpg服务器方法_游侠网...
  18. 【UE Unreal Camera】【保姆级教程二】手把手教你通过UE获取摄像头帧数据
  19. littlevgl教程 Linux,树莓派littlevGL系列教程:容器控件(lv_cont)
  20. (转载)有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别...

热门文章

  1. 腾讯JAVA岗位四面,腾讯Java社招四面面经分享(4年java经验者)
  2. java+stream+源码分析_java8学习之Stream源码分析
  3. tcp_nodelay memcached java_TCP_NODELAY 和 TCP_NOPUSH
  4. BIOS和Bootloader的区别
  5. Navicat导出表结构
  6. $.post $.getScript
  7. 浏览器输入url后发生了什么?
  8. Oracle学习笔记:备份、还原、恢复的一点理解
  9. 利用反射,实现动态调用winform窗体
  10. USB接口直接焊线的顺序记录