【Unity3D日常开发】Unity3D中数字网格类游戏Demo实现

恬静的小魔龙 发表于 2022/05/19 23:08:39 2022/05/19
【摘要】 推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得...

推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、问题截图

Hello,忘了这是啥时候的存稿了。

这是一位小伙伴的需求:
在这里插入图片描述

我们就根据需求去整理思路、列知识网络。

然后按照知识网络中的概念分别去查资料,然后把它做出来。

二、整理思路

2-1、根据地图布局,生成一组Json、XMl等数据结构。

这个我觉得,不要用Json和XML,因为这两个都是生成结构化的数据对象,主要用于跟其他平台的数据交换,比如说想服务器发送一个Json格式的数据,然后服务器返回一个Json格式的数据,解析加载。

可以直接使用一个txt文档用来保存地图信息。

推荐教程 :
【Unity3D读取数据】(一)Txt文档操作(创建、读取、写入、修改)

【Unity3D读取数据】(二)Json文件操作(创建、读取、解析、修改)

【Unity3D读取数据】(三)Xml文件操作(创建、读取、写入、修改)

2-2、根据Json数据,渲染出地图,更改json数字,修改不同地图布局

这里还是不推荐使用Json,因为Json的数据都是键值对形式,比如:

{“Person”:[{“name”:“张三”,“age”:18},{“name”:“李四”,“age”:19}]}
在这里插入图片描述

这个在传递数据的时候是非常有用的,可以清晰快速的解析出Json,得到json里面对应变量的值。

但是对于生成地图来说,这个Json就不太合适了。

推荐使用txt,然后修改txt数字,修改不同地图布局,也是一样的。

当然,也可以使用csv来保存数据。

推荐教程:
【Unity3D】利用TextAsset读入文件并生成地图
【Unity3D读取数据】(五)Csv文件操作(创建、读取、写入、修改)

2-3、为不同数字配上不同的icon图标,表达不同数字的含义

这个就可以选择导入一些icon素材,比如:
在这里插入图片描述
导入到项目中,然后根据数字生成不同的块即可。

推荐教程:
【Unity3D】利用TextAsset读入文件并生成地图

这个代码已经写的好了,再修改一下应该就能用。

2-4、在入口处生成原点,支持键盘的上下左右移动,不可以超出地图格子

生成原点,没啥好说的,做成预制体然后使用Instantiate函数生成对象即可。

推荐教程:
Unity 中的 C# Instantiate() 方法解析

键盘上下左右移动好做,只是不可以超过地图格子需要进行代码判断,或者使用碰撞墙。

推荐教程:
【Unity3D日常开发】(二)实现角色移动行走之Transform、Rigidbody、CharacterController组件

这两个有移动的脚本,但是是付费专栏,如果想看的话可以找我要离线版:
【Unity3D开发小游戏】《吃豆人》Unity开发教程
在这里插入图片描述

【Unity3D开发小游戏】《贪吃蛇》Unity开发教程
在这里插入图片描述

2-5、根据输入不同的参数,生成随机地图

这个根据参数生成随机地图,首先,需要先确定有几行几列,才能进行排列。

然后维护一下地图数据数组,地图数据数组保存的信息是:

1个入口、x个普通道路、x个战斗道路、x个普通房间、x个战斗房间

根据传递进来的参数,如5个普通房间,2个战斗房间,3个战斗道路,那么这个数组就是:

In:入口
CommonRoom:普通房间
CombatRoom:战斗房间
CombatRoad:战斗道路
CommonRoad:普通道路
mapInfoNums=[In=1,CommonRoom=5,CombatRoom=2,CombatRoad=3,CommonRoad=0]

然后对于每一行每一列来说。

随机生成一个房间或者道路,然后在数组中判断这个房间还是道路是否还有数量。

有的话生成,没有的话再随机,直到数组中的所有值都为0停止。

当然,这个先确定有几行几列,比如加起来才10个道路房间,直接1行10列也是不合理的。

所以,可以将所有的房间道路加起来取中位数,作为行列的值即可。

推荐教程:
Unity数组Array笔记
Unity数组Array
Unity取随机数的用法

三、案例参考

3-1、读取CSV生成地图

在这里插入图片描述

using UnityEngine;
using System.Collections;
using System.Collections.Generic;//这里用到了C#容器
using System.IO;
using System.Text;

public class Map : MonoBehaviour
{
    public GameObject[] Debris;

    public float DebrisOffset;//棋子间隔距离
    void Start()
    {
        ReadCSV();
    }

    void ReadCSV()
    {
        /*CSV文件路径 */
        string filePath = Application.streamingAssetsPath + "/Map.csv";
        /* 读取CSV文件,一行行读取 */
        string[] fileData = File.ReadAllLines(filePath);
        for (int i = 0; i < fileData.Length; i++)
        {
            /* 每一行的内容都是逗号分隔,读取每一列的值 */
            string[] values = fileData[i].Split(',');
            for (int j = 0; j < values.Length; j++)
            {
                //遍历每一行每一列的值
                //Debug.Log(values[j]);
                switch (values[j])
                {
                    case "0"://入口
                        Instantiate(Debris[int.Parse(values[j])], ReturnPos(i, j), Quaternion.identity);
                        break;
                    case "1"://普通道路
                        Instantiate(Debris[int.Parse(values[j])], ReturnPos(i, j), Quaternion.identity);
                        break;
                    case "2"://战斗道路
                        Instantiate(Debris[int.Parse(values[j])], ReturnPos(i, j), Quaternion.identity);
                        break;
                    case "3"://普通房间
                        Instantiate(Debris[int.Parse(values[j])], ReturnPos(i, j), Quaternion.identity);
                        break;
                    case "4"://战斗房间
                        Instantiate(Debris[int.Parse(values[j])], ReturnPos(i, j), Quaternion.identity);
                        break;
                    case " "://空格
                        Instantiate(Debris[5], ReturnPos(i, j), Quaternion.identity);
                        break;
                    default:
                        break;
                }
            }
        }
    }

