Unity 动态生成mesh圆圈

 

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class yuan : MonoBehaviour
{
	public float Radius = 0.01f;          //外半径  
	public float innerRadius = 0.008f;     //内半径
	public float angleDegree = 0;   //扇形或扇面的角度
	public int Segments = 60;         //分割数  
	public int lastTime = 10;

	private MeshFilter meshFilter;

	void Start()
	{
		meshFilter = GetComponent<MeshFilter>();

	}

	void Update()
	{


		meshFilter.mesh = CreateMesh(Radius, innerRadius, angleDegree, Segments);
		if (angleDegree > 360) {

			System.Threading.Thread.Sleep(2000);

			angleDegree = 0;
		}
		angleDegree += 10;


	}




	Mesh CreateMesh(float radius, float innerradius,float angledegree,int segments)
	{
		//vertices(顶点):
		int vertices_count = segments* 2+2;              //因为vertices(顶点)的个数与triangles(索引三角形顶点数)必须匹配
		Vector3[] vertices = new Vector3[vertices_count];       
		float angleRad = Mathf.Deg2Rad * angledegree;
		float angleCur = angleRad;
		float angledelta = angleRad / segments;
		for(int i=0;i< vertices_count; i+=2)
		{
			float cosA = Mathf.Cos(angleCur);
			float sinA = Mathf.Sin(angleCur);

			vertices[i] = new Vector3(radius * cosA, 0, radius * sinA);
			vertices[i + 1] = new Vector3(innerradius * cosA, 0, innerradius * sinA);
			angleCur -= angledelta;
		}

		//triangles:
		int triangle_count = segments * 6;
		int[] triangles = new int[triangle_count];
		for(int i=0,vi=0;i<triangle_count;i+=6,vi+=2)   
		{
			triangles[i] = vi;
			triangles[i + 1] = vi+3;
			triangles[i + 2] = vi + 1;
			triangles[i + 3] =vi+2;
			triangles[i + 4] =vi+3;
			triangles[i + 5] =vi;
		}

		//uv:
		Vector2[] uvs = new Vector2[vertices_count];
		for (int i = 0; i < vertices_count; i++)
		{
			uvs[i] = new Vector2(vertices[i].x / radius / 2 + 0.5f, vertices[i].z / radius / 2 + 0.5f);
		}

		//负载属性与mesh
		Mesh mesh = new Mesh();
		mesh.vertices = vertices;
		mesh.triangles = triangles;
		mesh.uv = uvs;
		return mesh;
	}
}

 

 

几个星期前,我在想,能否使用Unity来进行地形的实时变化?比如说,如果发生爆炸,它能否在地形中显示一个气泡?我认为学习更多高级的Unity中的地形特征将会是一个好的项目。 这要比我预想的更具挑战性,因为很难在执行这些操作时获得帧率来保持稳定。使用一些技巧,最终实现了我预想的效果。 示例是这样工作的。脚本随机产生“shell”并很快掉落到地面。每一个shell都依附着一个onTrigger对撞机。如果它和拥有 TerrainDeformer组件的地形相冲突的话,shell将告诉组件它的位置和爆炸的作用力。shell然后实例化一个爆炸(explosion)(由Ben Throop great Detonator framework提供),然后移除它自身。 TerrainDeformer脚本然后将那个位置翻译成相对地形的正确位置,并修改heightmap(地形高度)和alphamap(地形纹理)。一点儿数学知识用来在影响圆周内部查找所有的heightmap和alphamap位置。 被用于在影响范围重绘质地的纹理,是从基于传递到脚本(Terrain Deformation Texture Num)中的数字顺序索引值的地形纹理列表中选择的。在这个例子中,它被设置为1,因此它将使用列表中的第二个纹理来重绘质地。 在创建你自己的地形时,有必要将地形的高度设置为大于0米,从而形成弹坑。我建议深度至少为3米。这可以通过将地形高度设为大于3米的任何值,然后点击Terrain->Flatten Heightmap并输入3米。 出于执行的原因,保持你的Terrain Size为small是非常重要的,以及更重要的是保持Heightmap Resolution为low。在这个例子中,设置为33。 目前版本没有想缺乏地形边缘检测的局限性,并提供多个地形。这个例子表明它不仅能够工作,而且不会有大的性能损失。 感谢Calin创建一个泥土纹理。 为检测示例,<http://blog.almostlogical.com/workingExamples/RealTimeTerrainDeformation/index.html> 为获得源码(unitypackage), 源码要求:Unity 2.6 以及 Detonator Framework。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值