我在這里是因為我的專案有問題。
其實我想創建一個名為體素的單色立方體。我創建了 6 個四邊形來構建一個立方體,結果如下:
我神奇的立方體,沒有紋理或顏色
在這個創建程序中,我用mesh.color 給我的quad 一個顏色。但是不影響quad顏色,也不取顏色。
我嘗試按照以下檔案了解網格顏色:
https://docs.unity3d.com/ScriptReference/Mesh-colors.html
https://docs.unity3d.com/ScriptReference/Mesh-colors32.html
所以我的問題是:如何在我的網格上使用 color 或 color32 來創建一個帶有顏色的立方體?
你可以在這里查看我的代碼:
public class World : MonoBehaviour
{
enum Cubeside { Bottom, Top, Left, Right, Front, Back };
//public void SetColors(List<Color32> inColors);
public float quadSize = 0.5f;
private int id;
// Red , Green , Blue
private List<int> RGBColor;
private float Opacity;
//public Color32[] VoxelColors = new Color32[] { new Color32(255, 105, 205, 225)};
//public Color32 VoxelColors = new Color32(255, 105, 205, 225);
public Color[] VoxelColorsSimple;
/// <summary>
/// Permet de créer une face du cube
/// </summary>
/// <param name="side">Définie le coté que l'on doit créer</param>
/// <returns>Aucun return</returns>
void CreateQuad(Cubeside side)
{
int colorRed = 255;
int ColorGreen = 105;
int ColorBlue = 205;
Color32 C32Red = new Color32(255, 0, 0, 255);
Color CRed = new Color(1f, 0f, 0f, 1f);
Color32[] VoxelColors = new Color32[] { C32Red };
Color mycolor = Color.red;
Mesh mesh = new Mesh();
mesh.name = "ScriptedMesh";
Vector3[] vertices = new Vector3[4];
Vector3[] normals = new Vector3[4];
int[] triangles = new int[6];
//all possible vertices
//Positionnement des 8 vertices nécessaire à notre cube ( les 8 cotés du cube )
Vector3 p0 = new Vector3(-quadSize, -quadSize, quadSize);
Vector3 p1 = new Vector3(quadSize, -quadSize, quadSize);
Vector3 p2 = new Vector3(quadSize, -quadSize, -quadSize);
Vector3 p3 = new Vector3(-quadSize, -quadSize, -quadSize);
Vector3 p4 = new Vector3(-quadSize, quadSize, quadSize);
Vector3 p5 = new Vector3(quadSize, quadSize, quadSize);
Vector3 p6 = new Vector3(quadSize, quadSize, -quadSize);
Vector3 p7 = new Vector3(-quadSize, quadSize, -quadSize);
// ------ . ------ ------ ------ . ------
//|`. | `. |\ |\ | | /| /| .' | .'|
//| ` -- --- | ---- - ------ - ---- | --- -- ' |
//| | | | | | | | | | | | | | | | | |
// --- -- . | - ---- | ------ | ---- - | . -- ---
// `. | `.| \| \| | | |/ |/ |.' | .'
// ` ------ ------ ------ ------ ------ '
//Création des différents carré à partir de 2 triangle rectangle
switch(side)
{
case Cubeside.Front :
//Nous prenons 4 coté du cube
vertices = new Vector3[] { p4, p5, p1, p0 };
//nous rajoutons des normals avec la direction
normals = new Vector3[] { Vector3.forward, Vector3.forward, Vector3.forward, Vector3.forward };
//Nous créons les triangles sur la face du cube 3 1 0 étant en haut à droite et 3 2 1 en bas à gauche
triangles = new int[] { 3, 1, 0, 3, 2, 1 };
break;
case Cubeside.Bottom :
vertices = new Vector3[] { p0, p1, p2, p3 };
normals = new Vector3[] { Vector3.down, Vector3.down, Vector3.down, Vector3.down };
triangles = new int[] { 3, 1, 0, 3, 2, 1 };
break;
case Cubeside.Top:
vertices = new Vector3[] { p7, p6, p5, p4 };
normals = new Vector3[] { Vector3.up, Vector3.up, Vector3.up, Vector3.up };
triangles = new int[] { 3, 1, 0, 3, 2, 1 };
break;
case Cubeside.Left:
vertices = new Vector3[] { p7, p4, p0, p3 };
normals = new Vector3[] { Vector3.left, Vector3.left, Vector3.left, Vector3.left };
triangles = new int[] { 3, 1, 0, 3, 2, 1 };
break;
case Cubeside.Right:
vertices = new Vector3[] { p5, p6, p2, p1 };
normals = new Vector3[] { Vector3.right, Vector3.right, Vector3.right, Vector3.right };
triangles = new int[] { 3, 1, 0, 3, 2, 1 };
break;
case Cubeside.Back:
vertices = new Vector3[] { p6, p7, p3, p2 };
normals = new Vector3[] { Vector3.back, Vector3.back, Vector3.back, Vector3.back };
triangles = new int[] { 3, 1, 0, 3, 2, 1 };
break;
}
mesh.vertices = vertices;
mesh.normals = normals;
mesh.triangles = triangles;
Color[] tempColor = new Color[mesh.vertices.Length];
for ( int cpt = 0; cpt < mesh.vertices.Length; cpt )
{
tempColor[cpt] = Color.red;
}
VoxelColorsSimple = tempColor;
mesh.colors = VoxelColorsSimple;
GameObject quad = new GameObject("quad");
quad.transform.parent = this.gameObject.transform;
MeshFilter meshFilter = (MeshFilter)quad.AddComponent(typeof(MeshFilter));
meshFilter.mesh = mesh;
MeshRenderer renderer = quad.AddComponent(typeof(MeshRenderer)) as MeshRenderer;
/* //I don't want to use material
Material mat = Resources.Load("VoxelMaterial") as Material;
renderer.material = mat;*/
}
// Use this for initialization
void Start()
{
CreateQuad(Cubeside.Front);
CreateQuad(Cubeside.Bottom);
CreateQuad(Cubeside.Top);
CreateQuad(Cubeside.Left);
CreateQuad(Cubeside.Right);
CreateQuad(Cubeside.Back);
}
// Update is called once per frame
void Update()
{
}
}
這個腳本在這里鏈接到我的空物件“世界”:
我的專案的層次結構
感謝您的回答。
uj5u.com熱心網友回復:
如果沒有著色器來處理頂點顏色,Unity 不知道如何處理它們,而 Unity 使用網格的材質來確定使用哪個著色器。
因此,您需要使用適合您需求的著色器為網格渲染器分配材質。
您可以撰寫自己的著色器,使用頂點顏色并將其分配給您的材質,或者您可以使用已經執行此操作的內置著色器,例如默認或漫反射精靈著色器。
如果您撰寫自己的著色器,您可以撰寫一個不使用紋理而僅使用頂點顏色來確定反照率以及其他自定義設定的著色器。
不管你決定創建你的著色器和材質,一旦你有了你的材質,你就可以在你的 中添加一個[SerializeField] voxelMat;
欄位World
,在檢查器中將你的材質分配給它,然后使用renderer.material = voxelMat;
來分配它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/365048.html
下一篇:如何獲取陣列中每個物件的屬性?