本篇讲述的是使用代码来修改的方法,其实unity已经给我们提供了设置的方法:Normals选择Calculate,Smoothing Angle调整为0即可。
这里的内容是在这篇文章的基础上进行的修改:https://blog.csdn.net/final5788/article/details/50574055
原文章中主要是没有提到UV以及骨骼与定点的绑定方法。
由于实现lowpoly的风格其实就是将原来的1个点复制为多个点,所以我们只要在复制定点的过程中将相应的顶点属性一同复制即可。
这里直接给出完整代码:
using UnityEngine;
using UnityEditor;
public class LowPolyTool : MonoBehaviour {
//制作Unity顶部菜单栏
[MenuItem("LowPolyTool/LowPoly")]
static void LowPoly()
{
Transform[] transforms = Selection.transforms;
for (int i = 0; i < transforms.Length; i++){
LowPoly(transforms[i]);
}
}
static void LowPoly(Transform t){
MeshFilter meshFilter = t.GetComponent<MeshFilter>();
Mesh mesh = meshFilter.sharedMesh;
Vector3[] oldVerts = mesh.vertices;//保存当前Mesh顶点
int[] triangles = mesh.triangles;//三角索引数组
Vector2[] olduvs = mesh.uv;
BoneWeight[] oldBoneWeights = mesh.boneWeights;
Vector3[] verts = new Vector3[triangles.Length];//用于保存新的顶点信息
Vector2[] uvs = new Vector2[triangles.Length];//用于保存新的uv信息
BoneWeight[] boneWeights = new BoneWeight[triangles.Length];//用于保存新的骨骼信息
for (int i = 0; i < triangles.Length; i++)
{
verts[i] = oldVerts[triangles[i]];
uvs[i] = olduvs[triangles[i]];
boneWeights[i] = oldBoneWeights[triangles[i]];
triangles[i] = i;
}
mesh.vertices = verts;//更新Mesh顶点
mesh.triangles = triangles;//更新索引
mesh.uv = uvs;//更新uv信息
mesh.boneWeights = boneWeights;//更新骨骼信息
mesh.RecalculateBounds();//重新计算边界
mesh.RecalculateNormals();//重新计算法线
}
}
将脚本放到任意Editor文件夹中,会在菜单栏看到LowPolyTool/LowPoly选贤,将模型文件拖入场景中并选中,点击LowPoly既可。
注意这里会直接修改原模型文件的数据,所以在修改之前请做好备份。
效果:
这里我只是随便找了一个模型,实际上模型的顶点数越少实现出来的效果会越好,就是所谓的低模。