授予每个自然月内发布4篇或4篇以仩原创或翻译IT博文的用户不积跬步无以至千里,不积小流无以成江海程序人生的精彩需要坚持不懈地积累!
一些大型游戏特别是同屏多人嘚情况下,如果采用unity3d自带的Collider组件来触发3d模型在unity里部分位置的点击响应其实是有一定消耗的。为了减少消耗, 提高性能特意开发出tiny touch这一插件來提高项目的性能Tiny touch 使用方便,性能优越能灵活组合使用。
本文描述了高性能“tiny touch”的基本用法及其应用程序
这里你可以见到一个3D角色模型, 及三个在模型身上的圆。而这些圆就是点击的有效区域
首先我们来点准备工作:
地面中的BoxCollider组件必须覆盖整个地面!
Radius设为1。出现如下效果:
这样一个粗略的点击响应区域完成了
把元素0的id设为1, 元素1的id设为2.
把左手的骨骼拖到元素0的Blind把右手剑的骨骼拖到元素1的Blind。
这样细致的点击区域也准备好了
Rough Speckles: 设置粗略范围的球体,一个模型一般为1个或没有即可
Subtle SpeckLes: 设置细致范围的球体,一个模型中可以有1 个或多个
里媔的元素为球体属性。
Id :即定球体ID一般用于点击响应后返回用的
Blid:球体绑定的物体,可以是模型本身也可以是模型中的某一部分的物体。
Offset:相对绑定物体的偏移
Radius:是球体的半径。
Draw Pos:是否显示球体的中心点显示中心点时,可以对其拖拉达到偏移的效果
以上属性设置好後,保存预制体相应的属性会一同序列化保存。
运行程序当我对场景空白地方点,点击模型的左手点击模型的剑时,分别输出如下:
如果没有被点中返回的tinyId为-1.
否则tinyId为对就细致球体的id
其中xyz为点击的屏幕坐标
2. 提供更方便的调用
博主本来想自己写有大大写的異常详细,转载一下以作学习记录
平面:10×10的平面 |
这些内置的基本几何体其实就是引擎自带的mesh。等同于我们在外部创建一个Cube或Plane模型然后導入Unity使用这与我们的在Maya中使用预设几何体有本质不同。Unity3D的基本几何体不具备任何调整参数选项
由于基本几何体都非常简单,Unity3D本身也不提供多边形编辑工具给我们使用(但可以使用
插件来进行一些多边形编辑工作)所以很多情况下我们需要其他3D软件来制作模型,然后再導入到Unity3D中
虽然U3D现在支持直接导入Maya的
.ma
文件,但建议大家还是先将模型清理好后导出成.fbx
格式然后再导入到U3D中,这样比较便于管理并不是所有的Maya节点都能够被正确导入到Unity3D中,实际上Unity3D仅支持Polygon Mesh、Joints、空节点、蒙皮信息、摄影机、关键帧动画的导入,而Maya中常用的NURBS表面、Curve曲线、变形器、IK、Constraints等内容都不支持
并且,我还建议大家在导出
.fbx
之前对Maya文件进行一下“清理”工作检查好模型的发现方向,烘焙好关键帧动画删除掉多余无用的节点,删除无用的构造历史同时将模型放在坐标原点中心位置,冻结Transform属性(归零)
Unity3D可以识别单个模型文件中的多个mesh,苴Mesh Filter组件仅支持载入单个mesh所以我们可以用一个文件导出所有游戏所需要用到的mesh,然后在U3D中一一调用
因此,为Unity3D制作模型素材的时候在三維软件中就搭建好全部模型并不是一个好选择。因为三维软件中重复出现的模型导入U3D中以后会被识别成不同的mesh,直接载入整个场景会浪費掉很多系统资源更有效的制作流程是在三维软件中制作好不同的“小物件”,然后在Unity3D中完成具体场景的搭建工作
PS:地形、植被等模型可能更适合于利用Unity3D自带的功能模块来创建呢!
选择相应的模型Asset,其导入参数会显示在Inspector面板中
Model一栏是关于模型的导入参数,Rig一栏是关于綁定设置的导入参数Animations一栏是关于动画数据的导入参数。
Scale Factor
:导入尺寸缩放(按照实际长度计算)
Mesh Compression
:网格数据压缩程度会一定程度上减少mesh嘚多边形面数
Keep Quads
:是否保持所有的四边面(而不自动转换为三角面)
Swap UVs
:交换UV组(通常模型有多套UV组,且导入后发现贴图不正确时勾选)
Normals
:如哬处理法线方向(Import代表导入模型原来的法线数据、Calculate代表用下面的Smoothing Angle
参数来进行自动光滑计算、None代表完全无光滑发现设置)
Smoothing Angle
:夹角在多少度以仩的边会被自动计算成光滑边界
设置完毕千万不要忘记点击
Apply
按钮确认哦!!!
在Unity3D中尺寸比例非常重要因为很多Unity3D操作都依赖于physics物理解算,洏物理解算会因为物体的尺寸比例不同而呈现出差异极大的结果一个100米高的大石头和一个1厘米高的小石块从空中落到地面的行为显然是佷不一样的。
由于Maya中默认设置为 1单位距离 = 1厘米所以Maya模型导出成.fbx以后再导入Unity3D,要设置scale为0.01否则就会变得超级大。
总结一下导入模型的技术偠求:
Scale Factor
设置为0.01;
Rig一栏下的设置比较简单最重要的是设置Animation Type
:
Legacy
:这种方式比较老式了,不支持Avatar通过Animation组件来调用动画
Generic
:这种方式现在比较常用,对动画的调用主要通过Animator组件来完成
Humanoid
:这种方式类似Generic
也昰配合Animator使用的,但专门针对人形骨架可以点击Configure...
按钮进入人形骨架Avatar的详细设定
所谓Avatar,在我认为是对于骨骼结构的一种标准化描述方式用來方便在不同模型之间自由应用动画数据。比如Humanoid类型的Avatar就把人形生物的各关键骨点都标准化为了特定的名称,这样不论动画数据是基于怎样的命名规范只要将动画数据fbx文件以及目标模型fbx文件都标准化成人形Avatar,就可以自由的将动画数据应用在新模型上
眼尖的同学应该可鉯发现,这个概念和Maya中的HumanIK很像
在下面图片所示的Mapping
面板中,我们可以手动指定各关键骨点所对应的场景节点甚至还可以对于头部和手指嘚细节进行设置,非常方便:
Muscles & Settings
面板我还没怎么用过以后用到了再补充进来。
对模型进行绑定设置的基本流程可以总结如下:
Legacy
方式进行设置(但我还是不太推荐)
Generic
方式还需要指定一个Root Node
,也就是“根”节点这个节点是所有动画的起点,通常可以指定骨骼链的最顶端joint或者骨骼链的父物体节点等等
Apply
按钮确认!!!
将设置好的.fbx
资源拖进场景中,Inspector中会显示这个游戏物体嘚组件
可以看到已经附加了一个Animator
组件(动画人)其Avatar
参数已经添加好了,但Controller
参数还是空的这时候模型是不会在场景中播放动画。
如果之湔选择的是
Legacy
方式的Rig游戏物体会被自动附上Animation
组件。其中Animation
参数也是空的(因为这个fbx模型本身是不带动画的!)初学者大多会“自作多情”哋认为,带动画的fbx模型导入Unity3D不是应该直接就自动播放动画么其实并不是这样的。如果是
Legacy
方式导入模型又自带动画的话,倒是有可能自動播放但Legacy
和Animation
组件目前其实已经逐渐被大家抛弃了,而使用Animator
的话不添加Controller
是不会有动画被播放的。
上面所使用的Unity-chan的素材动画文件是和模型文件分开的,如果选择模型.fbx
文件打开Animations
面板的话看到的是一片空白:
我选择unitychan_WALK00_F.fbx
文件来做演示,点击文件右边的小箭头可以显示这个.fbx
文件嘚全部内容,我们可以看到只有一些貌似面部的mesh一个Avatar,以及一个WALK00_F
文件
这个
.fbx
文件实际上只包含动画数据,之所以会有这些mesh出现是因为這些mesh上的动画并不是通过骨骼绑定来实现的,而是blendshape或者是直接transform动画所以必须保留动画数据所依附的节点,也就是这些mesh而这个
WALK00_F
文件就是動画数据所存放的文件了(在硬盘上的文件后缀名是.anim
)。
有动画的.fbx
文件在Animations面板下是有内容的
Bake Animation
:我没用过这个选项,应该是把IK动画烘焙成關键帧动画的意思吧但不保险,还是在三维软件中做好所有的烘焙工作吧
Clips
:这里可以对动画曲线做切割,点击+
号可以添加一个片段並给这个片段指定Start
帧和End
帧,每一个Clip对应之前看到的一个动画文件默认是将整段动画曲线做成一个大Clip,也就是WALK00_F
我们可以在一个文件中把铨部需要的动画都做进去,然后在导入的时候手动分割我个人比较推荐这种做法。
要注意的是手动分割以后的clips文件才会真正出现在硬盤上,前面展开fbx文件看到的那个动画文件实际上是包含在fbx文件内部的在硬盘上找不到的。
Loop Time
:该片段是否默认循环播放
实际上从设定clip的洺称开始,后面的所有设定都是针对某一个特定clip来做的详细参数这里不细说了。
这张图片中显示出两条
Warning
警告说明这个模型其实是有一點点小问题的,我检查了一下应该是有一根Spine骨骼稍微有点歪,不过不影响大局就不管它了。
在最底下的预览框中可以看到这种单独導出动画文件的工作方式真不咋地,由于没有实体模型所有动画文件预览时都看不到,点击播放就看到一张白脸在那里晃来晃去
解决辦法是用鼠标将模型fbx文件拖到这个预览窗口中,这样就替换了原始模型便可以看到该段动画clip在正确的模型上优雅地播放了。
下面我们来讓这个模型能够动起来
如果使用老式的Animation组件,只需要将动画片段clip拖到到Animation
栏中这段clip相当于“当前动画片段”,会自动在game object被载入时自动开始播放了如果设置了loop,那么就会不断循环
在Animations
一栏中,可以添加任意多个clips这些clips则是“后备动画片段”,未来可以通过脚本来调用他们進行播放
老式Animation组件的问题在于,游戏中动画片段之间的切换是非常频繁且复杂的使用这种方式的话,所有的动画切换都要通过脚本来實现变成了程序员的负担。所以那些编写游戏引擎的程序员们当然就要想办法把这份工作甩给美工去做咯于是就开发了后面的Animator系统,紦动画片段的切换逻辑设计给“可视化”
新式的Animator组件需要调用一个Controller
,我们可以在Assets中新建一个暂且起名叫AC
吧。
这个面板现在空空荡荡的僦3个类似按钮的东西我们可以拖动这些“按钮”来随意布局。
把动画文件拖到这个面板上可以看到动画clip变成了一个较大的橘色长条,嘫后从Entry
长条中延伸出一个箭头指向这个新加入的clip长条
实际上,Animator Controller是一个“状态机”(关于状态机的解释可以看)而Animator面板则将这个状态机嘚设计工作“可视化”了。我们后面会学习到的PlayMaker也是一个基于状态机的交互设计插件
这些不同颜色的“长条”代表不同的“状态”,“箭头”则代表状态可以从一端变化到另一端所以上面这样图可以这样解释:当该物体“进入”场景时,物体动画状态变为
WALK00_F
也就是“一經载入,模型播放WALK00_F
动画”的意思
点击WALK00_F
,我们可以看到与在Project面板中点击WALK00_F
动画片段文件时不同的Inspector面板显示内容:
在这里我们可以设置这个“動画状态”下播放哪个动画片段(Motion
)用什么速度(Speed
)来播放,要不要把动画倒放(Mirror
)等等
在Project面板中点击
WALK00_F
动画片段文件时Inspector面板显示的内嫆是这样的:显示成灰色是因为我点击的是
fbx
文件中包含的clip,所以不可编辑我们可以Ctrl+D
将其复制成单独的clip文件,然后再修改