    Vector2 ReturnPos(int i, int j)
    {
        i = i - 8;
        j = j - 16;
        Vector2 pos = new Vector2(j * DebrisOffset, i * DebrisOffset);
        pos = new Vector2(pos.x, -pos.y);
        return pos;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

3-2、随机生成地图

在这里插入图片描述

//随机生成地图  普通房间 战斗房间 普通道路 战斗道路
    void RandomSpawnRoom(int CommonRoom, int CombatRoom,int CommonRoad, int CombatRoad)
    {
        //行列
        int rowCount = CommonRoom + CombatRoom + CommonRoad + CombatRoad;
        int colCount = rowCount;
        int inCount = 1;//入口

        for (int i = 0; i < rowCount; i++)
        {
            for (int j = 0; j < colCount; j++)
            {
                int m_random = Random.Range(0, 5);
                switch (m_random)
                {
                    case 0://入口
                        if (inCount > 0)
                        {
                            Instantiate(Debris[m_random], ReturnPos(i, j), Quaternion.identity);
                            inCount--;
                        }
                        else
                        {
                            Instantiate(Debris[5], ReturnPos(i, j), Quaternion.identity);
                        }
                        break;
                    case 1://普通道路
                        if (CommonRoad > 0)
                        {
                            Instantiate(Debris[m_random], ReturnPos(i, j), Quaternion.identity);
                            CommonRoad--;
                        }
                        else
                        {
                            Instantiate(Debris[5], ReturnPos(i, j), Quaternion.identity);
                        }
                        break;
                    case 2://战斗道路
                        if (CombatRoad > 0)
                        {
                            Instantiate(Debris[m_random], ReturnPos(i, j), Quaternion.identity);
                            CombatRoad--;
                        }
                        else
                        {
                            Instantiate(Debris[5], ReturnPos(i, j), Quaternion.identity);
                        }
                        
                        break;
                    case 3://普通房间
                        if (CommonRoom > 0)
                        {
                            Instantiate(Debris[m_random], ReturnPos(i, j), Quaternion.identity);
                            CommonRoom--;
                        }
                        else
                        {
                            Instantiate(Debris[5], ReturnPos(i, j), Quaternion.identity);
                        }
                        
                        break;
                    case 4://战斗房间
                        if (CombatRoom > 0)
                        {
                            Instantiate(Debris[m_random], ReturnPos(i, j), Quaternion.identity);
                            CombatRoom--;
                        }
                        else
                        {
                            Instantiate(Debris[5], ReturnPos(i, j), Quaternion.identity);
                        }
                        break;
                    default://空格
                        Instantiate(Debris[5], ReturnPos(i, j), Quaternion.identity);
                        break;
                }
            }
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

3-3、左右上下移动

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Select : MonoBehaviour
{
    public Map map;
    // Start is called before the first frame update
    void Start()
    {
        transform.position = map.inPos;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.UpArrow) && GemAt(new Vector2(transform.position.x, transform.position.y + 0.5f)))
        {
            transform.position = new Vector2(transform.position.x, transform.position.y + 0.5f);
        }
        else if (Input.GetKeyDown(KeyCode.DownArrow) && GemAt(new Vector2(transform.position.x, transform.position.y - 0.5f)))
        {
            transform.position = new Vector2(transform.position.x, transform.position.y - 0.5f);
        }
        else if (Input.GetKeyDown(KeyCode.LeftArrow) && GemAt(new Vector2(transform.position.x - 0.5f, transform.position.y)))
        {
            transform.position = new Vector2(transform.position.x - 0.5f, transform.position.y);
        }
        else if (Input.GetKeyDown(KeyCode.RightArrow) && GemAt(new Vector2(transform.position.x + 0.5f, transform.position.y)))
        {
            transform.position = new Vector2(transform.position.x + 0.5f, transform.position.y);
        }
    }

    //判断在不在格子内
    private bool GemAt(Vector2 pos)
    {
        foreach (Vector2 item in map.listPos)
        {
            if (pos == item)
            {
                return true;
            }
        }
        return false;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

源代码下载地址:
https://wwn.lanzoui.com/izWcYwnv81a

四、后言

你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

在这里插入图片描述

博主还有跟多宝藏文章等待你的发掘哦:

专栏 方向 简介
Unity3D开发小游戏 小游戏开发教程 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶 入门 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUI UGUI Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据 文件读取 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合 数据集合 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发 虚拟仿真 总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件 插件 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发 日常记录 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG 日常记录 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

文章来源: itmonon.blog.csdn.net,作者:恬静的小魔龙,版权归原作者所有,如需转载,请联系作者。

原文链接:itmonon.blog.csdn.net/article/details/121415724

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。