第一步: 创建一个空物体, 给他一个空的MeshFilter组件, 再给一个空的MeshRenderer组件. 最后给MeshRenderer一个贴图材质, 别的不动.
材质Material就是默认材质, 只给他一张图片("原图"), 别的不动.
"真.原图"为: 正方形,方便后面切割, 像素不重要,因为后面是按比例切割.
总之就是一个空物体, 给了2个空组件, 一张图片,
下面要代码创建一个三角面, 并且把图片切出来贴上去
5行代码即可:
效果:
一共4步: 覆盖mesh组件的3个数组(3步), 然后重新计算法线(第4步)
[顶点位置数组]: 所有顶点的相对位置(相对模型本地0,0,0点)比如 {(0,0,0),(1,0,0),(0.5,1,0)}
[UV数组]:[顶点位置数组]的成员, 所对应的(是的,索引一一对应),在贴图上的位置(比例) 比如{(0,0),(1,0),(0.5,1)}
[三角面数组] :以上2个数组的索引, 每3个索引识别为一个三角面. 比如{0,2,1}
这样就可以生成一个底为1, 高为1的三角面, 贴图是从素材图片裁下来一个底为素材底边长度, 高为素材高度的三角形. 这就是最简单的情况, 再复杂就是多加一些数组,比如法线贴图数组
需要注意的事项:
1. 注意到注册三角面数组时, 用的是Unity自己的API, 而且要提供三角面数组和材质索引. 这就是因为有些GameObject有多个材质, 引擎需要知道你提供的三角面是绑定哪个材质的, 然后再根据你提供的其他2个数组的索引, 取得三角面的空间位置信息和材质上的贴图区域.
2. 渲染遵循左手法则, 也就是顺时针提供三角面的点时, 引擎会把面向你绘制为正面. 所以上面我提供的三角面索引是0,2,1 而不能是0,1,2 (如下图, 绿色是其索引). 当然, 只要顺序是顺时针即可, 具体顺序可以随意. 比如提供2,1,0 或者 1,0,2 效果和0,2,1是一样的.
3.引擎创建Collider也是相同的原理, 只不过省略一个UV数组而已. 他的Mesh是GetComponent<MeshCollider>().sharedMesh. 而且因为和材质无关, 其三角面不需要使用API设置, 直接覆盖数组即可.