当使用带有RequireComponent 的脚本添加到 GameObject 时,所需的组件会自动添加到 GameObject上。例如,脚本中始终需要一个刚体,使用 RequireComponent ,会在这个没有刚体的GameObject上添加刚体组件。
使用脚本生成一个正方形using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class GenerateMesh_1 : MonoBehaviour
{
void Start()
{
Mesh mesh = new Mesh();
MeshFilter filter = GetComponent();
filter.mesh = mesh;
mesh.name = "CS_01";
mesh.vertices = GetVertexs();
mesh.triangles = GetTriangles();
}
private Vector3 [] GetVertexs()
{
return new Vector3[] //记录三角形顶点坐标
{
new Vector3 (0,0,0),
new Vector3 (1,0,0),
new Vector3 (1,1,0),
new Vector3 (0,1,0),
};
}
private int[] GetTriangles()
{
return new int[]
{
0,1,2, //对应Vector3 [] GetVertexs()中数组的下标使三角形按012的顺序生成
0,2,3, //顺时针
};
}
}
uv坐标和顶点的关系
public class GenerateMesh_1 : MonoBehaviour
{
void Start()
{
Mesh mesh = new Mesh();
MeshFilter filter = GetComponent();
filter.mesh = mesh;
mesh.name = "CS_01";
mesh.vertices = GetVertexs();
mesh.triangles = GetTriangles();
mesh.uv = GetUVs();
}
private Vector3 [] GetVertexs()
{
return new Vector3[] //记录三角形顶点坐标
{
new Vector3 (0,0,0),
new Vector3 (1,0,0),
new Vector3 (1,1,0),
new Vector3 (0,1,0),
};
}
private Vector2 [] GetUVs()
{
return new Vector2[]
{
new Vector2 (1,0),
new Vector2 (0,0),
new Vector2 (0,1),
new Vector2 (1,1),
};
}
法向量数组
public class GenerateMesh_1 : MonoBehaviour
{
void Start()
{
Mesh mesh = new Mesh();
MeshFilter filter = GetComponent();
filter.mesh = mesh;
mesh.name = "CS_01";
mesh.vertices = GetVertexs();
mesh.triangles = GetTriangles();
mesh.uv = GetUVs();
mesh.normals = GetNormals();//接受光照需要法向量
}
private Vector3 [] GetVertexs()
{
return new Vector3[] //记录三角形顶点坐标xyz
{
new Vector3 (0,0,0),
new Vector3 (1,0,0),
new Vector3 (1,1,0),
new Vector3 (0,1,0),
};
}
private Vector2 [] GetUVs()//uv
{
return new Vector2[]
{
new Vector2 (1,0),
new Vector2 (0,0),
new Vector2 (0,1),
new Vector2 (1,1),
};
}
private Vector3[] GetNormals()
{
return new Vector3[]
{
Vector3.up,
Vector3.up,
Vector3.up,
Vector3.up,
};
}
切线空间
切线空间有TBN三个分别对应XYZ;
切线空间与UV分别对应TB,N是垂直与UV平面的一个量;
法线贴图之所以是蓝色的原因:颜色空间0-1的一个范围这样就和N的范围相符了,法线方向向量转为颜色空间大概在(0.5,0.5,1),找到调色板,将255*0.5约是128,颜色如下图所示。
可以说切线是四维向量(vector4)其中一个向量用于确定uv是否要反转unity中一般是-1
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class GenerateMesh_1 : MonoBehaviour
{
public Vector4 Tangent;
private Mesh mesh;
void Start()
{
mesh = new Mesh();
MeshFilter filter = GetComponent();
filter.mesh = mesh;
mesh.name = "CS_01";
mesh.vertices = GetVertexs();
mesh.triangles = GetTriangles();
mesh.uv = GetUVs();
mesh.uv2 = GetUV1s();
mesh.normals = GetNormals();//接受光照需要法向量
//mesh.RecalculateNormals();
}
private void Update()
{
mesh.tangents = GetTangent();
}
private Vector4[] GetTangent()
{
return new Vector4[]
{
Tangent ,
Tangent ,
Tangent ,
Tangent ,
};
}
private Vector3 [] GetVertexs()
{
return new Vector3[] //记录三角形顶点坐标
{
new Vector3 (0,0,0),
new Vector3 (1,0,0),
new Vector3 (1,1,0),
new Vector3 (0,1,0),
};
}
private Vector2 [] GetUVs()
{
return new Vector2[]
{
new Vector2 (1,0),
new Vector2 (0,0),
new Vector2 (0,1),
new Vector2 (1,1),
};
}
private Vector2[] GetUV1s()
{
return new Vector2[]
{
new Vector2 (0,0),
new Vector2 (0,0),
new Vector2 (0,0),
new Vector2 (0,0),
};
}
private Vector3[] GetNormals()
{
return new Vector3[]
{
Vector3.right ,
Vector3.right ,
Vector3.right,
Vector3.right,
};
}
private int[] GetTriangles()
{
return new int[]
{
0,1,2, //对应Vector3 [] GetVertexs()中数组的下标使三角形按012的顺序生成
0,2,3, //顺时针
};
}
}
自行赋值观察效果



