900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Unity黑洞大作战核心逻辑

Unity黑洞大作战核心逻辑

时间:2023-08-01 12:04:01

相关推荐

Unity黑洞大作战核心逻辑

Unity黑洞大作战核心逻辑

Mesh绘制

这里就不说Mesh绘制的原理什么的了,找了几个自己当时看的博客,这里放上来可以了解下

/nanggong/article/details/54311090 简单了解

/qq_29579137/article/details/77369734 深入了解

绘制同心圆Mesh

[RequireComponent(typeof(MeshRenderer),typeof(MeshFilter))]public class Ring : MonoBehaviour{//外圈半径public float radius = 1.0f;//内圈半径public float innerRadius = 0.3f;//精细度public int segments = 50;public int preSegments = 50;private MeshFilter _meshFilter;private void Awake(){_meshFilter = GetComponent<MeshFilter>();preSegments = segments;DrawPolygon();}void DrawPolygon(){_meshFilter.mesh = CreateMesh();}Mesh CreateMesh(){float delta = 2 * Mathf.PI / segments;//每一份所占的弧度float cur = 0;Vector3[] vertices = new Vector3[segments * 2];//所有的点,内外for (int i = 0; i < segments; i++){float x = Mathf.Cos(cur);float z = Mathf.Sin(cur);vertices[i] = new Vector3(x * innerRadius, 0, z * innerRadius);vertices[i + segments] = new Vector3(x * radius, 0, z * radius);cur -= delta;}int[] triangles = new int[segments * 2 * 3];int curI = 0;for (int i = 0; i < segments; i++,curI+=6){triangles[curI] = i;triangles[curI + 1] = i + segments;triangles[curI + 2] = (i+1) % segments+ segments;//保证最后一个不会溢出triangles[curI + 3] = i;triangles[curI + 4] = (i + 1) % segments + segments;triangles[curI + 5] = (i + 1) % segments ;}Vector2[] uvs = new Vector2[vertices.Length];for (int i = 0; i < vertices.Length; i++){uvs[i] = new Vector2(vertices[i].x / radius / 2 + 0.5f, vertices[i].z / radius / 2 + 0.5f);}Mesh mesh = new Mesh();mesh.vertices = vertices;mesh.triangles = triangles;mesh.uv = uvs;return mesh;}}

中心圆移动

public class Hole : MonoBehaviour{public Ring ring;public float scale = 1f;private float detectRadius = 0.5f;private MeshFilter filter;private MeshCollider meshCollider;Mesh mesh;List<int> vertIndexes;List<Vector3> offsets;Vector3[] vertices;private Transform _tranform;private void Awake(){if (ring){meshCollider = ring.gameObject.GetComponent<MeshCollider>();filter = ring.gameObject.GetComponent<MeshFilter>();detectRadius = ring.innerRadius;transform.position = ring.transform.position;}}private void Start(){_tranform = transform;vertIndexes = new List<int>();offsets = new List<Vector3>();mesh = filter.mesh;vertices = new Vector3[mesh.vertices.Length];Vector3 centerPos = _tranform.position;for (int i = 0; i < mesh.vertices.Length; i++){float dis = Vector3.Distance(centerPos, mesh.vertices[i]);if (dis <= detectRadius + 0.5f){vertIndexes.Add(i);offsets.Add(mesh.vertices[i] - centerPos);//得到这些顶点相对中心的便宜0}}}private void LateUpdate(){vertices = mesh.vertices;for (int i = 0; i < vertIndexes.Count; i++){vertices[vertIndexes[i]] = _tranform.position + offsets[i] * scale;}mesh.vertices = vertices;filter.mesh = mesh;meshCollider.sharedMesh = mesh;}private void OnDrawGizmos(){Gizmos.color = Color.blue;Gizmos.DrawWireSphere(transform.position, detectRadius);}}

就是这么简单,,本来刚开始自己想的时候想到了用Mesh做,但是不知道怎么移动中心圆的位置,看了B站UP主的视频了之后才发现这么简单,,里面有点数学知识(关于圆的),自己画个图还是很好理解的,最主要的就是注意偏移重新绘制Mesh,加油~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。