大家好,小弟又来了,
接着上一篇的分享,下面我们先来绘制一个三角形
直接上代码了
using UnityEngine;
using System.Collections;
public class ski : MonoBehaviour {
private MeshFilter mesfilter;
void Start ()
{
//既然我们用到Mesh,那么首先我们就应该先获得到Mesh实例
//mesfilter = GetComponent<MeshFilter> ();
// Mesh mesh = mesfilter.mesh;
//三角形顶点坐标数组
Vector3[] vertices = new Vector3[3];
//三角形的顶点坐标
vertices[0] = new Vector3(0,0,0);
vertices[1] = new Vector3(0,1,0);
vertices[2] = new Vector3(1,0,0);
//三角形顶点数组ID
int[] triangles = new int[3];
triangles[0] = 0;
triangles[1] = 1;
triangles[2] = 2;
//走到这里的时候会重新为网络模型创建MeshFilter赋值的
// mesh.vertices = vertices;
// mesh.triangles = triangles;
}
// Update is called once per frame
void Update () {
}
}
大家可以创建一个空的游戏对象然后添加脚本,给这个对象添加一个材质
大家可以看到
那么怎么样创建一个材质呢,
在Assets文件夹下导入一张导入一张看起来有层次的图片,在Project视图下右键新建一个材质球(Material),选中材质球(就是上图右下角select(选择),然后选择我们刚刚导入的图片)
ok 赶紧去试试吧
接下来就是重要的代码啦
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
[AddComponentMenu("Ace/Skill/Mask")]
public class MyMask : MonoBehaviour {
private MeshFilter meshFilter;
private Vector3[] verts = new Vector3[10];
private float halfWidth = 0.5f;
private float halfHeight = 0.5f;
private float start;//开始时间
private float total;//技能冷却时间
private float once;
public Color color;
private bool play = false;
void Start () {
meshFilter=GetComponent<MeshFilter>();
meshFilter.sharedMesh = new Mesh();
ResetVertices();
SetMeshVertices(meshFilter.sharedMesh);
setTriangles(meshFilter.sharedMesh);
setColor(meshFilter.sharedMesh);
startMovice(30);
}
void OnMouseUp() {
startMovice(60);
}
public void startMovice(float time) {
if (play) return;
total = time;
once = total / 8;//这里用8个三角形 总时间算出每个三角形需要耗时
renderer.enabled = true;//每次开始让描绘对象可见
ResetVertices();//每次开始重置顶点数据
play = true;
}
private void ResetVertices()
{
verts[0] = new Vector3(0.0f, 0.0f, 0.0f);
verts[1] = new Vector3(0.0f, halfHeight, 0.0f);
verts[2] = new Vector3(halfWidth, halfHeight, 0.0f);
verts[3] = new Vector3(halfWidth, 0.0f, 0.0f);
verts[4] = new Vector3(halfWidth, -halfHeight, 0.0f);
verts[5] = new Vector3(0.0f, -halfHeight, 0.0f);
verts[6] = new Vector3(-halfWidth, -halfHeight, 0.0f);
verts[7] = new Vector3(-halfWidth, 0.0f, 0.0f);
verts[8] = new Vector3(-halfWidth, halfHeight, 0.0f);
verts[9] = new Vector3(0.0f, halfHeight, 0.0f);
}
// 设置Mesh顶点数据
private void SetMeshVertices(Mesh mesh)
{
Vector3[] vertices = new Vector3[verts.Length];
for (int i = 0; i < verts.Length; ++i)
{
vertices[i] = verts[i];
}
mesh.vertices = vertices;
}
private void setColor(Mesh mesh)
{
Color[] colors = new Color[mesh.vertices.Length];
for (int i = 0; i < colors.Length; ++i)
{
colors[i] = color;
}
mesh.colors = colors;
}
private void setTriangles(Mesh mesh)
{
mesh.triangles = new int[]{
0,1,2,
0,2,3,
0,3,4,
0,4,5,
0,5,6,
0,6,7,
0,7,8,
0,8,9
};
}
// Update is called once per frame
void FixedUpdate()
{
if (!play) return;
UpdateEffect(meshFilter.sharedMesh);
}
public void UpdateEffect(Mesh mesh)
{
float now = Time.time - start;
if (now >=total) { renderer.enabled = false; return; }
// 更新顶点数据
Vector3[] vertices = mesh.vertices;
float percent = (now % once) / once; // 每个三角面遮罩的百分比
int index = (int)(now / once) + 1; // 当前修改的顶点索引
for (int i = index; i >0; --i)
{
switch (index)
{
case 1:
vertices[i].x = halfWidth * percent;
break;
case 2:
vertices[i].y = halfHeight - halfHeight * percent;
break;
case 3:
vertices[i].y = -halfHeight * percent;
break;
case 4:
vertices[i].x = halfWidth * (1 - percent);
break;
case 5:
vertices[i].x = -halfWidth * percent;
break;
case 6:
vertices[i].y = -halfHeight * (1 - percent);
break;
case 7:
vertices[i].y = halfHeight * percent;
break;
case 8:
vertices[i].x = -halfWidth + halfWidth * percent;
break;
}
}
mesh.vertices = vertices;
}
}
直接把大神的代码复制过来研究了一下,嘎嘎,大家可以先看看,
下一遍 使用NGUI来做技能的cd 嘻嘻 感谢大家