找回密码
 点一下
查看: 2083|回复: 7

效果树中“目标数据”的传递研究

[复制链接]
发表于 2014-9-9 22:46:48 | 显示全部楼层 |阅读模式
本帖最后由 四夕水草肃 于 2015-8-4 18:41 编辑

看到了很多提问关于“效果中‘目标: 目标 - 值’(或类似的数据)如何设置”或者“施法者,源,起源有什么区别”之类的问题,遂将自己的研究笔记发上来供大家参考。
因为涉及的项目并不全面,也难免有错,所以作为[研究]而不是[教程]发出来。
因为没有大纲所以写的有点乱,有不明白的地方可以提问,如果有误也请务必提出。
本帖的中文译名按照版本2.1.3:30508的简体中文译名为准,译名部分禁止吐槽。
剧透:本帖没有图片和示例。

注意:虽然本研究尽量写得通俗易懂以降低阅读门槛,但是读者依然需要至少满足以下条件:
  • 知道什么是《星际争霸2》(StarCraft II.exe)和《星际争霸2编辑器》(StarCraft II Editor.exe)
  • 能够开地图编辑器,新建地图并且在地形上设置单位
  • 能够新建简单的技能(比如直接造成伤害或者刷新一个增益之类),并正确的安置给单位且可以正常使用
  • 能够看懂本帖中的重点概念“效果树”:
  效果树由技能、武器、行为或其他可引发效果/行为的数据项(不包括效果本身)引发的,包含各种效果和行为对游戏中各种数据进行一系列修改,最后以效果或行为结束的一整个效果体系。引发效果树的数据项在本帖中被称为效果树的“起点”,但不是效果树的组成部分。类似于其它“树”结构的命名:由“起源”引发的第一个效果称为效果树的“根效果”;若在效果树中A效果/行为引发了B效果/行为,则称A为B的父效果,B为A的子效果。额外的,一个效果的父效果,及父效果的父效果,及父效果的父效果的父效果……直到追溯到根效果为止,都称为该效果的“上游效果”,而没有子效果的效果称为效果树的“终效果”。通常,终效果能体现出技能/武器/行为等的最终实现价值。

小提示:通过数据编辑器的“在数据导航器中查看(V)(Ctrl+Space)”功能可以直观的查看效果树。

  
♣ 一、效果中的目标数据

  当在效果的实例在游戏中被建立时,每个效果都会保存七组单位/点对,它们分别是:
  •  起源(Origin)单位与点
  •  施法者(Caster)单位与点
  •  源(Source)单位与点
  •  目标(Target)单位与点
  •  外层(Outer)单位与点
  •  施法者外层(CasterOuter)单位与点
  •  目标外层(TargetOuter)单位与点
  这些数据被称为效果的“目标数据”。相比这些数据,所谓的“效果所在的位置”在效果树中就显得无足轻重了。这些单位和点既可以相同,也可以不同;同组的单位和点既可以同步,也可以不同步。当一个项目的单位值有数据时,一般点数据即为单位的位置。同时若一个项目只获得了点数据,则其单位数据会保持为空。
  当父效果引发了子效果时,就会将自己的保存的目标数据以及自己所能读取的其它目标数据(如果能够读取到的话),按照内部设定的方式传递给子效果。
  其中,起源点为根效果创建瞬间时施法者所在的点,该点不会因为施法者的移动而改变;而起源单位则始终为空(未经证实)。而“XX外层单位”所指代的概念是相应单位所在的载具(运输机、地堡一类),如果单位没有被装载技能装载,则这三项均为空。
  关于施法者、源、目标这三项目标数据的传递规律,作为本帖的重点,将在稍后详细讨论。
  而当你想决定效果实际影响的目标(比如,该对哪个单位造成伤害,或者飞弹该向哪个位置发射等)时,就需要修改效果的各种“目标 - 效果”和“目标 - 值”属性,以使其对正确的目标产生正确作用。

  
♣ 二、效果树的起点

  效果树的起点是效果树被创建的源头,从逻辑上讲它们不是效果树的一部分,但它们决定了跟效果的目标数据。常见的起点数据项目分别是:技能、武器和行为(作为被动技能)。

