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.mesh = mesh;
MeshRenderer meshRender = this.gameObject.AddComponent(); meshRender.sharedMaterial = mat; meshRender.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; } }