漫话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,是通过新的动画系统来模拟老的动画系统的接口。如果感兴趣可以看一下,值得学习。

(未完待续)

漫话Unity3D(四)

时间: 2024-10-03 13:46:04

漫话Unity3D(四)的相关文章

漫话Unity3D(三)

八.预制(Prefab) 这个单独提出来,是因为它太常用了.也是Unity 的核心要素之一.原本Unity中的一个物体是你拖拽一个模型到场景中,或者创建一个几何体,或者灯光地形等,然后设置这个物体的偏移.旋转和缩放.然后绑定好脚本,设置好参数.如果想要第二个相同物体的话,复制一份.但是问题来了,如果有一个问题需要这n个物体都进行修改,那么就要操作n遍.这个时候预制就体现出威力了,你可以拖拽场景中的物体到下方的资源浏览窗口中,这样一个新的预制居创建出来了.场景中的n个物体都是通过预制创建的,那么直

漫话Unity3D(一)

前言 使用Unity已经有将近半年时间了,尽管项目还仅仅是个半成品,可是Unity差点儿相同玩熟了.这里把使用过程中碰到的问题梳理一遍.不会涉及到太过详细的功能和代码,可是假设开发一个网游又都会涉及到这些知识点,而这样的直击"本质"的"答案"是非常多教学书籍所不具备的. 一.背景介绍:什么是Unity 2013年手游如火如荼,开发了端游页游之外的第三战场.而随着手游品质的逐渐提高(越来越多的大公司開始介入手游领域,手游不管从画面还是内容都直逼端游),Unity開始为

winform展示Unity3D文件(支持动态改变文件路径)

winform下展示Unity3D文件可以支持对Unity3D实现的模块进行包装,以及在其他的项目中需要展示Unity3D的界面时候,恰到适宜地进行打开展示,这里我展示如何使用winform打开Unity3D文件. 一.在Unity的官网下载并安装Unity 安装完成后的目录如下: 二.在Unity/WebPlayer64/loader-x64文件夹下找到UnityWebPluginAX.ocx文件,然后将其拖动到WindowForm工具箱中. 然后将其拖动到窗体中,并添加一个button作为动

【转帖】漫话C++0x(四) —- function, bind和lambda

实在是觉得此文总是去翻感觉不太好.于是果断转过来了,想看原文的请戳:http://www.wuzesheng.com/?p=2032 本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制.之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解.在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础.下面我们来看看wikipedia上对于计算机领域的closu

Unity3D的四种坐标系

[Unity3D的四种坐标系] 1.World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. 2.Screen Space(屏幕坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的.注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕

Unity3d Android SDK接入解析(四)通用的Android SDK接入中间件

一.前言 接入Android SDK正式告一段落,在这段时间里面,依次接入了华为.应用宝.小米.360等等大大小小十来个SDK,也算对Unity接入渠道SDK有了较为全面的理解,对各个渠道的坑也算深有体会....在接入过程中时间比较紧张,没办法抽空来进行总结深思.今天正好有空,便对之前的接入SDK的代码进行了一次重构,写了一个比较通用的Unity接入Android SDK的中间件,前人栽树,后人乘凉. 进入正题 如果有对一些只是有疑问的,可以看看我之前的三篇文章: 传送门: Unity3d An

Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

提要 此篇是一个国外教程的翻译,虽然有点老,但是适合新手入门.自己去写代码,debug,布置场景,可以收获到很多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一篇中,我们学会了怎么在Unity中搭建游戏的场景,并且设置模型的物理属性. 在第二篇中,我们学会了怎么在unity中使用脚本,并且创建了大部分的游戏逻辑,包括投球和得分! 在这最后一节中,我们将会为用户创建一个菜单系统,并且和GameController进行交互,我们开始吧. 在设备上测试 到目前为止,

Unity3D教程宝典之光影烘焙:第四讲脚本控制

上一讲讲了用Light probes实现动态物体的非实时阴影,这一讲讲用代码实现代码实现动态物体的非实时阴影. 实现步骤:(1)新建一个场景,并建一个plane作为大地(2)创建Cube并缩放成扁平面后.复制Cube并旋转拼接搭建成一个敞篷.(3)讲上述物体设置static并烘焙.(4)创建一个player.这里用的unity自带的Character Controller包里的 3rd person controller这个prefab,拖进敞篷边.在该人物下找到Bip001 Pelvis这个节

【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程]给初学者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics我已经讲过了一些关于刚体和碰撞的关系,这次我们就通过Flappy Bird这个事例来讲解一下刚体和碰撞体在游戏中的具体应用.相关代码可以参考Flappy Bird的源码. 认识RigidBo