using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pyramis : MonoBehaviour
{
public Material mat;
public float angle1=120.0f;
public float angle2 = 90.0f;
public float height = 5.0f;
MeshFilter _meshFilter;
// Start is called before the first frame update
void Start()
{
GenMesh();
}
private void Update()
{
if(Time.frameCount % 10 == 0)
{
float halfAngle1 = 0.5f * angle1;
float halfAngle2 = 0.5f * angle2;
Vector3 ptRectCenter = transform.position - transform.up * height;
Vector3 ptRightForward = ptRectCenter + Mathf.Tan(halfAngle1 * Mathf.Deg2Rad) * height * transform.right + Mathf.Tan(halfAngle2 * Mathf.Deg2Rad) * height * transform.forward;
Vector3 ptRightBack = ptRectCenter + Mathf.Tan(halfAngle1 * Mathf.Deg2Rad) * height * transform.right - Mathf.Tan(halfAngle2 * Mathf.Deg2Rad) * height * transform.forward;
Vector3 ptLeftBack = ptRectCenter - Mathf.Tan(halfAngle1 * Mathf.Deg2Rad) * height * transform.right - Mathf.Tan(halfAngle2 * Mathf.Deg2Rad) * height * transform.forward;
Vector3 ptLeftForward = ptRectCenter - Mathf.Tan(halfAngle1 * Mathf.Deg2Rad) * height * transform.right + Mathf.Tan(halfAngle2 * Mathf.Deg2Rad) * height * transform.forward;
Vector3[] ptVectexs = new Vector3[10];
ptVectexs[0] = transform.position;
ptVectexs[1] = transform.position;
ptVectexs[2] = transform.position;
ptVectexs[3] = transform.position;
ptVectexs[4] = transform.position;
ptVectexs[5] = ptRightForward;
ptVectexs[6] = ptRightBack;
ptVectexs[7] = ptLeftBack;
ptVectexs[8] = ptLeftForward;
ptVectexs[9] = ptLeftForward;
_meshFilter.mesh.vertices = ptVectexs;
_meshFilter.mesh.RecalculateNormals();
_meshFilter.mesh.RecalculateBounds();
}
}
void GenMesh()
{
float halfAngle1 = 0.5f * angle1;
float halfAngle2 = 0.5f * angle2;
Vector3 ptRectCenter = transform.position - transform.up * height;
Vector3 ptRightForward = ptRectCenter + Mathf.Tan(halfAngle1 * Mathf.Deg2Rad) * height * transform.right + Mathf.Tan(halfAngle2 * Mathf.Deg2Rad) * height * transform.forward;
Vector3 ptRightBack = ptRectCenter + Mathf.Tan(halfAngle1 * Mathf.Deg2Rad) * height * transform.right - Mathf.Tan(halfAngle2 * Mathf.Deg2Rad) * height * transform.forward;
Vector3 ptLeftBack = ptRectCenter - Mathf.Tan(halfAngle1 * Mathf.Deg2Rad) * height * transform.right - Mathf.Tan(halfAngle2 * Mathf.Deg2Rad) * height * transform.forward;
Vector3 ptLeftForward = ptRectCenter - Mathf.Tan(halfAngle1 * Mathf.Deg2Rad) * height * transform.right + Mathf.Tan(halfAngle2 * Mathf.Deg2Rad) * height * transform.forward;
//UV
Vector2[] uv1s = new Vector2[10];
//生成顶点
Vector3[] ptVectexs = new Vector3[10];
ptVectexs[0] = transform.position;
ptVectexs[1] = transform.position;
ptVectexs[2] = transform.position;
ptVectexs[3] = transform.position;
ptVectexs[4] = transform.position;
ptVectexs[5] = ptRightForward;
ptVectexs[6] = ptRightBack;
ptVectexs[7] = ptLeftBack;
ptVectexs[8] = ptLeftForward;
ptVectexs[9] = ptLeftForward;
uv1s[0] = new Vector2(0.0f, 1f);
uv1s[1] = new Vector2(0.25f, 1f);
uv1s[2] = new Vector2(0.5f, 1f);
uv1s[3] = new Vector2(0.75f, 1f);
uv1s[4] = new Vector2(1f, 1f);
uv1s[5] = new Vector2(0.0f, 0f);
uv1s[6] = new Vector2(0.25f, 0f);
uv1s[7] = new Vector2(0.5f, 0f);
uv1s[8] = new Vector2(0.75f, 0f);
uv1s[9] = new Vector2(1f, 0f);
int[] triangleIndexs = new int[] {
0, 5, 6,
0, 6, 1,
1, 6, 7,
1, 7, 2,
2, 7, 8,
2, 8, 3,
3, 8, 9,
3, 9, 4,
4, 9, 5,
4, 5, 0
};
Mesh mesh = new Mesh();
mesh.vertices = ptVectexs;
mesh.uv = uv1s;
mesh.triangles = triangleIndexs;
//计算法向量
mesh.RecalculateNormals();
mesh.RecalculateBounds();
//开始构建Mesh
_meshFilter = this.gameObject.AddComponent<MeshFilter>();
_meshFilter.mesh = mesh;
MeshRenderer meshRender = this.gameObject.AddComponent<MeshRenderer>();
meshRender.sharedMaterial = mat;
meshRender.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
}
}