如题,项目中想实现和人物进行简单的互动,比如点击他的手臂的时候他会播放手臂的动作,点击脚的时候播放预设的和脚有关的动画
之前我的实现方式是十分暴力的在人物模型中对应的部位添加一个子物体,给子物体添加正方体/圆体这种规则的碰撞体,然后因为他是在骨骼下的,所以人物在动的时候这个碰撞体也会跟着一起动,比绑在静态的mesh上灵活很多,不至于点击不相关的部位的时候也被静态的mesh检测到然后播放不相符的动画
但是这么有很大的局限性,第一就是不精准,因为是规则的碰撞体,所以检测的范围就大了很多,第二就是有的时候不同部位之间的碰撞体会出现交叉的情况,也会影响,最后就是这个实现方法太nc了,当时是真的想不到其他的办法
不过现在隔了1年多,在重新回来看的时候,发现了一个比较简单高效而且检测质量最高的办法
这是在网上随便找的模型
在骨骼的子节点添加一个空对象,然后给他挂载mesh collider组件,把这个骨骼对应的mesh找到,然后拖到mesh collider的mesh上,然后微调一下距离(我这里使用的时候碰撞体会比模型向前多了很多,向后拉一下,和肉眼上看到的一致即可)
给你需要的骨骼节点添加一个子节点
给子节点添加mesh collider组件
把骨骼对应的mesh找到,然后拖到步骤2创建的组件中的mesh
然后运行的时候你会发现这个碰撞体比模型前了很多
移动一下这个子节点到覆盖到骨骼对应的mesh的位置即可
编译器:能调,运行的时候也能调,不过相对麻烦一点
Game场景:如下图,一个小方法,在你微调的时候暂停一下Game场景,然后慢慢调,调完记得复制一下这个子节点的位置,停止Game场景后复制到这个子节点上
mesh collider组件上有一个canves的toggle,可以勾选上,勾选上后面片的数量明显少了很多,无疑能降低一点性能
其他的部位只要照猫画虎就可以啦~
不得不说,这个方法光是看着就舒服不知道多少倍,
两个需要注意的
第一是你的主相机的layer要选上main camera
第二是主相机上要有PhysicsRaycaster组件
缺一不可~
PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
pointerEventData.position = Input.mousePosition;
PhysicsRaycaster pr = Camera.main.GetComponent<PhysicsRaycaster>();
List<RaycastResult> results = new List<RaycastResult>();
pr.Raycast(pointerEventData, results);
这个results就是检测到的结果,输出一下即可
2d的物体检测只要把上面的PhysicsRaycaster组件改成GraphicRaycaster即可