经过前面几次的尝试,我们对炉石的代码已经不陌生了。除了网络机制还没有了解以外,本机的逻辑已经比较熟悉了。

接下来继续向暴雪最NB的技能系统进发,我们的目标是:

  • 分析技能的静态数据描述;
  • 分析技能的运行时数据、逻辑组织;

这篇笔记主要记录对其分析数据。

静态数据组织

卡牌数据

  • 卡牌的基本数据对于的AssetFamily为:AssetFamily.CardXML;
  • 数据对于的资源包为“cardxml0.unity3d”;
  • 资源包中的资源类型为:TextAsset;
  • 资源加载使用的接口为:AssetLoader:LoadCardXml();
  • 运行时对应的数据类型为:EntityDef;
  • xml文件中保存有多个Entity对象数据,具体数据例如:
  1. <Entity version="2" CardID="CS1_042">
  2. <Tag name="CardName" enumID="185" type="String">闪金镇步兵</Tag>
  3. <Tag name="CardSet" enumID="183" type="CardSet" value="2" />
  4. <Tag name="CardType" enumID="202" type="CardType" value="4" />
  5. <Tag name="Faction" enumID="201" type="Faction" value="2" />
  6. <Tag name="Rarity" enumID="203" type="Rarity" value="1" />
  7. <Tag name="Cost" enumID="48" type="Number" value="1" />
  8. <Tag name="Atk" enumID="47" type="Number" value="1" />
  9. <Tag name="Health" enumID="45" type="Number" value="2" />
  10. <Tag name="AttackVisualType" enumID="251" type="AttackVisualType" value="1" />
  11. <Tag name="CardTextInHand" enumID="184" type="String"><b>嘲讽</b></Tag>
  12. <Tag name="DevState" enumID="268" type="DevState" value="2" />
  13. <Tag name="Collectible" enumID="321" type="Bool" value="1" />
  14. <Tag name="EnchantmentBirthVisual" enumID="330" type="EnchantmentVisualType" value="0" />
  15. <Tag name="EnchantmentIdleVisual" enumID="331" type="EnchantmentVisualType" value="0" />
  16. <Tag name="ArtistName" enumID="342" type="String">Donato Giancola</Tag>
  17. <Tag name="HowToGetThisGoldCard" enumID="365" type="String">圣骑士达到57级后解锁。</Tag>
  18. <Tag name="FlavorText" enumID="351" type="String">如果闪金镇都是由1/2的步兵把守的话,那它早在多年以前就被毁了。</Tag>
  19. <Tag name="Taunt" enumID="190" type="Bool" value="1" />
  20. <Power definition="54e57583-ce5c-46e3-899a-39bd2181468d" />
  21. </Entity>

复制代码

牌实体

  • 卡牌实体对象对应的AssetFamily为:AssetFamily.CardPrefab;
  • 数据对应的资源包为“cards?.unity3d”,目前共有4个;
  • 资源包中的资源类型为:Prefab;
  • 资源加载对应的接口为:AssetLoader:LoadCardPrefab();
  • 卡牌资源使用CardID进行索引,例如“闪金镇步兵”对应“CardID="CS1_042"”;
  • Prefab中的GameObject主要包含:Transform、Material、CardDef,这三个Component;

CardDef有很多CustomEditField,主要分为以下几类:

  • EditType.SOUND_PREFAB;
  • Material,主要是Portrait--头像;
  • EditType.SPELL,其实是string类型,保存的是Spell对象的资源路径;

技能对象

  • 技能对象对应的AssetFamily为:AssetFamily.Spell;
  • 数据对应的资源包为“spells?.unity3d”,目前共有3个;
  • 资源包中的资源类型为:Prefab;
  • 资源加载对应的接口为:AssetLoader:LoadSpell();
  • 卡牌通过CardDef中指定相关技能资源的路径;
  • Prefab中的GameObject主要包含:AudioClip、AudioSource、Material、ParticleSystem、ParticleSystemRenderer、Transform等组件;
  • 涉及到的脚本主要有:PlayerMaker相关的类,Spell及其派生类、SoundDef;

我们看到Spell有很多的派生类,手游账号转让平台这里用到了一个小技巧:GetComponent()是可以把基类作为参数来获得子类对象的。例如,一个对象绑定了ArmorSpell对象,而ArmorSpell是Spell的派生类,那么gameObject.GetComponent<Spell>()是可以获得这个ArmorSpell对象的。

总结一下:

卡牌和技能相关的数据主要包括以上三种,其中EntityDef是使用“策划填表”或者类似的方式,而且卡牌和技能资源,则使用Unity编辑成Pefab。技能对象中用到了PlayerMaker插件。

本次分析涉及到的类,请详见下图。

主要的类

