Unity实现瓦片地图tile map

Wesley13
• 阅读 758

Unity自定义mesh绘制  基于上篇的mesh修改,实现tile map

第一步,修改mesh 顶点和三角片信息,生成方格

Unity实现瓦片地图tile map

顶点信息就是一系列正方形的组合,三角片,在这里实现的方法是一个矩形由2个三角形组成,注意,三角形的顺序依赖于顶点的顺序,三角形的三个点按照观察方向顺时针,三角形数量=顶点数量*6,6=2*3,2是三角形个数,3是一个三角形 由3个顶点组成,输入的三角数组的顺序是,对应顶点在输入的顶点数据中的index,贴代码:

using UnityEngine;
using System.Collections;


public class ss5 : MonoBehaviour
{
    void Start()
    {
        dooo();

    }

    void dooo()
    {
        {

            MeshFilter filter = this.GetComponent<MeshFilter>();
            MeshRenderer render = this.GetComponent<MeshRenderer>();
            var mesh = filter.mesh;

            var ts = this.GetComponentsInChildren<Transform>();

            Vector3[] vers = new Vector3[ts.Length];

            for (int i = 0; i < ts.Length; i++)
            {
                vers[i] = ts[i].position;
            }

            const int MAX_X = 30;
            const int MAX_Y = 30;
            Vector3[] vertics = new Vector3[MAX_Y * MAX_X];

            for (int x = 0; x < MAX_X; x++)
            {
                for (int y = 0; y < MAX_Y; y++)
                {
                    vertics[x + MAX_X * y] = new Vector3(x, 0f, y);
                }
            }
            foreach (var p in vertics)
            {
                Ray ray = new Ray(p, new Vector3(-100f, -100f, -100f));
                Debug.DrawLine(ray.GetPoint(-0.1f), ray.GetPoint(0.1f), Color.red);
            }
            int[] triss = new int[(MAX_Y - 1) * (MAX_X - 1) * 6];

            for (int x = 0; x < MAX_X - 1; x++)
            {
                for (int y = 0; y < MAX_Y - 1; y++)
                {
                    var p = vertics[x + MAX_X * y];
                    int baseIdx = 0;
                    if (y >= 1)
                    {
                        baseIdx = (y * (MAX_X - 1) * 6) + x * 6;
                    }
                    else
                    {
                        baseIdx = x * 6;
                    }
                    Debug.LogError(x + "   " + y + "    " + triss.Length + "  baseIdx=" + baseIdx);
                    triss[baseIdx + 0] = x + y * MAX_X;
                    triss[baseIdx + 1] = x + (y + 1) * MAX_X;
                    triss[baseIdx + 2] = (x + 1) + y * MAX_X;
                    triss[baseIdx + 3] = x + (y + 1) * MAX_X;
                    triss[baseIdx + 4] = (x + 1) + (y + 1) * MAX_X;
                    triss[baseIdx + 5] = (x + 1) + y * MAX_X; ;

                    /*   triss[x + y * MAX_X + 0] = 0;
                    triss[x + y * MAX_X + 1] = 2;
                    triss[x + y * MAX_X + 2] = 1;
                    triss[x + y * MAX_X + 3] = 2;
                    triss[x + y * MAX_X + 4] = 3;
                    triss[x + y * MAX_X + 5] = 1;
    */

                    /* triss[(x * 2 + y * 9 * 2) + 0] = 5;
                     triss[(x * 2 + y * 9 * 2) + 1] = 5;
                     triss[(x * 2 + y * 9 * 2) + 2] = 5;
                     triss[(x * 2 + y * 9 * 2) + 3] = 5;
                     triss[(x * 2 + y * 9 * 2) + 4] = 5;
                     triss[(x * 2 + y * 9 * 2) + 5] = 5;
                     */
                }
            }


            mesh.vertices = vertics;
            mesh.triangles = triss;// this.GetTris(vers);
            mesh.RecalculateNormals();
            mesh.RecalculateBounds();
            this.GetComponent<MeshCollider>().sharedMesh = mesh;
            filter.mesh = mesh;
            return;
        }
    }
    void Update()
    {

    }



