大家可能玩过水果忍者这类的游戏吧,当时看到这个游戏的时候,觉得那个水果怎么分成2半,当时简单的认为是2章图片,现在就觉得当时很幼稚。
效果如图下:
当我点击鼠标之后,原网格重组,重新生成一个物体,它的网格信息来自原网格信息,然后切割完了之后就开始下落了,
using UnityEngine;
using System.Collections.Generic;
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class TestCombine : MonoBehaviour {
private Mesh _waterMesh;
private List<Vector3> _verticles;
private List<int> _trangels;
private List<Vector2> _uvList;
private MeshFilter _meshFilter;
private GameObject _ob;
private bool isSeprate=false;
public Material MeshMaterial;
private void Awake()
{
_meshFilter = this.GetComponent<MeshFilter>();
}
private void Start ()
{
GenerateMesh(5,5);
}
private void Update()
{
if (Input.GetMouseButtonDown(0) && !_ob)
{
var v = new List<Vector3>(); var v1 = new List<Vector3>();
var u = new List<Vector2>(); var u1 = new List<Vector2>();
var t = new List<int>(); var t1 = new List<int>();
v.Add(new Vector3(-2.5f, -2.5f, 0));
v.Add(new Vector3(2.5f, -2.5f, 0));
v.Add(new Vector3(-2.5f, 2.5f, 0));
u.Add(new Vector2(0, 0)); u.Add(new Vector2(1, 0)); u.Add(new Vector2(0, 1));
t.Add(0); t.Add(2); t.Add(1);
v1.Add(new Vector3(2.5f, -2.5f, 0));
v1.Add(new Vector3(-2.5f, 2.5f, 0));
v1.Add(new Vector3(2.5f, 2.5f, 0));
u1.Add(new Vector2(1, 0)); u1.Add(new Vector2(0, 1)); u1.Add(new Vector2(1, 1));
t1.Add(0); t1.Add(2); t1.Add(1);
_ob = new GameObject("other Gameobject");
_ob.transform.position = this.transform.position;
_ob.transform.rotation = this.transform.rotation;
CombineMesh(v, t, u, _ob);
CombineMesh(v1, t1, u1, this.gameObject);
isSeprate = true;
}
if (isSeprate)
{
this.transform.position+=new Vector3(1f,-3f,0f)*Time.deltaTime;
_ob.transform.position+=new Vector3(-1f,-3f,0f)*Time.deltaTime;
}
}
private void GenerateMesh(float width,float height)
{
_verticles=new List<Vector3>();
_trangels=new List<int>();
_uvList=new List<Vector2>();
_waterMesh=new Mesh();
_verticles.Add(new Vector3(-width/2, -height/2, 0));
_verticles.Add(new Vector3(width/2, -height/2, 0));
_verticles.Add(new Vector3(-width/2, height/2, 0));
_verticles.Add(new Vector3(width/2,height/2,0 ));
_meshFilter.mesh.vertices = _verticles.ToArray();
_uvList.Add(new Vector2(0, 0));
_uvList.Add(new Vector2(1, 0));
_uvList.Add(new Vector2(0, 1));
_uvList.Add(new Vector2(1, 1));
_trangels.Add(0); _trangels.Add(2); _trangels.Add(1);
_trangels.Add(1); _trangels.Add(2); _trangels.Add(3);
_meshFilter.mesh.triangles = _trangels.ToArray();
_meshFilter.mesh.uv = _uvList.ToArray();
}
private void CombineMesh(List<Vector3> verticles, List<int> triangles, List<Vector2> uv, GameObject ob)
{
MeshFilter meshFilter;
MeshRenderer renender;
if (!ob.GetComponent<MeshFilter>())
meshFilter = ob.AddComponent<MeshFilter>();
else
meshFilter = ob.GetComponent<MeshFilter>();
if(!ob.GetComponent<MeshRenderer>())
renender = ob.AddComponent<MeshRenderer>();
else
renender = ob.GetComponent<MeshRenderer>();
_waterMesh = new Mesh();
_waterMesh.vertices = verticles.ToArray();
_waterMesh.triangles = triangles.ToArray();
_waterMesh.uv = uv.ToArray();
renender.sharedMaterial = MeshMaterial;
meshFilter.mesh = _waterMesh;
}
}
代码都比较简单,只需下来稍微理解一下就可以了,当然网格的重组绝对不会这么简单,这是的特定的分割成2半,假如我们想动态的切掉一个角呢,如果原网格不是一个不规则的图形呢,然后我要去切割呢。那我们要怎么去解决呢?这个听起来很复杂的样子,事实上着确实是个麻烦的问题,但是不用怕,因为有人帮我们写好了这种算法,这个我会在以后的学习中跟你们去仔细的讲解这方面的知识,其实做这类游戏是最烧脑子的,比起那些RPG类型的游戏来说,这种游戏的难度高了不止1倍2倍,是要远远高出那种游戏的。