新增shader控制
Shader "Custom/Vertrix"
{
Properties{
}
SubShader{
Pass {
ColorMaterial AmbientAndDiffuse
}
}
}
创建材质
- Create > Material
- 将新的材质命名为CubeMaterial
- 将材质的shader更改为上一步所创建的Custom/Vertrix
新建Cube
- 新建:3D Object -> Cube,命名为TestCube
- 将上一步创建的材质CubeMaterial拖动到TestCube上
新建脚本ColorScript用来控制cube各个面的颜色
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ColorScript : MonoBehaviour
{
public Color[] all_colors;
private Mesh mesh;
void Start()
{
if (all_colors == null || all_colors.Length <= 0)
all_colors = new Color[] { Color.red };
MeshFilter mf = GetComponent<MeshFilter>();
if (mf == null) return;
mesh = MakeCube(1.0f);
mf.mesh = mesh;
MeshCollider mc = GetComponent<MeshCollider>();
if (mc != null)
mc.sharedMesh = mesh;
}
public void ChangeColor(int iTriangle)
{
Color colorT = new Color(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), 1.0f);
Color[] colors = mesh.colors;
int iStart = mesh.triangles[iTriangle * 3];
for (int i = iStart; i < iStart + 4; i++)
colors[i] = colorT;
mesh.colors = colors;
}
Mesh MakeCube(float fSize)
{
float fHS = fSize / 2.0f;
Mesh mesh = new Mesh();
mesh.vertices = new Vector3[] {
new Vector3(-fHS, fHS, -fHS), new Vector3( fHS, fHS, -fHS), new Vector3( fHS, -fHS, -fHS), new Vector3(-fHS, -fHS, -fHS),
new Vector3(-fHS, fHS, fHS), new Vector3( fHS, fHS, fHS), new Vector3( fHS, fHS, -fHS), new Vector3(-fHS, fHS, -fHS),
new Vector3(-fHS, -fHS, fHS), new Vector3( fHS, -fHS, fHS), new Vector3( fHS, fHS, fHS), new Vector3(-fHS, fHS, fHS),
new Vector3(-fHS, -fHS, -fHS), new Vector3( fHS, -fHS, -fHS), new Vector3( fHS, -fHS, fHS), new Vector3(-fHS, -fHS, fHS),
new Vector3(-fHS, fHS, fHS), new Vector3(-fHS, fHS, -fHS), new Vector3(-fHS, -fHS, -fHS), new Vector3(-fHS, -fHS, fHS),
new Vector3( fHS, fHS, -fHS), new Vector3( fHS, fHS, fHS), new Vector3( fHS, -fHS, fHS), new Vector3( fHS, -fHS, -fHS)};
int[] triangles = new int[mesh.vertices.Length / 4 * 2 * 3];
int iPos = 0;
for (int i = 0; i < mesh.vertices.Length; i = i + 4)
{
triangles[iPos++] = i;
triangles[iPos++] = i + 1;
triangles[iPos++] = i + 2;
triangles[iPos++] = i;
triangles[iPos++] = i + 2;
triangles[iPos++] = i + 3;
}
mesh.triangles = triangles;
int color_index = -1;
Color colorT = Color.red;
Color[] colors = new Color[mesh.vertices.Length];
Debug.Log("test:size=" + all_colors.Length);
for (int i = 0; i < colors.Length; i++)
{
if ((i % 4) == 0)
{
color_index++;
colorT = new Color(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), 1.0f);
}
color_index = color_index % all_colors.Length;
colors[i] = all_colors[color_index];
colors[i].a = 1.0f;
}
mesh.colors = colors;
mesh.RecalculateNormals();
return mesh;
}
}
最后
- 将脚本ColorScript拖动到TestCube上
- 如图,依次设置六个面的颜色
![Unity cube 不同面设置不同颜色_第1张图片](http://img.e-com-net.com/image/info8/a3e40fbf9a7647ebbd87b54f1f0cb43c.jpg)
- 点击Play运行查看结果,如图所示
![Unity cube 不同面设置不同颜色_第2张图片](http://img.e-com-net.com/image/info8/5a7cc872cc3f42a1ad561a896b3982e0.jpg)