通过之前的分析,卡牌&技能涉及到几个类体系:Entity,Actor,Card,Spell,令人十分困惑,特别是前两者。在这里先略带武断的说一下这几个类的基本定位:

  • Entity主要用来做网络数据同步用的;
  • Actor主要处理客户端的渲染对象的控制,作为Component挂载在资源对象上;
  • Spell是技能Prefab挂载的脚本;
  • Card是卡牌Prefab挂载的脚本,在运行时处于中心地位,处理前3者的联系。

Entity

Entity是通过网络数据创建的,主要是Network.PacketID.POWER_HISTORY这个消息。详见GameState.CreateNewEntities()函数。因为Entity并不是MonoBehavior派生类,所以是new出来的,然后添加到GameState中管理(GameState.AddEntity()),网络传来的Entity数据主要是Tags(每个Tag是一个name->value对),然后调用Entity.InitEntity();

Actor

  • Actor也是一种资源,通过AssetLoader.LoadActor()加载;
  • 对应于AssetFamily.Actor;
  • 对应的资源包为“actor?.unity3d”,包内的为GameObject;
  • Actor的加载入口是在:Card.DetermineActorThenTransitionToZone()

Spell

Spell的加载入口是在Entity.ProcessCardDefAssetRequest()

Card

  • 在InitEntity中调用了Entity.InitCard(),它做的工作只是创建一个空的GameObject,然后使用AddComponent把Card添加上去。
  • 真正的卡牌Prefab加载是在Entity.LoadCard()中进行的,这个函数是在处理PowerTask时GameState.OnShowEntity()中调用的;
  • 具体的加载操作是通过 DefLoader.LoadCardDef()进行的,其内部再调用AssetLoader.LoadCardPrefab()来进行资源加载;

卡牌&技能的加载流程

Entity的创建,以及Card、Spell的加载,都由网络消息触发;整个过程比较复杂,主要是有很多异步回调,比较难用文字描述,请见下图:

《炉石传说》游戏架构设计分析:卡牌技能数据相关推荐

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

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

  2. 炉石android更新日志,炉石传说每逢更新必卡门,安卓用户你们想哭了吗?

    原标题:炉石传说每逢更新必卡门,安卓用户你们想哭了吗? 大家好,这里是新一期的<炉边乱吹>,我是小白. 今天是10月10号,因为临近西方的万圣节,<炉石传说>也进行了一个更新, ...

  3. 漫谈程序员(二十)炉石传说罕见数据库事故!丢失30%数据,疑似误操作?

    #漫谈程序员(二十)炉石传说罕见数据库事故!丢失30%数据,疑似误操作? ##引言   最近看到一篇关于"炉石传说数据库事故"的文章,分享给大家,并简要谈一下自己的心得体会.    ...

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

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

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

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

  6. android8.0炉石闪退,【关注】炉石传说游戏中闪退返回登录界面问题

    亲爱的玩家朋友们: 目前我们接到反馈,部分用户在<炉石传说>游戏过程中会闪退返回到登录界面,该情况目前工作人员已经知晓并且在核实当中了,给您造成的不便深感抱歉. 为了更好的了解问题所在,还 ...

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

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

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

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

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

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

最新文章

  1. 网站分类前导:获取网站标题和描述及对相关信息进行分词处理
  2. ITK:复制过滤器filter
  3. php框架m方法详细,Thinkphp框架中D方法与M方法的区别是什么
  4. lua----------------使用VS2015搭建lua开发环境的一些侥幸成功经验,
  5. 中下游大学毕业如何在大城市和各种985大学生厮杀?
  6. 微软宣布放弃收购雅虎
  7. 云计算的小兄弟:雾计算和霾计算
  8. C#程序之快速切换IP地址
  9. 2021-06-22Oracle常用函数
  10. php处理微信昵称特殊符号
  11. Web开发——Photoshop(PSD格式截取)
  12. Win11使用PCVR时性能问题已修复 可手动安装解决
  13. Android实现远程控制PC(Android[客户端]+Qt[服务器端])
  14. golang的运维开发
  15. c语言错误c2142,应数计算机程序设计(C语言)实验选编.docx
  16. 数据的增量采集与全量采集
  17. 用Python爬取豆瓣首页所有电影名称、每部电影影评及生成词云
  18. 互联网乱世之下,那些人才流动中的心酸和无奈
  19. kyeremal-网络流24题T2-太空飞行计划问题
  20. 微软数据库之微软自带数据库分析

热门文章

  1. 【华为机试真题 Python实现】最大括号深度【2022 Q2 | 100分】
  2. 2021年广州市高新技术企业认定奖励申报条件及要求,补贴100 万元
  3. 寻找强连通分量的Tarjan算法
  4. ESP32设备驱动-LED控制器生成PWM信号
  5. 2011/08/27 刷机器,遭遇白苹果,不可连接ipod服务器 的解决
  6. 微信小程序口红项目新手练习Day1
  7. 解决C语言函数调用warning: implicit declaration of function ‘‘
  8. 支付宝支付设计和开发方案
  9. 你了解Yaf 是什么嘛?
  10. 详解决策树与随机森林