    void OnDrawGizmos()
    {
        return;

        {

            MeshFilter filter = this.GetComponent<MeshFilter>();
            MeshRenderer render = this.GetComponent<MeshRenderer>();
            var mesh = filter.mesh;

            var ts = this.GetComponentsInChildren<Transform>();

            Vector3[] vers = new Vector3[ts.Length];

            for (int i = 0; i < ts.Length; i++)
            {
                vers[i] = ts[i].position;
            }

            const int MAX_X = 3;
            const int MAX_Y = 3;
            Vector3[] vertics = new Vector3[MAX_Y * MAX_X];

            for (int x = 0; x < MAX_X; x++)
            {
                for (int y = 0; y < MAX_Y; y++)
                {
                    vertics[x + MAX_X * y] = new Vector3(x, 0f, y);
                }
            }
            foreach (var p in vertics)
            {
                Ray ray = new Ray(p, new Vector3(-100f, -100f, -100f));
                Debug.DrawLine(ray.GetPoint(-0.1f), ray.GetPoint(0.1f), Color.red);
            }
            int[] triss = new int[(MAX_Y - 1) * (MAX_X - 1) * 6];

            for (int x = 0; x < MAX_X - 1; x++)
            {
                for (int y = 0; y < MAX_Y - 1; y++)
                {
                    var p = vertics[x + MAX_X * y];
                    int baseIdx = 0;
                    if (y >= 1)
                    {
                        baseIdx = (y * (MAX_X - 1) * 6) + x * 6;
                    }
                    else
                    {
                        baseIdx = x * 6;
                    }
                    Debug.LogError(x + "   " + y + "    " + triss.Length + "  baseIdx=" + baseIdx);
                    triss[baseIdx + 0] = x + y * MAX_X;
                    triss[baseIdx + 1] = x + (y + 1) * MAX_X;
                    triss[baseIdx + 2] = (x + 1) + y * MAX_X;
                    triss[baseIdx + 3] = x + (y + 1) * MAX_X;
                    triss[baseIdx + 4] = (x + 1) + (y + 1) * MAX_X;
                    triss[baseIdx + 5] = (x + 1) + y * MAX_X; ;

                    /*   triss[x + y * MAX_X + 0] = 0;
                    triss[x + y * MAX_X + 1] = 2;
                    triss[x + y * MAX_X + 2] = 1;
                    triss[x + y * MAX_X + 3] = 2;
                    triss[x + y * MAX_X + 4] = 3;
                    triss[x + y * MAX_X + 5] = 1;
    */
                    /* triss[(x * 2 + y * 9 * 2) + 0] = 5;
                     triss[(x * 2 + y * 9 * 2) + 1] = 5;
                     triss[(x * 2 + y * 9 * 2) + 2] = 5;
                     triss[(x * 2 + y * 9 * 2) + 3] = 5;
                     triss[(x * 2 + y * 9 * 2) + 4] = 5;
                     triss[(x * 2 + y * 9 * 2) + 5] = 5;
                     */
                }
            }


            mesh.vertices = vertics;
            mesh.triangles = triss;// this.GetTris(vers);
            mesh.RecalculateNormals();
            mesh.RecalculateBounds();
            this.GetComponent<MeshCollider>().sharedMesh = mesh;
            filter.mesh = mesh;
            return;
        } 
    }


}

第二步:修改UV信息,U是x轴,V是y轴,矩形4个顶点 对应UV4个坐标点,在这里是逆时针,UV也是逆时针。因此只需要一张大贴图 附上对应的UV信息 就可以实现tile map了

Unity实现瓦片地图tile map

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java——20171121
!(http://a.51jsoft.com/uploads/default/original/1X/c542896b094a42a5653fb75adf6cdacd6e35d12e.png)!(https://static.oschina.net/uploads/space/2017/1121/210719_G80Z_3715033.png)
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Wesley13 Wesley13
3年前
Unity自定义mesh绘制
有些时候需要自定义mesh来绘制目标模型图形什么的,可以代码控制,也可以通过shader去控制,这里介绍代码控制的方法:基本思路是修改mesh的定点,三角达到自定义的目的,和上上篇垂直UI.Text显示异曲同工之处。由于一个mesh是有顶点信息,和对应三角形组合而成。!(https://static.oschina.net/uploads
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这