Unity3d 制作动态Mesh且可以随地面凹凸起伏

适用情景:主角带着光环,光环用一张贴图,要贴在地面上,并且随地面凹凸起伏

 

 

//代码

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 quadNum = QuadNum * 2;
		var ptNum = quadNum + 1;
		var h_len = QuadNum * QuadLength;
		var len = h_len * 2;
		

		var vertices = new Vector3[ptNum * ptNum];
		var uv = new Vector2[ptNum * ptNum];
		var triangle = new int[QuadNum * 2 * QuadNum * 2 * 6];

		var offset = new Vector3(-h_len, 0, -h_len);

		
		for (int j = 0; j < ptNum; j++) 
		{
			for (int i = 0; i < ptNum; i++)
			{
				int idx = j*ptNum+i;
				uv[idx] = new Vector2(i * 1.0f / ptNum, j * 1.0f / ptNum);
			}
		}

		int it = 0;
		for (int j = 0; j < quadNum; j++)
		{
			for (int i = 0; i < quadNum; i++)
			{
				int quadId = j * quadNum + i;
				int p0 = quadId + j;
				int p1 = p0 + ptNum;
				int p2 = p1 + 1;
				int p3 = p0 + 1;

				triangle[it++] = p0;
				triangle[it++] = p1;
				triangle[it++] = p2;

				triangle[it++] = p0;
				triangle[it++] = p2;
				triangle[it++] = p3;
			}
		}

		mMesh.vertices = vertices;
		mMesh.uv = uv;
		mMesh.triangles = triangle;
 		}
	
	// Update is called once per frame
	protected virtual void Update () {

		var quadNum = QuadNum * 2;
		var ptNum = quadNum + 1;
		var h_len = QuadNum * QuadLength;
		var len = h_len * 2;

		var vertices = new Vector3[ptNum * ptNum];

		var offset = new Vector3(-h_len, 0, -h_len);

		var ray = new Ray(Vector3.down, Vector3.down);
		var hit = new RaycastHit();
		for (int j = 0; j < ptNum; j++)
		{
			for (int i = 0; i < ptNum; i++)
			{
				int idx = j * ptNum + i;
				var pt = new Vector3(i * QuadLength, 0, j * QuadLength);

				ray.origin = transform.localToWorldMatrix.MultiplyPoint3x4(pt) + new Vector3(0, 10, 0);
				if (Physics.Raycast(ray, out hit, 100))
				{
					pt = transform.worldToLocalMatrix.MultiplyPoint3x4(hit.point);
				}

				vertices[i + j * ptNum] = pt;
			}
		}

		

		mMesh.vertices = vertices;

	}

}

  

转载于:https://www.cnblogs.com/mrblue/p/4933945.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值