• 【unity学习笔记-如何给动态的人物添加碰撞体】


    前景提要

    如题,项目中想实现和人物进行简单的互动,比如点击他的手臂的时候他会播放手臂的动作,点击脚的时候播放预设的和脚有关的动画

    之前我的实现方式是十分暴力的在人物模型中对应的部位添加一个子物体,给子物体添加正方体/圆体这种规则的碰撞体,然后因为他是在骨骼下的,所以人物在动的时候这个碰撞体也会跟着一起动,比绑在静态的mesh上灵活很多,不至于点击不相关的部位的时候也被静态的mesh检测到然后播放不相符的动画

    但是这么有很大的局限性,第一就是不精准,因为是规则的碰撞体,所以检测的范围就大了很多,第二就是有的时候不同部位之间的碰撞体会出现交叉的情况,也会影响,最后就是这个实现方法太nc了,当时是真的想不到其他的办法

    不过现在隔了1年多,在重新回来看的时候,发现了一个比较简单高效而且检测质量最高的办法
    这是在网上随便找的模型

    在这里插入图片描述

    解决方法

    在骨骼的子节点添加一个空对象,然后给他挂载mesh collider组件,把这个骨骼对应的mesh找到,然后拖到mesh collider的mesh上,然后微调一下距离(我这里使用的时候碰撞体会比模型向前多了很多,向后拉一下,和肉眼上看到的一致即可)

    步骤

    步骤1

    给你需要的骨骼节点添加一个子节点
    在这里插入图片描述

    步骤2

    给子节点添加mesh collider组件
    在这里插入图片描述

    步骤3

    把骨骼对应的mesh找到,然后拖到步骤2创建的组件中的mesh
    在这里插入图片描述

    步骤4

    然后运行的时候你会发现这个碰撞体比模型前了很多
    在这里插入图片描述

    移动一下这个子节点到覆盖到骨骼对应的mesh的位置即可
    编译器:能调,运行的时候也能调,不过相对麻烦一点
    Game场景:如下图,一个小方法,在你微调的时候暂停一下Game场景,然后慢慢调,调完记得复制一下这个子节点的位置,停止Game场景后复制到这个子节点上
    在这里插入图片描述

    步骤5

    mesh collider组件上有一个canves的toggle,可以勾选上,勾选上后面片的数量明显少了很多,无疑能降低一点性能

    其他的部位只要照猫画虎就可以啦~
    不得不说,这个方法光是看着就舒服不知道多少倍,

    顺便奉上检测3d物体的方法

    两个需要注意的
    第一是你的主相机的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);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这个results就是检测到的结果,输出一下即可

    2d的物体检测只要把上面的PhysicsRaycaster组件改成GraphicRaycaster即可

  • 相关阅读:
    redis的持久化
    你知道AI数字人可以用在哪些行业吗?
    时间序列分解:将时间序列分解成基本的构建块
    AI基于大模型语言存在的网络安全风险
    FPGA与ASIC有什么差异?二者该如何选用?
    猿创征文 | 踉踉跄跄的Java之路
    Node.js安装教程【附安装包资源】
    Map和Set
    以技术创新引领行业发展,飞凌嵌入式获双项省级荣誉
    动态树的第2大值
  • 原文地址:https://blog.csdn.net/pure81/article/details/126785474