Unity创建自定义Mesh类TownsMesh

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class TownsMesh

{

    // Use this for initialization

    public int row = 80;

    public int column = 80;

    public int n_row = 20;

    public int n_column = 20;

    int num = 16;

    public Mesh[] tMesh;// = new Mesh[];

    private Vector3[] s_Vertives;

    private Vector2[] uv;

    //private Vector2[] newUV;

    Dictionary<int, Vector2[]> newUV = new Dictionary<int, Vector2[]>();

    GameObject[] tPolygon;

    //private

    private int[] hasmesh;

    private  Material material;

    public void DoCreatPloygonMesh(Vector3[] s_Vertives, Vector2[] uv, Vector3[] normals, Texture img, int z_row = 80, int z_column = 80, int N_row = 20, int N_column = 20)

    {

        row = z_row;

        column = z_column;

        n_row = N_row;

        n_column = N_column;

        num = (row / n_row) * (column / n_column);

        tPolygon = new GameObject[num];

        tMesh = new Mesh[num];

        for (int i = 0; i < num; i++)

        {

            tPolygon[i] = new GameObject("tPolygon" + i);

            tMesh[i] = new Mesh();

        }

        Dictionary<int, Vector3[]> tVertices = new Dictionary<int, Vector3[]>();

        Dictionary<int, List<int>> tTriangles = new Dictionary<int, List<int>>();

        for (int i = 0; i < num; i++)

        {

            tVertices[i] = new Vector3[n_row * n_column * 4];

            newUV[i] = new Vector2[n_row * n_column * 4];

            tTriangles[i] = new List<int>();

        }

        //Dictionary<int, List<int>> tTriangles = new Dictionary<int, List<int>>();

        for (int i = 0; i < num; i++)

        {

            tPolygon[i].AddComponent<MeshFilter>();

            tPolygon[i].AddComponent<MeshRenderer>();

            //tPolygon[i].GetComponent<Renderer>().material.shader = Shader.Find("Sprites/Default");

            if(material==null)

            {

                material = new Material(Shader.Find("Sprites/Default"));

                material.mainTexture = img;

            }

            tPolygon[i].GetComponent<Renderer>().material = material;

            //tPolygon[i].GetComponent<Renderer>().material.mainTexture = img;

        }

        for (int i = 0; i < s_Vertives.Length - 2; i++)

        {

            int n = i / 4;

            int c_row = n % row;

            int c_column = n / column;

            int r_row = c_row / n_row;

            int r_column = c_column / n_column;

            int w_id = r_column * (row / n_row) + r_row;

            if (i % 4 == 0)

            {

                int k_row = c_row % n_row;

                int k_column = c_column % n_column;

                int k = k_column * n_column + k_row;

                tTriangles[w_id].Add(0 + k * 4);

                tTriangles[w_id].Add(1 + k * 4);

                tTriangles[w_id].Add(2 + k * 4);

                tTriangles[w_id].Add(2 + k * 4);

                tTriangles[w_id].Add(3 + k * 4);

                tTriangles[w_id].Add(0 + k * 4);

                tVertices[w_id][k * 4] = s_Vertives[i];

                tVertices[w_id][k * 4 + 1] = s_Vertives[i + 1];

                tVertices[w_id][k * 4 + 2] = s_Vertives[i + 2];

                tVertices[w_id][k * 4 + 3] = s_Vertives[i + 3];

                newUV[w_id][k * 4] = uv[i];

                newUV[w_id][k * 4 + 1] = uv[i + 1];

                newUV[w_id][k * 4 + 2] = uv[i + 2];

                newUV[w_id][k * 4 + 3] = uv[i + 3];

            }

        }

        for (int i = 0; i < num; i++)

        {

            tMesh[i].vertices = tVertices[i];

            //赋值三角形点排序

            tMesh[i].triangles = tTriangles[i].ToArray();

            //tMesh.normals = normals;

            //tMesh.normals = normals;

            tMesh[i].uv = newUV[i];

            //重新设置UV,法线

            tMesh[i].RecalculateBounds();

            tMesh[i].RecalculateNormals();

            //将绘制好的Mesh赋值

            tPolygon[i].GetComponent<MeshFilter>().mesh = tMesh[i];

        }

    }

    public void SetMap(int id, Sprite sprite, bool fx)

    {

        float width = sprite.texture.width;

        float height = sprite.texture.height;

        int c_row = id % row;

        int c_column = id / column;

        int r_row = c_row / n_row;

        int r_column = c_column / n_column;

        int w_id = r_column * (row / n_row) + r_row;

        int k_row = c_row % n_row;

        int k_column = c_column % n_column;

        int k = k_column * n_column + k_row;

        //newUV[id*4] = new Vector2(sprite.rect.x / width, (sprite.rect.y + sprite.rect.height) / height)

        if (fx)

        {

            newUV[w_id][k * 4] = new Vector2(sprite.rect.x / width, (sprite.rect.y + sprite.rect.height) / height);

            newUV[w_id][k * 4 + 1] = new Vector2((sprite.rect.x + sprite.rect.width) / width, (sprite.rect.y + sprite.rect.height) / height);

            newUV[w_id][k * 4 + 2] = new Vector2((sprite.rect.x + sprite.rect.width) / width, sprite.rect.y / height);

            newUV[w_id][k * 4 + 3] = new Vector2(sprite.rect.x / width, sprite.rect.y / height);

        }

        else

        {

            newUV[w_id][k * 4 + 1] = new Vector2(sprite.rect.x / width, (sprite.rect.y + sprite.rect.height) / height);

            newUV[w_id][k * 4 + 0] = new Vector2((sprite.rect.x + sprite.rect.width) / width, (sprite.rect.y + sprite.rect.height) / height);

            newUV[w_id][k * 4 + 3] = new Vector2((sprite.rect.x + sprite.rect.width) / width, sprite.rect.y / height);

            newUV[w_id][k * 4 + 2] = new Vector2(sprite.rect.x / width, sprite.rect.y / height);

        }

        //tMesh.RecalculateBounds();

        //tMesh.RecalculateNormals();

        tMesh[w_id].uv = newUV[w_id];

    }

    public void SetMap2(int id)

    {

        int c_row = id % row;

        int c_column = id / column;

        int r_row = c_row / n_row;

        int r_column = c_column / n_column;

        int w_id = r_column * (row / n_row) + r_row;

        int k_row = c_row % n_row;

        int k_column = c_column % n_column;

        int k = k_column * n_column + k_row;

        newUV[w_id][k * 4] = new Vector2(0, 0);

        newUV[w_id][k * 4 + 1] = new Vector2(0, 0);

        newUV[w_id][k * 4 + 2] = new Vector2(0, 0);

        newUV[w_id][k * 4 + 3] = new Vector2(0, 0);

        //tMesh.RecalculateBounds();

        //tMesh.RecalculateNormals();

        tMesh[w_id].uv = newUV[w_id];

    }

    public void SetParent(Transform parent)

    {

        for (int i = 0; i < num; i++)

        {

            tPolygon[i].transform.SetParent(parent);

            tPolygon[i].layer = parent.gameObject.layer;

            tPolygon[i].transform.localPosition = Vector3.zero;

        }

    }

}


