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

网友投稿 834 2022-05-29

推荐阅读

CSDN主页

GitHub开源地址

Unity3D插件分享

简书地址

我的个人博客

QQ群:1040082875

大家好,我是佛系工程师

☆恬静的小魔龙☆

,不定时更新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

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

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

四、后言

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

博主主页有联系方式。

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

5G游戏 unity

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:通过WSL2 Ubuntu18.04搭建CANN算子开发环境
下一篇:由车联网平台谈谈物联网数据上云
相关文章