Unity插件开发:基于Flux的技能编辑器

发表于2015-07-07
评论4 2.97w浏览
 

Unity插件开发:基于Flux的技能编辑器

 

Unity插件开发作用和意义

              随着Unity游戏引擎越来越流行,用好Unity将直接影响到游戏前端的开发速度和质量Unity插件开发正是用好的一个范畴

              那么什么是Unity插件呢? 可大可小,说来话长,文中将用实际例子说明,可以简单的理解成端游和页游的配套工具,只不过基于Unity的工具全部都集中在Unity环境下我们的游戏工程中,不用到处分exe了,并且可以在编辑时、运行时、直接访问到我们的游戏资源和逻辑数据。

             

              具备好的集成式插件工具将带来哪些益处:

1)         资源处理类工具减少游戏开发过程痛苦,策划、美术、程序均轻松,导入资源和配置过程均使用配套工具处理资源流程行云流水,一气呵成,不用手动一个个设置,减少手动操作出错概率。

2)         好的内容制作类插件,类似扩充的特效编辑器、关卡编辑器、技能编辑器等,可以让美术和策划人员更能发挥出艺术创造力,反复的打磨创作内容,使游戏品质更上一层楼。

3)         程序开发辅助类插件,类似各种调试辅助插件、性能插件、通用模块插件等,可以让开发更加迅速。

 


Unity插件开发应该具备什么样的标准:

1)         快速。手游制作周期相对很短,如果花一两个月写一个加速开发的插件,那就有些鸡肋了。除非这个插件非常的关键重要。一般的中小型工具,最好做到开发周期在几个小时到一周之内。

首先,开发Unity插件使用脚本语言,比使用C++高产很多;其次,编写环境集成在Unity下,各类底层API几乎全部都有;再次,绘制工具界面的API也都齐全,制作工具界面在以往会花费大量时间。所以,的确可以很快。

2)         易用。工具类东西是提供给同学使用的,如果不好用,不便捷,将会极大的影响同学的工作心情,影响他的效率,并且影响他的创作灵感。

3)         易扩展。策划和美术同学永远都非常贪心,有了最初他们想要的功能,他们就想要更强大的功能了,然后更强大,更完善,更易用。所以拿到第一版需求,就直接把功能朝完善想,朝夸张想,然后在设计上埋好伏笔,一般都会用的上。

 

详细的插件开发细节将在后续的文章中继续讲解,本文将以基于Flux的技能编辑器为例,宏观的说明一款工具的功能、开发、结构。

 

技能编辑器特性和需求

              由于手游的周期较短,所以了解到的技能编辑器的需求一般为:制作一个技能编辑器;可以做出什么样的技能;需要支持什么样效果。

              程序需要根据技能效果,拆解出功能点,做出设计支持这些功能点,并且要做到支持Unity插件开发那三条标准。所以,就有了以下思考:

1)         技能属于顺序播放类效果,在一段顺序时间内,播放动作、特效、声音、环境变化等等效果,触发受击、击飞、飞天、冲刺、硬直等等事件。

 

也就是这个样的了:

F:KingKuaiPanToThinkpadMakeSkills.bmp

 

 

基础选型

              考虑完技能的需求点,如果从头写这么一个框架,写完黄花菜都凉了,所以,考虑一个在一个现有较成熟的时间轴事件体系上,做扩展操作,这个时间轴体系需要成熟、稳定100%开源、易学、易懂、易扩展。

              有了这么一个框架,自己在上边添加需要的事件就可以了,在具体的点触发不同事件,并且可以修改时间轴,实现播放、变速等等效果。

遍历自己了解的时间轴事件体系,经过对比,最终决定使用Flux进行扩展。

Flux介绍

              Flux是一款基于时间轴的顺序播放系统,想象一下Flash编辑器,区别在于,Flash编辑器是编辑时间轴上的每一帧来制作动画,而Flux是指定在每一帧触发什么事件。

              Flux默认内置了一些原生事件,包括:移动、旋转、变色、播放动画、动画融合、播放声音、实例化对象等等

              有了这样一根时间轴和默认的事件,Flux已经可以用来制作过场动画、引导动画、剧情动画了。

              以下是一些Flux视频,可以更加直观的看到原生Flux都可以做到什么。

              http://www.fluxeditor.com/videos.html

http://www.youtube.com/watch?v=7HIXxcPd_GM

 

 

 

Flux数据结构说明

              Flux的运行时数据结构主干逻辑结构简单,也正是因为它的简单易理解,才很容易上手、改造。

             

              FSequence: 序列,Flux将一系列事件编辑在时间轴上,通过时间轴的推进播放这些事件,所以这样的事件集合就称为一个序列,非常的形象,技能,也就是一系列事件的播放,也正是一个序列。

序列是Flux中最上层的数据结构,最大的单位,其它类均被包含在序列中。

FSequence为一个Component,挂载在GameObject,由Update函数进行驱动。

 

              FTimeLine 时间轴,有了序列,那么事件就需要定在时间轴上,每一个序列都具有1N条时间轴。

为什么会有N条呢?所有事件根据一条时间轴进行推进不就可以了吗?

其实严格的讲的确一条时间轴就足够了,并且如果只编辑技能的话,可以只添加一条时间轴,分为多条时间轴是因为在编辑时,会更方便更有条理和更容易理解。

FTimeline做为FSequence的成员变量,由FSequence进行更新驱动。

 

              FTrack:轨道,事件并非裸的定在时间轴上,而是定在轨道之上,轨道的意义在于可以将彼此有关联的事件定在同一条轨道之上,这样可以在事件的起始和结束做出与其它事件的融合操作。

