标签:
适用情景:主角带着光环,光环用一张贴图,要贴在地面上,并且随地面凹凸起伏
//代码
using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshFilter))] [RequireComponent(typeof(MeshRenderer))] public class test : MonoBehaviour { private MeshFilter mFilter; private Mesh mMesh; public int QuadNum = 1; public float QuadLength = 1; // Use this for initialization void Start () { mFilter = gameObject.GetComponent<MeshFilter>(); mMesh = new Mesh(); mFilter.sharedMesh = mMesh; mMesh.MarkDynamic(); var len = 2 * QuadNum * QuadLength; var h_len = QuadNum * QuadLength; var vertices = new Vector3[QuadNum * 2 * QuadNum * 2 * 4]; var uv = new Vector2[QuadNum * 2 * QuadNum * 2 * 4]; var triangle = new int[QuadNum * 2 * QuadNum * 2 * 6]; var offset = new Vector3(-h_len, 0, -h_len); int idx = 0; for (int i = 0; i < QuadNum * 2; i++) { for (int j = 0; j < QuadNum * 2; j++) { var p0 = offset + new Vector3(j * QuadLength, 0, i * QuadLength); var p1 = offset + new Vector3(j * QuadLength, 0, (i + 1) * QuadLength); var p2 = offset + new Vector3((j + 1) * QuadLength, 0, (i + 1) * QuadLength); var p3 = offset + new Vector3((j + 1) * QuadLength, 0, i * QuadLength); int quad = (j + i * QuadNum * 2) * 4; vertices[quad] = p0; vertices[quad + 1] = p1; vertices[quad + 2] = p2; vertices[quad + 3] = p3; uv[quad] = new Vector2((p0.x + h_len) / len, (p0.z + h_len) / len); uv[quad + 1] = new Vector2((p1.x + h_len) / len, (p1.z + h_len) / len); uv[quad + 2] = new Vector2((p2.x + h_len) / len, (p2.z + h_len) / len); uv[quad + 3] = new Vector2((p3.x + h_len) / len, (p3.z + h_len) / len); triangle[idx++] = quad; triangle[idx++] = quad + 1; triangle[idx++] = quad + 2; triangle[idx++] = quad; triangle[idx++] = quad + 2; triangle[idx++] = quad + 3; } } mMesh.vertices = vertices; mMesh.uv = uv; mMesh.triangles = triangle; } // Update is called once per frame protected virtual void Update () { var len = 2 * QuadNum * QuadLength; var h_len = QuadNum * QuadLength; var vertices = new Vector3[QuadNum * 2 * QuadNum * 2 * 4]; var offset = new Vector3(-h_len, 0, -h_len); for (int i = 0; i < QuadNum * 2; i++) { for (int j = 0; j < QuadNum * 2; j++) { var p0 = offset + new Vector3(j * QuadLength, 0, i * QuadLength); var p1 = offset + new Vector3(j * QuadLength, 0, (i + 1) * QuadLength); var p2 = offset + new Vector3((j + 1) * QuadLength, 0, (i + 1) * QuadLength); var p3 = offset + new Vector3((j + 1) * QuadLength, 0, i * QuadLength); int quad = (j + i * QuadNum * 2) * 4; vertices[quad] = p0; vertices[quad + 1] = p1; vertices[quad + 2] = p2; vertices[quad + 3] = p3; } } var ray = new Ray(Vector3.down, Vector3.down); var hit = new RaycastHit(); for (int i = 0; i < QuadNum * 2; i++) { for (int j = 0; j < QuadNum * 2; j++) { var p0 = offset + new Vector3(j * QuadLength, 0, i * QuadLength); var p1 = offset + new Vector3(j * QuadLength, 0, (i + 1) * QuadLength); var p2 = offset + new Vector3((j + 1) * QuadLength, 0, (i + 1) * QuadLength); var p3 = offset + new Vector3((j + 1) * QuadLength, 0, i * QuadLength); ray.origin = transform.localToWorldMatrix.MultiplyPoint3x4(p0)+new Vector3(0,10,0); if(Physics.Raycast(ray,out hit, 100)) { p0 = transform.worldToLocalMatrix.MultiplyPoint3x4(hit.point); } ray.origin = transform.localToWorldMatrix.MultiplyPoint3x4(p1) + new Vector3(0, 10, 0); if (Physics.Raycast(ray, out hit, 100)) { p1 = transform.worldToLocalMatrix.MultiplyPoint3x4(hit.point); } ray.origin = transform.localToWorldMatrix.MultiplyPoint3x4(p2) + new Vector3(0, 10, 0); if (Physics.Raycast(ray, out hit, 100)) { p2 = transform.worldToLocalMatrix.MultiplyPoint3x4(hit.point); } ray.origin = transform.localToWorldMatrix.MultiplyPoint3x4(p3) + new Vector3(0, 10, 0); if (Physics.Raycast(ray, out hit, 100)) { p3 = transform.worldToLocalMatrix.MultiplyPoint3x4(hit.point); } int quad = (j + i * QuadNum * 2) * 4; vertices[quad] = p0; vertices[quad + 1] = p1; vertices[quad + 2] = p2; vertices[quad + 3] = p3; } } mMesh.vertices = vertices; } }
标签:
原文地址:http://www.cnblogs.com/mrblue/p/4933945.html