详解Unity中的网格碰撞器Mesh Collider
Posted 梦小天幼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解Unity中的网格碰撞器Mesh Collider相关的知识,希望对你有一定的参考价值。
前言
碰撞体组件定义了物体的物理性状,Unity中有一系列基本碰撞体,我们可以使用它们组合成任意形状,但除了基本碰撞体之外,Untiy还提供了诸如网格(Mesh)、车轮(Wheel)、地形(Terrain)等碰撞器,它们分别用于轮胎功能的实现、复杂网格的碰撞、地理环境的碰撞,今天就简要介绍一下网格碰撞器的简单使用。
目录
前排提醒:本文仅代表个人观点,以供交流学习,若有不同意见请评论留言,笔者一定好好学习,天天向上。
阅读此文章时,若有不理解的地方,推荐观看本文列出的参考资料来对照阅读。
阅读本篇前,请先了解“刚体和碰撞体”相关知识。
Unity版本[2019.4.10f1] 梦小天幼 & 禁止转载
一、网格(Mesh)碰撞器
一般情况下,使用基本碰撞体如正方体、圆柱体等的组合,足够模拟出百分之99的形状了,但是在游戏中,有些比较重要的角色或场景物体,需要特别精细的碰撞,这个时候使用网格碰撞体来构建物体的碰撞便是不二之选了。网格碰撞体的本质就是引用网格来计算碰撞。
这里说明一下网格(Mesh)和模型(Model)的区别:
网格:包含定义了3D对象形状的顶点信息,也就是模型的形状
模型:材质+动画+纹理+着色器+网格 = 模型
这里说的不够严谨,但我词穷了,烦请谅解。
下面我们实际操作一下,一个模型从创建到导入到Unity并添加网格碰撞器的整个过程
1.FBX模型导入到Unity中并作为网格碰撞器使用
这里我们选用Blender3.1来制作模型,首先打开Blender,然后经过…的操作,我们就创建好了这样的一个简单模型,并设置了一个简单的材质,然后导出为FBX格式,直接拖到Unity的Assets中
我们可以看到,导入后的FBX文件有了两个子文件,MM1和TestMode,它们分别是材质和网格,当它们俩组合到一起,就可以叫做模型。我们再把导入的模型资源拖到场景中。
我们可以看到,初次导入的模型资源只有基本的Transfrom、Mesh Filter、Mesh Renderer组件,还没有Collider,所以我们为它加上Mesh Collider
此刻就大功告成了,下面简要说一下剩余参数的作用。
2.Mesh Collider参数
1.Convex
这里官方的解释是选中后将使Mesh Collider与其他的Mesh Collider发生碰撞,说实话我没看明白啥意思。
下面我用两张图解释一下,第一张未勾选Convex,第二张勾选Convex
相信这里大家应该能看出差别了,未勾选则表示这个模型按照网格计算碰撞,勾选了则表示Unity会自动将网格凹凸不平的部分填平。
勾选肯定节省资源的,且勾选之后Is Trigger选项也能使用了,但是你勾选这个倒不如用圆柱体碰撞器来模拟碰撞了,个人看情况使用吧。
2.Cooking Options
物理引擎以何种方式处理这个网格(给出了六个选项)
- None 禁用所有选项
- Everything 启用所有选项
- Cook for Faster Simulation 更快的模拟
- Enable Mesh Cleaning 启用网格清理
- Weld Colocated Vertices 合并具有相同位置的顶点
- Use Fast Midphase 使用更快速的算法
默认是多选了后四项,说实话,我并不是很懂这些(好吧是一窍不通),不多说了,免得误人子弟。
3.Physic Material
这个选项用于模拟物体表面的物理材质,对于地面而言,比如冰面、木板、水泥板这些。对于物体本身而言,比如物理自身的弹性,物理自身的平滑度之类的,都会直接影响到物理模拟的效果。
物理材质相关的可以看我“详解刚体与碰撞器”文章中的2.3节,我已经写的很明白了,这里不多赘述。
4.Mesh
引用需要用于碰撞的网格,不多解释了,1.1说的很清楚了
二、总结和参考资料
1.总结
- 本来我想着用一篇把网格、车轮和地形都说完,但是接触车轮之后才发现东西太多太多了,所以决定分成三篇来讲,所以这篇就稍微短了一点点。
- 需要注意的点:
- 网格:包含定义了3D对象形状的顶点信息
- 模型:材质+动画+纹理+着色器+网格 = 模型
- Mesh Collider的Convex参数
- 用于设置是否填补中空
- FBX导入Unity中,会有一个材质和网格,他俩组合起来,就叫模型(后续也开新坑讲讲各种格式导入Unity的操作)
2.参考资料
[1].Unity官方.Unity网格碰撞体
[2].枕流爱玩游戏&lzh0913hangUnity3d 中MeshCollider组件下convex勾选有什么用?(百度知道)
Unity如何在另一个对象上发生碰撞时关闭游戏对象的Mesh Collider?
【中文标题】Unity如何在另一个对象上发生碰撞时关闭游戏对象的Mesh Collider?【英文标题】:Unity How to turn off a gameObject's Mesh Collider when a collison on another object is done? 【发布时间】:2018-08-23 10:08:17 【问题描述】:在我的统一项目中,我遇到了一个问题,我想与一个对象发生碰撞,然后我想打开另一个游戏对象的网格碰撞器,这是我现在的代码......
#pragma strict
private var objManager : ObjectiveManager;
private var ob2 : MeshCollider;
function Start()
objManager = GameObject.Find("3rdPersonController").GetComponent(ObjectiveManager);
ob2 = GameObject.Find("Objective2").GetComponent(MeshCollider);
function OnTriggerEnter(other : Collider)
if(other.gameObject.tag == "3rdPersonController")
ob2.enabled = true;
Debug.Log("whooop");
Destroy(gameObject);
objManager.objective1 = true;
objManager.objective2 = false;
objManager.objective3 = false;
objManager.objective4 = false;
objManager.objective5 = false;
objManager.objective6 = false;
objManager.objective7 = false;
objManager.objective8 = false;
objManager.objective9 = false;
objManager.objective10 = false;
objManager.objective11 = false;
objManager.objective12 = false;
【问题讨论】:
天哪,谢谢兄弟 对不起,我删除了我的评论。大括号是解决问题的方法吗? 是的,if 语句甚至没有做任何事情,它就在那里,哈哈 【参考方案1】:只是将其发布为答案,以便可以将其关闭。
这里的问题是你的 If 语句没有花括号,导致它后面的代码不管布尔值如何计算都会运行。
【讨论】:
以上是关于详解Unity中的网格碰撞器Mesh Collider的主要内容,如果未能解决你的问题,请参考以下文章
如何创建自己的 Raycast 组件,它不需要碰撞器,但在 C# Unity3D 中支持 Skinned Mesh Renderer?