另外在编辑器中可以对轨道进行定制外观,定制操作等,例如AnimationTrack之上只能运行AnimationEvent,并且AnimationTrack可以调整动作融合。

                            FTrack做为FTimeline的成员变量,由FTimeline进行更新驱动。

             

                            FEvent:事件,终于到了核心和基础的东西,每一个事件是一个基本的触发单元

改造后的Flux界面说明

              在说明了Flux核心的数据结构之后,你可能需要先看一下Flux的视频演示,这样理解接下来的界面说明更加顺畅。

 

  1. 当前正在编辑的Sequence名称:一个场景中可能存在NSequence,在此选中一个,则编辑选中的Sequence
  2. 自己添加的Reset Position归位按钮:在编辑技能时候,经常会出现一些带有位移的技能,比如冲刺之类,如果当技能播放完毕后,自动将人物回位,则影响观看技能的整体效果感。所以增加一个按钮,当人物N次位移之后,在编辑者喜欢的时候,点下归位,人物回到起始位置。
  3. Sequence更新方式:可以选择NormalUnscaled Time,看到这两个选项的名字就明白啦,一个普通更新,一个不受游戏中Time.scale的影响,自己更新自己的。(注意,慎用UnscaledTime,尽量不用,除非是一些非常简单的运动,如果自己扩展的事件中使用UnscaledTime,这将是个旋窝,各处都会被UnscaledTime牵扯,Normal其实几乎足够处理所有情况)。
  4. Sequence刷新帧率:选择每秒刷新多少帧,也可以自己指定,例如游戏帧率是60帧,但自己有意的将一些技能或效果帧率设为10帧,可以提高效率。
  5. Sequence长度:此Sequence具有多少帧,填入数字为帧数,如果填入时间是不是更好理解?很遗憾现在没有填入时间指定长度功能,如果迫切需要可以自己扩展。
  6. 一条TimeLineTimeLine在我们的概念里是一个有时间刻度的时间条,在下方第10说明的确是时间条的UI说明,此处的第6条是逻辑概念上的TimeLine,每一个GameObject都有自己的一个TimeLine,共用一个TimeLineUI
  7. 一条Track:蓝条处在它之上,就这么一条黑色的长条,类似一条轨道。
  8. 一个Event:用蓝条表示,运行在Track之上。
  9. 另外一条TimeLine,在TimeLine之上显示的GameObject名称即为代码中的TimeLine Owner名称。
  10. TimeLine UI:所有TimeLine共用这条UI,因为所有TimeLine同时运行(如果需要可以修改),所以在编辑器状态下,只需要这一条UI就足够了,在这一条UI上拖动时间,观察所有TimeLine之上的运行效果。
  11. 播放控制:播放、停止、快进、快退、向前一帧、向后一帧。
  12. 查看帧的范围:在编辑Sequence时,有时需要放大可视范围,目将整个Sequence的情况全部看在眼底,这时将帧范围设置成0Sequence长度即可。有时需要精确地编辑某一帧的事件,则把可视范围变小,放大每一帧。
  13. Event Inspector:当点击某个Event蓝条时,右边Inspector中则显示出此Event的信息,就像我们观察和修改GameObject的信息一样。
  14. 事件Range:这条事件运行的Range,从某一帧到某一帧。
  15. 事件属性:这条事件运行时所需要的属性,事件属性可以自己任意定义。
  16. Track Inspector:显示当前Event所在的Track信息,大部分的Track都不包含属性,但是要做同一条Track上的N事件彼此交互时,Track信息就非常有用了。

 

改造后新增的功能

              Flux支持编辑技能的改造主要集中在两部分,改造和扩充,从评估到投入使用,花费两周时间

(1)      Flux机制的修改,这部分主要所做的事修改Flux的运行和操作方式,使它更适合用于编辑技能,例如上边提到的增加Reset Position按钮,在每次打开技能时,自动将样例人物和敌人加载进场景摆放等等。

(2)      Flux事件的扩充,这部分是工作量大头,正是有了N新事件,才可用于编辑技能。

 

在事件列表之中,增加Skill类型,以上是扩展的Skill事件。

 

  1. Black Back-_-黑屏,写成Black能让编辑者更容易看懂一些。
  2. Camera Motion:相机运动,规划一条相机运动的路线,在释放技能时,相机随轨道运动。
  3. Change TimeScale:修改TimeScale,释放技能时,整个世界都变慢了,或者突然加速。
  4. Character Motion:人物运动,规划一条人物运动的曲线,这样打斗起来人物上蹿下跳、辗转腾挪。
  5. DebuffsDebuff事件,因为Debuff在逻辑上有特殊处理,所以单独开事件。
  6. Hited Event:受击事件,人物受击,则触发此事件,在此事件中,做各种受击需要做的处理。
  7. Normal Effect:释放特效,支持挂在任意地方,播放时跟随、脱离等等。
  8. Play Audio:播放声音。
  9. Shake Camera:抖屏。
  10. Shoot Event:发射事件,制作发射类技能,弓箭、火球术等等。
  11. Skill End Control:某些技能需要明确支持结束,则增加此事件,在技能结束时,给出通知。
  12. Sprint Event:冲刺技能,冲刺?这和Character Motion有什么区别呢?因为不论朝哪个方向冲刺,冲刺过程中是带攻击判定的,更加消耗效率,所以做了区分。
  13. Trigger Sequence:别忘了,Sequence做技能时改造而来,它原本是制作各类演示的,Trigger Sequence,在技能释放过程中,可以触发一套演示。这样支持演示和技能嵌套。
  14. Weapon Attach:添加武器,不是添加在手上,而是添加在指定点,这样可以做出头上插了把刀的效果。
  15. Weapon Shower:显示或隐藏武器,比如将武器扔出武器,这时需要隐藏武器,再将武器从怪物身上拔下,这时需要显示武器。

 

最终成型就是这个样子的了。

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引