首页 > 代码库 > 漫话Unity3D(四)

漫话Unity3D(四)

十三、MMO的GUI应该如何实现

        之前说过Unity自带的GUI系统低效,繁琐。 所以对于MMO来说使用一个GUI插件是必然的选择。如果你的游戏UI比较少,比如切水果、愤怒的小鸟,那么选择什么UI插件差别不大。但是一个MMO的UI非常多,甚至有可能有几百个界面,那么一个好用的GUI插件可以极大的提高生产效率。

        我选择的是Daikon Forge GUI,之所以选择这个而不是更有名的NGUI,是因为NGUI细节更多,bug更多,操作起来总是会碰到一些恶心的问题。更不要说早期NGUI恶心的界面层级管理。用评论中的一句话说就是,“我使用NGUI,就是在跟它做斗争,而用DF GUI,一切都是那么简单,我不知道为什么它是对的,但是它就是对了”。

        我使用这个GUI的时候,有一些不足的地方。但是多数情况下用的很顺手。包括界面编辑,多分辨率适配,函数绑定,动画配置等等。

        最大的不足之处有一点,就是如果我的UI元素很多,无法直接在UI Root里面指定好默认图集,那么它的Draw Call合并功能就被废了,一个控件一个Draw Call。

        在确定插件之后,我还对其进行了一定的封装,确定了现在的工作方式。 在任意场景编辑UI,然后把对话框(就是界面的物件)保存成一个预制,然后需要打开界面的时候直接加载这个预制。  这样有两个好处,一是可以避免多人合作时同时操作一个场景造成冲突。二是可以避免没有打开对话框也加载其对应资源造成浪费。


十四、换装系统怎么做

        换装有两种,一种是模型的添加和提换,另一种是第二层纹理的提换。

        拿魔兽世界来举例子,换了一把武器就是换模型的过程,而换了护腕、护腿就是换纹理的过程。

        第一种实现起来很简单,首先基础模型上要有对应的武器绑点,对美术来说就是在指定的骨骼下创建一个空的物体,把旋转和偏移设置好。然后我们在游戏中动态加载武器模型,并根据绑点设置武器的旋转和偏移。  换武器的时候就销毁原武器,然后实例化一个新的武器。

        第二种我还没有研究,这个应该更好靠美术来配合,在模型中就指定好换装区域,并配置好贴图UV。


十五、ARPG中的人物攻击判定怎么做

        人物攻击有三种实现方式,可以根据需求来选择使用

        第一种是直接判断人物是否朝向目标,然后判定攻击距离,如果小于攻击范围,那么就命中了,否则就是没有命中。在技能实现的时候可以配置一个攻击延迟,延迟 零点几秒再播放怪物的受击动作,表现还算可以。这个也是大多数mmo(甚至是端游时代)常用的方式。效率最高。

        第二种是创建一个物体添加BoxCollider(或者是其他的collider),通过这个物体的移动和缩放来对目标进行碰撞判定。类似的还可以把碰撞盒绑定到武器(比如剑)上面,通过攻击动作带动剑移动,进行碰撞检测。碰到物体的时候给予伤害。  这个相对来说比较准确,但是效率不高。

        第三种是使用Physic类的物理判定函数在指定的时间进行搜索,如果发现碰到了碰撞体,那么对应造成伤害。这个函数有三类,第一类是Raycast,这个就是非常简单的射线判定。 第二类是SpereCast,它于射线类似,但是测试的碰撞有体积,可以进行如前方一定区域的判定。第三类是OverlapSphere,它在指定点进行一个圆球判定,主要用于区域爆炸伤害。 


十六、游戏中怎么管理和播放声音

        声音没有太多可说的,Unity内部使用fmod声音引擎,质量、效果、效率和跨平台性能都挑不出什么毛病。不过习惯了cocos2d-x中简陋的SimpleAudioEngine,突然来了一个声音可以配置几十个参数,而且还有n个曲线图,确实让人无从下手。

        Unity中一个AudioClip对应一个声音文件,可以直接进行播放。我们可以简单的对其进行封装以方便调用。或者像我一样直接使用AudioToolKit插件。我对比了几个声音插件,这个使用起来是最简单的,跟我的死路最贴近。 比如播放一个声音,直接调用AudioController.Play("声音名字")就可以了。

        有一个细节稍微提醒下,默认情况下声音都是3D音效,即随着摄像机的移动,声音会改变强弱。 在声音文件的属性窗口中勾掉3D Sound就可以变成2d音效了。


十七、游戏特效

       Unity最不愁的就是游戏特效了,大把的插件,近千个酷炫特效可以选择。与cocos2d-x相比,3D引擎最舒心的就是可以轻易实现全屏特效,而不用担心纹理、内存问题。

       Unity同样还有一些非光效类的超酷的特效,比如碎裂效果、消融效果、高光描边效果等等,这些都是有现成插件可以使用的。


十八、动画系统

       最开始我犹豫了很久,到底使用老的动画系统,还是使用新的MecAnim动画系统。老的动画系统偏代码向,Unity不再继续维护,虽然还有大把的插件使用老的动画系统,但是随着时间的过渡,应该都会变成MecAnim动画系统了。

       新的动画系统有一个最让人心动的功能就是动画重定向功能。借助于这个功能,我可以使用一套动作适配所有的人形角色。即便骨骼有一定差异,只要是人形那就可以适配。举个例子,一个大猩猩、一个泰迪熊、一个士兵、一个忍者,这四个角色骨骼差异可能很大,传统的动画系统肯定要做n个受击、死亡动作。但是重定向后只需要一套就够了。非人形的怪物不能使用重定向,但是可以正常使用MecAnim中其他功能。

        至于说新的动画系统的缺点,并不是之前网上流传的无法适用于AssetsBundle,而是代码书写习惯。MecAnim需要通过编辑AnimationController来控制动画的播放。在代码中通过配置一系列Trigger Bool Float等条件参数,来控制动作改变。这原本没有什么问题。但是实际开发过程中,假如我有100个怪物,怪物的动作无非是攻击、受击、死亡,原本我可以直接在代码中写个Play("Attack")就可以搞定的事情,现在必须要配置100个controller文件。这很不“科学”。同样还有一些恶心的问题是,新的动画系统对于单个动作的控制性变弱了,原本可以轻易控制一个动画的播放速率,打到部分情况下慢动作等效果,但是现在必须绕很大的弯才能实现,同样,获取动画播放的时间也不是一件容易的事情。

        有人写了一个插件MecAnimControl,是通过新的动画系统来模拟老的动画系统的接口。如果感兴趣可以看一下,值得学习。

(未完待续)