2012年6月7日
19:31
星际2的编辑器相对于魔兽3最大的改进就是数据编辑器了, 也正是这个改变, 让很多有兴趣自制地图的人放弃了这个想法. 为什么呢? 因为它太复杂了, 而且资料很少, 所以上手难度比较大. 但是一旦你学会了它, 你就会喜欢上这种编辑方式. 这个编辑器背后的实现原理, 也是非常值得程序员们去好好探索和借鉴的.
星际2中, 很多功能都是可以使用数据编辑器去"配置"出来的, 这就是数据驱动的魅力. 有些时候, 它甚至可以取代脚本. 比如我做白虎这个英雄就没有写一行脚本代码, 完全是用数据编辑器的各种对象组合出来的.
下面我以DOTA中的白虎为例, 说明一下数据编辑器的技能制作思路 (这里不做100%的复刻, 只是为了学习编辑器, 做出演示效果).
注:这篇文章需要有数据编辑器的基础, 这个不是入门教程.
对象类型
星际2就对象有很多类型, 这里只说一下比较常见的. 这些类型还有子类型, 对象的实例之间是可以进行数据拷贝和派生的.
Units(单位)
大多数人应该知道Unit是个什么东西, 因为它就是个东西的意思. 一个兵是Unit, 建筑也是, 子弹也是. 这个类型里你可以找到Unit的生命值, 能量值, 护盾值等. 所有可见的部分并不在Unit里, 而在对应的Actor里.
Abilities(能力)
Ability就是一个Unit可以干什么. 攻击, 移动, 建造之类都是Ability. 在这里你可以找到能量消耗值, 用到的Button, 范围和产生的Effect. Effect -Target提供一个可以选择目标的鼠标指针, 选择后Effect就在目标点启动.
Effects(效果)
Effect是让一件事情发生. 它是Aiblity幕后的实现, 可以增加Buff, 产生伤害, 治疗单位等.
比如"Apply Behavior"类型应用一个Behavior(一般是一个Buff) 到一个Unit, "Damage"类型对一个Unit产生伤害, "Search"在一个区域内搜索Unit并施加一个Effect, "Set"类型把多个Effect组合成一个.
Behaviors(行为)
Behavior有很多类型, 最常见的应该是"Buff". 就像你想得那样, 它会附加到一个Unit上并影响它, 比如加速, 禁用武器, 抵挡伤害等.
Buttons(按钮)
前面我说了Button是干什么的了. 在游戏里你有一个命令面板(右下角), 每个按钮都对应一个Button对象, 描述它的图标, 提示信息, 快捷键和名字.
Actors(演员)
这是个复杂又重要的东西, 它表示所有你能看到的玩意儿. 如模型, 网格, 生命条, 选择范围等. 没有Actor的Unit会显示成一个白球.
Actor是新手觉得最棘手的, 它有一个Events字段关联到一个事件触发器. 在我的一张地图里我用Actor的Events来实现单位获得一个Behavior后变色的功能.
如果我想做一个AOE技能, 加速所有范围内的单位15秒. 你能猜出来这些类型是怎么联系起来的吗?
我会做一个Ability(当然配个Button). 这个Ability是Effect - Target类型, 它的Effect是一个Search Effect, 搜索指定目标半径内的友军. 每个搜索到的Unit都会施加一个Effect("Apply Behavior"类型), 这个Effect会施加一个自定义的"Buff"类型的Behavior, 它的功能就是增加额外的移动速度.
属性
DOTA中, 核心就是属性. 属性决定了英雄的类型, 装备的效果, 英雄的玩法等. 但是星际2中并没有力量/敏捷/智力这样的属性, 所以需要自己实现.
前面说了, 影响Unit的是Behavior, 所以这些属性就用Behavior的字类型Attribute来实现, 在Modification字段中就可以设置影响Unit的哪些数据了:
比如力量加19生命值, 敏捷加1攻击, 智力加13的能量值(相当于魔兽3中的魔法值)
等级
DOTA中等级是非常重要的, 因为等级的增长会带来属性的增长, 而属性又是整个DOTA的核心. Behavior有一个子类型Veterancy, 就是做升级的, 在这里可以设置每级需要多少经验, 改变什么数据等
比如这里我设置了1级需要25经验, 2级需要35, 3级45, 每级增加2点力量, 3点敏捷, 1点智力
当然, 升级特效什么的, 是加个Actor, 让它监听等级改变的事件来播放
单位
快速创建一个单位的方法就以已有的一个单位为模板进行复制, 然后去掉自己不需要的, 定制自己想要的功能. 在这里我使用Karass做为一个模板, 因为它是一个远程攻击单位, 不需要我再自己去做Weapon, 只需要替换一下Actor中关联的Model资源什么的就好了. Unit有个Behaviors字段, 上面我们实现的都可以加进去, 然后进游戏攻击敌方单位就可以升级了
技能
每个Ability需要关联一个Button, 并在Unit里加到命令面板上才能在游戏中使用
群星坠落
- 功能
- 召唤陨石对周围600范围内的敌方单位造成伤害
- 思路
- 这个技能是没有目标的, 所以使用Effect - Instant的Ability子类型
- 使用Search Area(Effect)搜索指定半径, 施加伤害Starfall (Damage)效果
- 陨石就是一个可视化的Actor, 只做纯表现. 类型使用BuffOneShot就是播放完了自己销毁. 创建通过监听Starfall(Damage)事件来实现
月神之箭
- 功能
- 以致命的精确性向一个地点射出一箭,箭矢带有视野,对触及的第一个敌方单位造成伤害并晕眩
- 思路
- 这个技能需要选择一个目标点做为方向, 所以使用Effect - Target类型的Ability
- 射箭
- 由于不能以选择的目标点做为箭的终点, 所以需要创建一个代理Effect, 加上一定的偏移(比如50米)做为目标点, 把箭发射出去
- 飞行
- 箭一个Missile单位, 需要制作相应的Unit的Actor对象
- Unit的移动是通过Mover来控制的, 这里可以设置成朝一个方向不停地飞
- 飞行过程中箭上有一个周期性触发的Buff, 这个Buff的Effect是一个Search Area的类型, 检测周围很小范围内有没有敌方单位
- 中箭
- 中箭就是Search Area类型Effect的施加的一个效果集合: 产生伤害 + 自杀(箭消失)
- 中箭的可视化效果是一个Actor, 通过监听Damage效果事件来创建
- 这里眩晕效果我没做, 应该是施加到目标上一个Buff来实现
跳跃
- 功能: 月之女祭司的坐骑向前跳跃,坐骑在落地后的咆哮形成一个作用范围为800持续10秒的光环,提升其中的友方英雄的攻击速度和移动速度
- 思路
- 这个技能也是不需要目标点的, 所以使用Effect - Instant类型
- 跳跃需要控制Unit的移动路径, 这个用脚本更容易实现. 但是使用数据编辑器也有一种方法来实现: Missile(飞弹)
- 做一个长得跟英雄一模一样的Missile, 发射出去, 路径使用Mover控制, 发射过程中把英雄隐藏, 等Missile到达后再把英雄移到目标点显示出来
- 目标点的效果是搜索周围友军英雄, 施加一个加速Buff
- 中间有一些细节, 比较跳跃过程中需要禁用操作, 禁用碰撞等
月之暗面
- 功能: 以夜色掩护自己和其他所有友方英雄,进入隐身状态
- 思路
- 这个比较简单, 直接施加一个隐身Buff就行了