U3D本身是一个比较方便扩展的游戏开发工具,有很强的扩展性,我们可以在gameobject上挂脚本,可以扩展编辑器等等。但是远远谈不上好用!举个例子:
1某天策划需要一个飞向目标的子弹飞行脚本,很简单嘛,刷刷刷,程序开发完了,交给策划,完工。
2第二天策划需要一个子弹,子弹飞行轨迹是平行地面飞行的,也很简单嘛,程序再搞一个脚本,交给策划,完成任务。
3第三天策划需要子弹击中目标能播放一个特效,程序在脚本上修改了一下,加了几个特效参数,完成。
4第四天策划需要子弹击中后能播放一个声音......
5第六天策划需要子弹击中后,延迟1秒播放一个特效......
6第五天策划需要子弹击中后,施放子弹的人看到的特效和被攻击的人看到的特效不一样......
可以看出挂脚本的方式缺陷很大:
1.脚本的可重用性非常差,策划稍微有一点需求的变动,程序就得去修改脚本。其实每次可能只需要改动那么一点点。
2.策划掌控起来比较费劲,每拿到一个新脚本,策划就得学习一下新脚本的用法,程序还得手把手的教,这个参数怎么用那么参数是什么意思。
感觉真是没完没了,程序和策划都太痛苦了!怎么解决?我们可以看看UE4,UE4的蓝图是一种好的解决办法吗?我试用过后感觉不是!蓝图本质是一种非常复杂的脚本,策划学习起来非常费劲,让策划搞这个还不如直接让策划写C#脚本呢。有没有一种能让策划很快掌握,程序又能比较方便进行扩展功能的方法呢?我想到了之前做服务端开发,策划编辑NPCai用到的行为树。行为树本质是一种非常简单的可视化脚本,其每个结点是一个非常小的可重用的功能,相互搭配起来又非常灵活,策划也非常容易掌握,扩展性非常强,程序只需要开发一个个结点就行了,让策划自己去配置吧!行为树具体是什么我就不介绍了,大家还是找找资料自己看看吧,我介绍下之前设计子弹怎么用行为树来解决。
1.飞向目标的子弹,这个行为树挂在子弹身上,每帧跑,他的意思是,每帧判断与目标距离是不是小于0.3,如果小于0.3删除自己,如果没有则继续向目标移动。
2.子弹的需要平行地面,程序只需要开发一个平行地面移动的结点给策划即可,是不是非常easy呢?
3.子弹击中目标需要播放一个特效,程序只需要提供一个创建特效结点给策划就完成任务了,可以看到创建特效结点上面可以挂载特效,策划使用起来非常简单,复制一颗行为树,在到达目标点那加上创建特效结点就完成了。
4.播放声音也是一样,程序开发一个播放声音结点。
5.延迟播放特效和声音,给策划一个延迟播放结点,策划想配置延迟多久就延迟多久。
第6个我就不弄了,还是类似的做法有了行为树编辑器,程序和策划的工作变成了:
1.程序的工作就是
a.开发开发各种结点,只需要继承一个类重写一个函数即可完成
b.开发各种行为树挂载点,例如:
人物出身的时候人物每帧更新的时候人物删除的时候buff添加的时候buff更新的时候buff删除的时候战斗开始的时候战斗结束的时候,技能开始施放,技能释放结束。
2.策划的工作就是在各种挂载点上配置行为树,比如战斗开始播个音效啊,加颗行为树播放音效,某个英雄技能可以击飞对手,加颗击飞行为树挂在技能上。总之一切都是行为树,例如buff上挂行为树如下图:
行为树的结点是高度可重用的,程序只要不断丰富结点,开发工作会越来越少,目前我们项目组策划很久都没有提出新的结点需求啦,真轻松啊!当然这只是基础功能,我们项目的编辑器还提供:
1.调试功能,看看行为树运行的路径,策划打开游戏一边编辑可以实时看看行为树运行路径,假如不对可以实时修改,完全不需要重启游戏。
2.行为树参数类型检查,每种挂载点传给行为树的参数不同,这相当于静态编译功能。
3.行为树用到的资源也能自动依赖打包,完全不需要程序进行管理。
我们项目已经将行为树作为整个游戏的配置工具,基本上策划除了UI,其它一切都用行为树进行配置。以后我会再详细说明一下。
?Unity3D使用asyncawait异步语法
?UGUI之Mask切割图像shader应用(消除锯齿)
?Unity网格C#教程—程序网格编程形式
?UnityC#渲染教程---CombiningTextures(纹理混合)