技能

  常见的可以直接触发效果的技能类型有效果 - 目标、效果 - 即时、扩展和专精。(更多类型技能介绍请勿期待。)

  • 效果类技能(CAbilEffect):

  即时效果技能其实是“以自己为目标使用效果的技能”因此效果类技能本质是一致的,故放到一起讨论。
  效果类技能是绝大部分常规意义的主动技能所属的类型,借助效果树的灵活性可以实现千变万化的技能特效。因此其也也占据了所有效果树起点的很大比例。效果类技能会将根效果的施法者单位与源单位设置为技能的施法者,目标单位或者目标点(取决于鼠标选择了单位还是点)设置为技能释放的目标(或者施法者单位,如果是即时技能的话)。

  • 扩展类技能(CAbilAugment):

  扩展类技能的作用是作为其他技能(包括攻击等基础类技能)提供可选的额外效果。通常用来实现诸如“寒冰之箭”之类的主动“法球”类技能(借用DotA中使用的概念),如果使用得当,可以作为其它技能的有力补充。因此,其对根效果的目标数据的设定与效果 - 目标技能基本一致。

  • 专精类技能(CAbilSpecialize):

  专精类技能的本质就是效果 - 即时技能(个人经验),其与效果类技能的不同之处在于,专精类技能可以像训练类、研发类等技能一样不占用单位的主要指令队列,实现并行释放技能。因此,其对根效果的目标数据的设定与效果 - 即时技能基本一致。

武器

  从结果上来说,武器可以看做是由攻击技能来调用的目标效果技能。武器+攻击技能的组合完全就是个只能对单位释放的效果技能了,因此武器与效果 - 目标技能的情况完全一致。

行为

  行为的特殊之处在于其既可以直接放在单位的行为属性列表中作为永久行为(通常用于制作被动技能)成为效果树的起点;也可以通过应用行为类效果的调用作为临时行为(各种增益和减益)成为效果树中的节点。本节只讨论前者,后者将在下一章节讨论。
  很多类型的行为都能产生效果,有些还拥有不止一种的产生行为的形式,使得行为可以同时成为多颗效果树的起点。但是不同行为在目标数据上的特点都大同小异。这里选用最基本,使用率最高的增益类行为作为例子来讨论。

  • 增益类行为(CBehaviorBuff):

  增益类行为两种产生行为的方式:固定产生和响应产生。行为的几条效果属性,包括“刷新效果”、“效果 - 起始”、“效果 - 周期性”、“效果 - 最终”和“终止效果”都属于前者,其运作方式与即时效果技能类似,会将根效果的源和目标设定为行为的携带者,对于作为起点的行为来说,起源点和施法者也是行为的携带者(及其位置)
  而在行为的“战斗:伤害响应”和“战斗:修正 - 死亡响应”中也有效果属性,虽然说战斗相应可以根据设置划分为“攻击响应”(携带者攻击目标时进行响应)和“防御响应”(携带者被攻击时进行响应),但无论如何,根效果的施法者单位源单位都是行为的携带者,目标单位则是触发响应的攻击动作的另一方单位。

总结

  简单说来,起点定义根效果的目标数据的规律如下表所示:
起点根效果的施法者根效果的源根效果的目标
有目标技能/武器使用技能/武器的单位同“施法者”技能/攻击的目标(单位或点)
无目标技能/行为(固定效果)使用技能的单位/行为的携带者同“施法者”同“施法者”
行为(攻击响应)行为的携带者行为的携带者被攻击的单位
行为(防御响应)行为的携带者行为的携带者攻击者
突然觉得好简单啊……为什么我要废话半天……

  
♣ 三、效果树中目标数据的传递

  好的,接下来是本帖的重点:目标数据的传递。只知道了根效果中的目标数据是不够的,必须要知道全部效果的目标数据才能玩转效果树做出犀利的技能来。而效果树中每个效果的目标数据都由其父效果来定义,不同的效果对自己不同的子效果的目标数据的定义又不一样。本帖把这种错综复杂的目标数据的传递关系叫做……呃……“目标数据的传递”。
  提别提醒:本章讨论的内容为“效果如何定义自己子效果目标数据”,如果要分析一个数据自己的目标数据,请参考它的父效果。(如果是根效果,请参考上一章。)
  方便起见,将效果按照本帖相关的标准将常用效果进行分类讨论

