阅前请读:我们这个游戏项目的内容暂时还不打算公开,因此游戏名称、游戏玩法、游戏内容都不会透露,希望大家谅解。这里只是分享一些我开发中遇到的问题以及解决办法,希望对大家有所帮助
本文按照问题来进行章节区分,每一个问题与解决办法对应一个章节。下面我来进行详细的总结。
一、绳子问题
绳子、布料这类软体相信让很多开发者都比较头疼。我第一次遇到这个问题时,完全不知道从何处下手,只知道好像铰链是可以实现的。但第一次尝试之后,效果让我非常失望,最难过的是,我还是不知道该如何进行参数的调整或者组件的添加。于是,我准备偷懒,并上网搜索了做绳子的插件。
- Obi Rope:我是偶然从网上发现这个插件的,因为评论说很好用且物理模拟十分逼真,我就找到了官网并下载了下来。官网链接在此:http://obi.virtualmethodstudio.com/
我仔细看了一下官网的介绍,发现这个插件确实十分厉害,它不仅可以模拟绳子,还能模拟布料、液体。在看了一些介绍视频后,它强大的效果使我决定下载一个试试效果。
我首先浏览了官方的API文档(链接在此:http://obi.virtualmethodstudio.com/api.html),了解了大概的用法,便开始进行实验。但当我开始实验的时候我就发现,这家伙的参数简直多到惊人!对于英语不是很擅长的我在看到它们的时候不免有些发蒙,可上网进行搜索,却发现基本没有这方面的教程或者讲解!
无奈,我只能硬着头皮通过它给的例子进行学习了。
经过一番奋斗,我发现其实它的参数实际上也没那么繁杂,大多数都是不需要调整的。
下面我就讲解一下它的参数、组件以及作用。(放图)
(1)Obi Distance Constraints(距离约束):下面的三个参数分别是——延伸大小(可延展长度),延伸刚度,压缩刚度。这个就是调节绳子拉伸时的抵抗弹性形变的能力,如果值比较大,那就说明绳子抗形变能力强,反之则弱。
(2)Obi Blending Constraints(混合约束):这个属性准确地来说我也不知道用来干什么的,在调节的时候并没有看到效果。
(3)Obi Tether Constraints(系紧度约束):绳子节点之间是否系紧,抗形变能力是否够强,这个属性就设置了。
(4)Obi Pin Constraints(拴住物体约束):重点到了!这个组件十分的重要,如果想要在绳子上系住物体,那么此组件你必须要熟悉。这个组件只有一个属性,就是刚度,但是有两个按钮,一个是添加要栓的物体,一个是删掉拴住的物体。请记住,这两个按钮,必须要在Edit Particles模式下才有用!那么怎么进入这个模式呢?稍后说。
(5)Obi Chain Constraints(链条约束):这个组件只有一个属性,表示链条结实程度。
(6)Obi Rope:这个是重点中的重点。首先,最上面的按钮就是进入Edit Particles模式的按钮。那么进入模式之后,会在scene场景中产生一个这样的窗口:
这个窗口中最常用的是Brush、Invert、Clear等按钮,都是对绳子的节点进行操作的,后面再说。
接下来继续说Obi Rope。
之后的属性能看到有一个Solver,这个属性之后要提,请留心。
Material大家都属性,这个是物理材质,Obi Rope插件里有设置好的物理材质,拖过去就好了。
Self Collision这个表示是否有绳子自身的碰撞。
pooled particles是绳子断开的时候产生的粒子数量。
Rope Path是绳子初始形态,如果有这个属性,那么在点击上面Initialize按钮的时候,绳子会自动变成Path设计的形状。
resolution不用说了吧,分辨率。
section twist每个绳子节点的扭转力。适当增加扭转力能增加绳子的动态效果。
Rendering是渲染模式,这个模式下有两个属性Procedural Rope(绳子)、Chain(链条)。在这里我们选择绳子进行讲解。
后面几个属性里,Thickness是影响绳子粗细的,而UV scale是影响绳子贴图延伸效果的。其他参数只要默认即可。
【最坑的是,这个插件我下载之后发现,并没有Tear这个属性(官方是有的),也就是说,这个绳子怎么也扯不断,因此之后我就没用这个插件了。如果想要有扯断的效果,建议还是花钱买正版的吧,盗版的确实不靠谱。】
下面我要说的,是Solver。这个是你绳子是否有物理效果、有碰撞效果等的关键物体。这个上面的组件也可以放在Rope物体上,但是我选择放在一个单独的Solver物体上,这样也是这个插件默认的方式。
这是Solver组件以及碰撞组组件的样子。由于Solver组件参数相当之多(每个展开之后都有很多参数),我就讲最关键的属性了。其实最关键的属性也就只有两个——Simulate When Invisible 和 Collider Group。当然这两个属性也一目了然,前者是“在屏幕之外的时候依然渲染”,后者是碰撞体组。碰撞体组的意思就是,可以和绳子进行碰撞检测的物体。
接下来我要说的是另外一个很重要的东西,叫做Obi Handle。这个是在Edit Particles里面进行创建的物体/组件。属性如下: 很简单,只需要指定要控制的是哪条绳子即可。
怎么创建呢? 点击这个按钮即可。但在创建之前,首先要选取绳子上的节点,你可以选择多个,也可以选择一个。这个物体的作用就是——控制住绳子的一端或几端,取消物理模拟,不管其他绳子节点怎么动,它都会定在自己那个位置不能动弹。可以想象,比如你要做一个悬挂物体的场景,那么你可以用这个物体来控制住绳子的一端,另外的一端随意怎么摆动都不会影响到这一端。是不是很方便?
那么选取节点要怎么做呢?
还是这个界面: 用这个圆形的cursor选取一个或者几个节点即可。
有了这些操作,我们就基本能做出一个像模像样的绳子了。接下来我放一个自己做的绳子供大家参考:
由于无法传视频,因此只能传图片了。脑补一下吧~
2.利用SpringJoint + LineRenderer自行设计绳子:
【这是我摸索了很久才搞出来的,说实话,在Unity里调Joint组件的参数确实不是一件容易的事,加上网上没有比较“正规”的教程,因此这个应该是非常干货的内容了,希望大家可以仔细阅读】
如大家所知,Unity中一共有SpringJoint、HingeJoint、CharacterJoint、FixedJoint、ConfigurableJoint几种关节,这些关节各有特色,其实如果是实现绳子的话,除了HingeJoint和FixedJoint应该都可以,我选择了SpringJoint,因此接下来只讲述SpringJoint的用法。
首先上图:
(1)Connected Body:指定此关节要连接的含有刚体的物体(这里我直接在代码里指定了)。
(2)Anchor:从自身设定的关节点位置。
(3)Auto Condigure Connected Anchor:自动在要连接的刚体上找连接点(这个属性我一般选false,因为找的位置很歪)。
(4)Connected Anchor:关节连接到指定刚体的连接点(建议自行指定,如果选了上面那个属性为true,这个属性就不能自行设置了)。
(5)Spring:在超出绳子节点之间最小距离或最大距离的时候给绳子节点加的弹力。
(6)Damper:弹性阻尼,阻尼越大,Spring的持续效果就越差。(可以把这个属性理解成摩擦力)
(7)Min Distance:节点之间最小距离。
(8)Max Distance:节点之间最大距离。
(9)Tolerance:我在试验中了解到,此属性的意义在于,当指定了Anchor和Connected Anchor属性之后,Tolerance值越大,绳子节点位置的容错率越大。也就是说,节点在模拟的时候可以不用精准地达到指定的Anchor位置,而是可以在容错范围内活动。
(10)Break Force:可破坏的撕扯力。绳子收到碰撞、切割时,此力越大越不易被破坏。
(11)Break Torque:可破坏的扭矩力。
(12)Enable Collision:关节是否可碰撞。
(13)Enable Preprocessing:是否允许预处理。
介绍完属性之后,下面来说说单个绳子的使用方法(即单一绳子绑物体):
单一绳子绑物体比较简单,在最后一节绳子节点上加一个Joint组件即可,connected body设置为要绑的物体。
技术问题的坑还真是需要记录一下