private void Creatmash()

    {

        float p_y = 0.0001f;

        float p_x = 0.0002f;

        if (tCreatMesh == null)

        {

            tCreatMesh = new TownsMesh();

            Vector3[] s_Vertives = new Vector3[(int)mapSize.x * (int)mapSize.y * 4];

            Vector2[] uv = new Vector2[(int)mapSize.x * (int)mapSize.y * 4];

            Vector3[] normals = new Vector3[(int)mapSize.x * (int)mapSize.y * 4];

            for (int row = 0; row < mapSize.x; row++)

            {

                for (int column = 0; column < mapSize.y; column++)

                {

                    var px2 = row * tileSizeX * 0.01f - (column) * tileSizeX * 0.01f;

                    var py2 = column * (0.01f * tileSizeY) + row * (0.01f * tileSizeY);

                    float depth = column + row + row * p_y + p_x * column;

                    Vector3 pos = new Vector3(px2, py2, depth);

                    int id = (int)((column * mapSize.x) + row);

                    s_Vertives[id * 4] = new Vector3(-1.0f, 1, 0) + pos;

                    s_Vertives[id * 4 + 1] = new Vector3(1, 1, 0) + pos;

                    s_Vertives[id * 4 + 2] = new Vector3(1, 0, 0) + pos;

                    s_Vertives[id * 4 + 3] = new Vector3(-1.0f, 0, 0) + pos;

                    uv[id * 4] = new Vector2(0, 0);

                    uv[id * 4 + 1] = new Vector2(0, 0);

                    uv[id * 4 + 2] = new Vector2(0, 0);

                    uv[id * 4 + 3] = new Vector2(0, 0);

                }

            }

            tCreatMesh.DoCreatPloygonMesh(s_Vertives, uv, normals, autotile.bitmaskSprites[0].texture, (int)mapSize.x, (int)mapSize.y,9,9);

            tCreatMesh.SetParent(transform);

        }

    }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • using UnityEngine; using System.Collections; using System...
    不倒翁_2878阅读 2,554评论 0 0
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,392评论 0 13
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,013评论 0 2
  • 作为一名自身妇产科医生我表示,只要使用的眉笔是正规厂家的合格产品,不是毒药,就可以用,怀孕没有大家想象的那么过度小...
    加油冲哇阅读 119评论 0 0
  • 敬爱的老师 智慧的教授亲爱的家人们 我是来自鑫山力机械的王齐港 携手前行共创辉煌,每天进步一点点距离成功变不远。 ...
    正在加载中_bfa6阅读 98评论 0 1