例如人物跳到往复运动的移动跳台上后应随跳台运动。
要实现这个效果有两个思路,一是用运动学一是用动力学。
一,运动学思路:
1,创建一个box作为移动跳台,用unity里内置的Animation Curves调个左右往复运动的动画。
2,为移动跳台添加Rigidbody并勾选Is Kinematic。这样,移动跳台本身就不再接受动力学作用了,但是它会对其它物体产生动力学作用。(While the Rigidbody is marked isKinematic, it will not be affected by collisions, forces, or any other part of physX. This means that you will have to control the object by manipulating the Transform component directly. Kinematic Rigidbodies will affect other objects, but they themselves will not be affected by physics. 引自:http://docs.unity3d.com/Manual/class-Rigidbody.html)
3,为移动跳台添加脚本,实现如下逻辑:如果player在跳台上(player的foot接触跳台且player处于非跳起状态),则player.Rigidbody.velocity.xz与跳台velocity.xz一致,否则令player.Rigidbody.velocity.xz=(0,0)。注:(1)有人可能会问,如果让player.Rigidbody.velocity.xz=(0,0),那player还怎么在键盘控制下移动呢?因为我的demo中player在键盘控制下移动是通过直接设置player.Rigidbody.position实现的,所以player.Rigidbody.velocity.xz=(0,0)并不影响人物移动。(2)为什么是player.Rigidbody.velocity.xz=(0,0),而不是player.Rigidbody.velocity.xzy=(0,0,0)呢?因为在我的demo中y方向上的运动(自由落体)不是通过直接设置player.Rigidbody.position.y实现的:D。
4,至此就差不多搞定了,唯一一个问题就是发现人物跳上移动跳台后跳台的运动会变得不那么流畅(略微卡顿),而且可以看出并不是性能问题导致的。后来我尝试对跳台的Animator作如下设置:Animator->Update Mode由Normal改为Animate Physics,卡顿就不再发生了(原因还没有细致分析,可能需要先详细了解一下Animate Physics选项的含义),至此达到了理想效果。
二,动力学思路(尚未尝试):
在真实世界中人物跳上移动跳台后随移动跳台一起运动,是由于摩擦力引起的,所以可以尝试通过调节跳台和人物foot间的摩擦属性来实现,要添修改摩擦属性,需要将Collider中的Material换成自已的physic material(创建方法:在asserts窗口中 鼠标右键->Create->Physic Material)。