“传递效果”类效果

  传递效果类效果(好拗口)的主要功能就是传递效果树中的数据,因此作为终效果的情况很少见(但是也有),其中传递目标数据最为普遍。其可以更细分成为简单传递子类和复杂传递子类,前者包括“集合”(CEffectSet)效果和“切换”(CEffectSwitch)效果,后者则包括“搜索区域”(CEffectEnumArea,简称“搜索”)效果、“枚举载具乘员”(CEffectEnumTransport,不太常用的效果,简称“搜索乘客”好了)效果和“创建持续性效果”(CreatePersistent,简称“持续”或“偏移”)效果。

  • 集合:

  集合效果的用途特别简单,就是把多个效果合成为一个效果(当然还有些附加功能暂且不提)。集合效果也只有一个子效果属性: 效果:效果。当一个集合试图被创建时,它会尝试依序创建自己的所有子效果。如果一个集合效果所有的子效果都最终没有被创建(例如被验证器限制等),则该集合效果也最终不会被创建(该观点已基本验证)。因此,一个空的集合效果不能作为只用于触发器捕捉而不对游戏数据产生影响的“代理效果”(这个名词是我瞎定义的),当然,这是题外话。
  集合效果的目标数据传递也跟效果本身一样简单,集合效果子效果的全部目标数据都与其本身的目标数据完全相同。

  • 切换:

  切换效果的作用于程序结构的Switch或者Case等结构类似,或者说更像是多重If结构。其根据不同的验证器将效果树的走向引导至正确的分支。虽然看似是很常用的效果,但是根据《S2E时代技能的设计理念》来看,应当避免使用该效果。其子效果属性为:效果: Cases - 效果。
  如同集合效果,切换效果子效果的全部目标数据都与其本身的目标数据完全相同。

  • 搜索区域/搜索乘客:

  搜索区域效果的主要职责也是传递效果,但其会给效果树带入新的单位,因此其子效果的目标数据会有所不同。搜索乘客效果则是搜索指定载具(或指定单位所在载具)内的所有乘客。。他们都只有一个子效果属性。搜索区域效果为: 搜索:区域 - 效果,而搜索乘客效果为:效果: 效果。
  搜索区域和搜索乘客效果都会将子效果的“目标单位”定位自己搜索到的单位,而不再是自己的目标单位。其它目标数据则完全相同。

  • 创建持续性效果:

  持续效果与搜索效果的相似点是,搜索效果给效果树增加新的单位,而持续效果给效果树增加新的点。当然,这只是它的主要功能之一,除了位置的偏移,持续效果还能完成时间上的偏移。
  持续效果的子效果属性有四个,按照执行的时间顺序分别是:效果: 效果 - 初始、效果: 时段效果、效果: 效果 - 结束和效果: 效果 - 最终(最后两者的顺序有待测试)。跟搜索效果类似,除了将子效果的“目标点”设定为对应的偏移点外,其它目标数据完全相同。
小知识:如何计算“对应的偏移点”?
  以时段效果为例,将偏移效果自己的目标点,取偏移效果的由目标: 位置偏移 - 开始到目标: 位置偏移 - 开始两点定义的方向为Y轴负方向(你没听错,这个方向是-Y方向。这就是为什么“向前偏移1坐标单位”的偏移量填写是(0,-1,0)了。该特性同样适用于单位或者演算体模型之类,“前”这个相对方向在局部坐标系中就是-Y方向),加上周期性偏移属性定义的相对坐标,得到的新点即为“对应的偏移点”。

“新单位”类效果

  新单单位类的效果就是指能够直接新建单位的效果,一般来说这类效果都是作为终效果出现的,但是也有很多需要对被创建的单位进行修正的情况(比如,给召唤单位添加限时生命的行为已保证其能到时自毁)。该类效果包括“创建单位”(CEffectCreateUnit)效果与“发射发射物”(CEffectLaunchMissile,俗称“发射飞弹”)效果。

  • 创建单位:

  创建单位效果有一个子效果属性:效果: 效果 - 生成,其一般用作对创建的单位进行修正。因此,对于该子效果而言,新建的单位是其目标单位,其它目标数据继承创建单位效果。

  • 发射飞弹:

  发射飞弹效果有两个字效果属性:效果: 发射效果和效果: 轰击效果。很多人对发射效果的理解有误,我们可以对照轰击效果来看一下。
  轰击效果的作用是当飞弹命中目标以后,“对目标引发的效果”。因此,对于轰击效果属性的子效果而言,飞弹单位是其源单位,轰击的单位/点(通常也是发射飞弹效果的目标单位/点)是其目标单位/点。
  类比轰击单位可以得到,发射效果是飞弹发射时“对发射单位引发的效果”。对于发射效果属性的字效果而言,飞弹单位是其源单位,而发射飞弹的源单位是其目标单位。这点与通常的第一感觉刚好相反。这也就是为什么想对飞弹应用行为的时候,效果里的目标栏要填写“源单位”的原因了。
  其它目标数据依然保持继承不变。

