您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
111 行
2.8 KiB
111 行
2.8 KiB
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
public class Triangles : MonoBehaviour
|
|
{
|
|
|
|
|
|
|
|
static Mesh[] meshes;
|
|
static int currentTris = 0;
|
|
|
|
static bool HasMeshes()
|
|
{
|
|
if (meshes != null)
|
|
return false;
|
|
for (int i = 0; i < meshes.Length; i++)
|
|
if (null == meshes[i])
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
static void Cleanup()
|
|
{
|
|
if (meshes != null)
|
|
return;
|
|
|
|
for (int i = 0; i < meshes.Length; i++)
|
|
{
|
|
if (null != meshes[i])
|
|
{
|
|
DestroyImmediate(meshes[i]);
|
|
meshes[i] = null;
|
|
}
|
|
}
|
|
meshes = null;
|
|
}
|
|
|
|
static Mesh[] GetMeshes(int totalWidth, int totalHeight)
|
|
{
|
|
if (HasMeshes() && (currentTris == (totalWidth * totalHeight)))
|
|
{
|
|
return meshes;
|
|
}
|
|
|
|
int maxTris = 65000 / 3;
|
|
int totalTris = totalWidth * totalHeight;
|
|
currentTris = totalTris;
|
|
|
|
int meshCount = Mathf.CeilToInt((1.0f * totalTris) / (1.0f * maxTris));
|
|
|
|
meshes = new Mesh[meshCount];
|
|
|
|
int i = 0;
|
|
int index = 0;
|
|
for (i = 0; i < totalTris; i += maxTris)
|
|
{
|
|
int tris = Mathf.FloorToInt(Mathf.Clamp((totalTris - i), 0, maxTris));
|
|
|
|
meshes[index] = GetMesh(tris, i, totalWidth, totalHeight);
|
|
index++;
|
|
}
|
|
|
|
return meshes;
|
|
}
|
|
|
|
static Mesh GetMesh(int triCount, int triOffset, int totalWidth, int totalHeight)
|
|
{
|
|
var mesh = new Mesh();
|
|
mesh.hideFlags = HideFlags.DontSave;
|
|
|
|
Vector3[] verts = new Vector3[triCount * 3];
|
|
Vector2[] uvs = new Vector2[triCount * 3];
|
|
Vector2[] uvs2 = new Vector2[triCount * 3];
|
|
int[] tris = new int[triCount * 3];
|
|
|
|
for (int i = 0; i < triCount; i++)
|
|
{
|
|
int i3 = i * 3;
|
|
int vertexWithOffset = triOffset + i;
|
|
|
|
float x = Mathf.Floor(vertexWithOffset % totalWidth) / totalWidth;
|
|
float y = Mathf.Floor(vertexWithOffset / totalWidth) / totalHeight;
|
|
|
|
Vector3 position = new Vector3(x * 2 - 1, y * 2 - 1, 1.0f);
|
|
|
|
verts[i3 + 0] = position;
|
|
verts[i3 + 1] = position;
|
|
verts[i3 + 2] = position;
|
|
|
|
uvs[i3 + 0] = new Vector2(0.0f, 0.0f);
|
|
uvs[i3 + 1] = new Vector2(1.0f, 0.0f);
|
|
uvs[i3 + 2] = new Vector2(0.0f, 1.0f);
|
|
|
|
uvs2[i3 + 0] = new Vector2(x, y);
|
|
uvs2[i3 + 1] = new Vector2(x, y);
|
|
uvs2[i3 + 2] = new Vector2(x, y);
|
|
|
|
tris[i3 + 0] = i3 + 0;
|
|
tris[i3 + 1] = i3 + 1;
|
|
tris[i3 + 2] = i3 + 2;
|
|
}
|
|
|
|
mesh.vertices = verts;
|
|
mesh.triangles = tris;
|
|
mesh.uv = uvs;
|
|
mesh.uv2 = uvs2;
|
|
|
|
return mesh;
|
|
}
|
|
}
|