Unity 代码编写 自定义模型
目录
- Unity 代码编写 自定义模型
- 代码编写 自定义模型(Cube)
- 代码编写 自定义模型(Plane)
代码很简单没有难度, Plane 模块和 Cube 还是有细微的差别的。
这里我就不点透了,自己去发现吧。哈哈哈…
OK 老规矩,直接上代码:
代码编写 自定义模型(Cube)
Cube的 UV 编码好像有点问题,暂时还没找到,等找到我在更新一版吧。
很烦躁 啊啊啊!!!
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 代码编写 自定义模型(Cube)
/// </summary>
public class MeshCube : MonoBehaviour
{
//网格组件
private MeshFilter _MeshFilter;
//渲染组件
private MeshRenderer _MeshRender;
//碰撞组件
private MeshCollider _MeshCollider;
[Header("材质球")]
public Material _Material;
//顶点数据
List<Vector3> _Verts = new List<Vector3>();
//序号列表
List<int> _Indices = new List<int>();
//UV 数据
Vector2[] _Uvs;
void Start()
{
if (GetComponent<MeshFilter>() == null)
{
_MeshFilter = transform.gameObject.AddComponent<MeshFilter>();
}
else
{
_MeshFilter = GetComponent<MeshFilter>();
}
if (GetComponent<MeshRenderer>() == null)
{
_MeshRender = transform.gameObject.AddComponent<MeshRenderer>();
}
else
{
_MeshRender = GetComponent<MeshRenderer>();
}
if (GetComponent<MeshCollider>() == null)
{
_MeshCollider = transform.gameObject.AddComponent<MeshCollider>();
}
else
{
_MeshCollider = GetComponent<MeshCollider>();
}
}
/// <summary>
/// 网格渲染
/// </summary>
public void BuildCube()
{
//顶点信息
_Verts.Add(new Vector3(0, 0, 0));
_Verts.Add(new Vector3(1, 0, 0));
_Verts.Add(new Vector3(1, 0, 1));
_Verts.Add(new Vector3(0, 0, 1));
_Verts.Add(new Vector3(0, 1, 0));
_Verts.Add(new Vector3(1, 1, 0));
_Verts.Add(new Vector3(1, 1, 1));
_Verts.Add(new Vector3(0, 1, 1));
//底
_Indices.Add(0);
_Indices.Add(1);
_Indices.Add(2);
_Indices.Add(0);
_Indices.Add(2);
_Indices.Add(3);
//顶
_Indices.Add(4);
_Indices.Add(7);
_Indices.Add(6);
_Indices.Add(4);
_Indices.Add(6);
_Indices.Add(5);
//前
_Indices.Add(2);
_Indices.Add(6);
_Indices.Add(3);
_Indices.Add(3);
_Indices.Add(6);
_Indices.Add(7);
//后
_Indices.Add(0);
_Indices.Add(5);
_Indices.Add(1);
_Indices.Add(0);
_Indices.Add(4);
_Indices.Add(5);
//左
_Indices.Add(0);
_Indices.Add(7);
_Indices.Add(4);
_Indices.Add(0);
_Indices.Add(3);
_Indices.Add(7);
//右
_Indices.Add(1);
_Indices.Add(5);
_Indices.Add(2);
_Indices.Add(5);
_Indices.Add(6);
_Indices.Add(2);
#region -----
顶点UV 构建 Cube为例子 Cube由8个顶点构成
_Uvs = new Vector2[_Verts.Count];
//_Uvs[0] = new Vector2(0, 0);
//_Uvs[1] = new Vector2(1, 0);
//_Uvs[2] = new Vector2(1, 1);
//_Uvs[3] = new Vector2(0, 1);
//_Uvs[4] = new Vector2(0, 0);
//_Uvs[5] = new Vector2(1, 0);
//_Uvs[6] = new Vector2(1, 1);
//_Uvs[7] = new Vector2(0, 1);
//_Uvs[0] = new Vector2(0, 0);
//_Uvs[1] = new Vector2(1, 0);
//_Uvs[2] = new Vector2(1, 1);
//_Uvs[3] = new Vector2(0, 0);
//_Uvs[4] = new Vector2(0, 1);
//_Uvs[5] = new Vector2(1, 1);
//_Uvs[6] = new Vector2(1, 1);
//_Uvs[7] = new Vector2(0, 1);
For 循环编辑 UV
//for (int i = 0; i < _Verts.Count;)
//{
// // _Mesh.vertices 注解: 返回顶点位置的副本或分配新的顶点位置数组。
// if (_Mesh.vertices[i].x == _Mesh.vertices[i + 1].x && _Mesh.vertices[i].x == _Mesh.vertices[i + 2].x)
// {
// _Uvs[i] = new Vector2(_Mesh.vertices[i].y, _Mesh.vertices[i].z);
// _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].y, _Mesh.vertices[i + 1].z);
// _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].y, _Mesh.vertices[i + 2].z);
// }
// else if (_Mesh.vertices[i].y == _Mesh.vertices[i + 1].y && _Mesh.vertices[i].y == _Mesh.vertices[i + 2].y)
// {
// _Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].z);
// _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].z);
// _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].z);
// }
// else if (_Mesh.vertices[i].z == _Mesh.vertices[i + 1].z && _Mesh.vertices[i].z == _Mesh.vertices[i + 2].z)
// {
// _Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].y);
// _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].y);
// _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].y);
// }
// else
// {
// _Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].y);
// _Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].y);
// _Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].y);
// }
// i += 3;
//}
#endregion
}
/// <summary>
/// 数据清除
/// </summary>
private void CleraMeshData()
{
_Verts.Clear();
_Indices.Clear();
BuildCube();
}
/// <summary>
/// 数据生成
/// </summary>
private void Generate()
{
//数据清除
CleraMeshData();
//Mesh构建以及渲染
//构造Mesh对象
Mesh _Mesh = new Mesh();
//返回顶点位置的副本或分配新的顶点位置数组。
_Mesh.vertices = _Verts.ToArray();
//网格中包含所有三角形的数组
_Mesh.triangles = _Indices.ToArray();
//For 循环编辑 UV
for (int i = 0; i < _Verts.Count;)
{
// _Mesh.vertices 注解: 返回顶点位置的副本或分配新的顶点位置数组。
if (_Mesh.vertices[i].x == _Mesh.vertices[i + 1].x && _Mesh.vertices[i].x == _Mesh.vertices[i + 2].x)
{
_Uvs[i] = new Vector2(_Mesh.vertices[i].y, _Mesh.vertices[i].z);
_Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].y, _Mesh.vertices[i + 1].z);
_Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].y, _Mesh.vertices[i + 2].z);
_Uvs[i + 3] = new Vector2(_Mesh.vertices[i + 3].y, _Mesh.vertices[i + 3].z);
}
else if (_Mesh.vertices[i].y == _Mesh.vertices[i + 1].y && _Mesh.vertices[i].y == _Mesh.vertices[i + 2].y)
{
_Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].z);
_Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].z);
_Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].z);
_Uvs[i + 3] = new Vector2(_Mesh.vertices[i + 3].x, _Mesh.vertices[i + 3].z);
}
else if (_Mesh.vertices[i].z == _Mesh.vertices[i + 1].z && _Mesh.vertices[i].z == _Mesh.vertices[i + 2].z)
{
_Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].y);
_Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].y);
_Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].y);
_Uvs[i + 3] = new Vector2(_Mesh.vertices[i + 3].x, _Mesh.vertices[i + 3].y);
}
else
{
_Uvs[i] = new Vector2(_Mesh.vertices[i].x, _Mesh.vertices[i].y);
_Uvs[i + 1] = new Vector2(_Mesh.vertices[i + 1].x, _Mesh.vertices[i + 1].y);
_Uvs[i + 2] = new Vector2(_Mesh.vertices[i + 2].x, _Mesh.vertices[i + 2].y);
_Uvs[i + 3] = new Vector2(_Mesh.vertices[i + 3].x, _Mesh.vertices[i + 3].y);
}
i += 4;
}
//网格的基本纹理坐标
_Mesh.uv = _Uvs;
//从顶点重新计算网格的边界体积。
_Mesh.RecalculateBounds();
//从三角形和顶点重新计算网格的法线
_Mesh.RecalculateNormals();
//网格赋予
_MeshFilter.mesh = _Mesh;
//材质球赋予
_MeshRender.material = _Material;
//碰撞体添加
_MeshCollider.sharedMesh = _Mesh;
print(_Mesh.vertices[_int].x);
}
public int _int;
private void Update()
{
Generate();
}
}
代码编写 自定义模型(Plane)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 代码编写 自定义模型(Plane)
/// </summary>
public class MeshPlane_ZH : MonoBehaviour
{
//网格组件
private MeshFilter _MeshFilter;
//渲染组件
private MeshRenderer _MeshRender;
//碰撞组件
private MeshCollider _MeshCollider;
//顶点数据 数组
private List<Vector3> _Verts;
private List<int> _Indices;
[Header("网格渲染行")]
public int _Row = 2;
[Header("网格渲染列")]
public int _Line = 2;
[Header("网格间距")]
public float _Width = 0.1f;
[Header("网格高度")]
public float _Height = 0.0f;
[Header("材质球")]
public Material _Material;
private Vector2[] _UV;
void Start()
{
_Verts = new List<Vector3>();
_Indices = new List<int>();
if (GetComponent<MeshFilter>() == null)
{
_MeshFilter = transform.gameObject.AddComponent<MeshFilter>();
}
else
{
_MeshFilter = GetComponent<MeshFilter>();
}
if (GetComponent<MeshRenderer>() == null)
{
_MeshRender = transform.gameObject.AddComponent<MeshRenderer>();
}
else
{
_MeshRender = GetComponent<MeshRenderer>();
}
if (GetComponent<MeshCollider>() == null)
{
_MeshCollider = transform.gameObject.AddComponent<MeshCollider>();
}
else
{
_MeshCollider = GetComponent<MeshCollider>();
}
Generate();
}
/// <summary>
/// 数据生成
/// </summary>
private void Generate()
{
//数据清除
CleraMeshData();
//数据填充
AddMeshData();
//数据传递给 Mesh 生成网格数据
//构造Mesh对象
Mesh _Mesh = new Mesh();
//顶点数据加载读取
_Mesh.vertices = _Verts.ToArray();
//渲染序列加载读取
_Mesh.triangles = _Indices.ToArray();
//UV数据加载读取
_Mesh.uv = _UV;
//从顶点重新计算网格的边界体积。
_Mesh.RecalculateNormals();
//从三角形和顶点重新计算网格的法线
_Mesh.RecalculateBounds();
//网格数据加载
_MeshFilter.mesh = _Mesh;
//碰撞体添加
_MeshCollider.sharedMesh = _Mesh;
//材质球赋予
_MeshRender.material = _Material;
}
/// <summary>
/// 数据清除
/// </summary>
private void CleraMeshData()
{
_Verts.Clear();
_Indices.Clear();
}
/// <summary>
/// 数据填充
/// </summary>
private void AddMeshData()
{
//顶点赋值
for (int z = 0; z < _Line; z++)
{
for (int x = 0; x < _Row; x++)
{
//每个顶点的坐标
Vector3 p = new Vector3(x, _Height, z) * _Width;
_Verts.Add(p);
}
}
//三角面渲染 排除最后一行和最后一列
for (int z = 0; z < _Line - 1; z++)
{
for (int x = 0; x < _Row - 1; x++)
{
//三角面渲染
int _Index0 = z * _Row + x; //左下角 0
int _Index1 = z * _Row + x + 1; //右下角 1
int _Index2 = (z + 1) * _Row + x + 1; //右上角 2
int _Index3 = (z + 1) * _Row + x; //左上角 3
//存储渲染序列
_Indices.Add(_Index0); _Indices.Add(_Index3); _Indices.Add(_Index2); //渲染第一个三角面 0 3 2
_Indices.Add(_Index0); _Indices.Add(_Index2); _Indices.Add(_Index1); //渲染第二个三角面 0 2 1
}
}
//UV参数设置
_UV = new Vector2[4];
_UV[0] = new Vector2(0, 0);
_UV[1] = new Vector2(0, 1);
_UV[2] = new Vector2(1, 1);
_UV[3] = new Vector2(1, 0);
}
}