【Unity3D日常開發】Unity3D中數字網格類游戲Demo實現
推薦閱讀
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小時內刪除侵權內容。