什么是低代码?低代码开发平台靠谱吗?低代码平台优缺点
845
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
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小时内删除侵权内容。