网格的学习—3

    大家可能玩过水果忍者这类的游戏吧,当时看到这个游戏的时候,觉得那个水果怎么分成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倍,是要远远高出那种游戏的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值