其它各种效果

  其它的效果大多都没有子效果,或者目标数据的传递非常简单。只有“应用行为”(CEffectApplyBehavior)效果是个例外。虽然该效果本身没有任何子效果属性,但是行为是可以产生新的效果的。考虑到对行为来说,产生效果是其最基本和常用的功能之一,因此导致应用行为效果和行为经常处在效果树的中间节点,而不是终节点上。

  • 应用行为效果和行为:

  目前已知行为可以保存和传递效果树中恒定不变的“施法者单位/点”和“起源点”,其它目标数据则可能会重新设定。因此可以得到行为作为效果树节点和作为效果树起点时子效果目标属性的继承基本一致,除了施法者和起源点会保持不变。

  
♣ 四、目标数据的使用方法简述

  (虽然很不想承认……然而……)
  (本帖已坑)

评分

参与人数 1威望 +3 收起 理由
oneonestar + 3 感觉画表格比较清晰

查看全部评分

发表于 2014-9-9 23:48:18 | 显示全部楼层
非常不错,期待 …四。
回复

使用道具 举报

发表于 2014-9-10 11:43:55 | 显示全部楼层
关于“效果: 效果 - 结束和效果: 效果 - 最终(最后两者的顺序有待测试)”

效果: 效果 - 结束:指的是效果正常结束时触发的效果
效果: 效果 - 最终:指的是效果结束时触发的效果
两者的区别在于:正常结束指的是持续性效果的持续时间到了结束;结束指的是无论持续性效果是正常结束的,还是因为其他什么原因结束的(类似技能被打断)都包括在内。

也就是说:如果持续效果到期结束了,则触发两个效果(如果都填了的话);而如果持续效果并不是到期结束,而是被打断结束的,则只会触发 "效果: 效果 - 最终"
回复

使用道具 举报

发表于 2014-9-10 14:47:48 | 显示全部楼层
四夕水对效果的目标数据研究的真的很透彻,佩服一下。这篇教程写的很详细,期待星星给集合到置顶帖子里。
不过还是有几点疑问:
1.印象中空的集合效果是允许的,没有测试过触发器是否捕捉,但是数据是能捕捉的,比如在演算体中相应该效果发布消息。但是最近没有再使用过类似手段,是否真的就不能创建呢?
2.切换效果究竟为何不宜使用?当然集合效果在多数情况下都能完美实现切换效果的功能,但肯定不是因为这个才不使用切换,况且集合效果在实现“非此即彼”的选择时多少有些麻烦。
3.对于同一个效果树中处于两个分支的效果,互相之间是否能调用对方的目标数据,或者有什么其他的规则?
4.假如一个集合效果有两个子效果,分别是效果1和效果2,那么效果1的子效果是创建在效果2之前,还是之后呢?或者这样问:效果1的下级树是否也在效果2之前创建呢,还是先创建效果1,然后是效果2,再然后才是他们的下级树?
回复

使用道具 举报

发表于 2014-9-13 13:23:47 | 显示全部楼层
收藏
回复

使用道具 举报

发表于 2014-10-31 18:02:37 | 显示全部楼层
写得太好了,感谢:)
回复

使用道具 举报

发表于 2014-11-1 20:31:02 | 显示全部楼层
就说2点,空集合会被创建的。

集合效果里当然是写在前面的最先执行,写在后面的后执行。除非用了随机。
回复

使用道具 举报

 楼主| 发表于 2014-11-3 01:15:50 | 显示全部楼层
原来空集合会被创建的嘛……再去测试下好了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-23 15:07 , Processed in 0.100976 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表