Unity3D日常開發】Unity3D中數字網格類游戲Demo實現

      網友投稿 1017 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

      【Unity3D日常開發】Unity3D中數字網格類游戲Demo實現

      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算子開發環境
      下一篇:由車聯網平臺談談物聯網數據上云
      相關文章
      亚洲JIZZJIZZ中国少妇中文| 亚洲1区1区3区4区产品乱码芒果 | 色噜噜噜噜亚洲第一| 亚洲欧洲日韩极速播放| 亚洲一级毛片在线观| 亚洲国产成人精品青青草原| 亚洲高清资源在线观看| 亚洲午夜免费视频| 亚洲综合久久综合激情久久| 亚洲视频.com| 久久久久亚洲av无码专区喷水| 亚洲国产精品线在线观看| 亚洲色图在线观看| 亚洲综合区图片小说区| 亚洲性色高清完整版在线观看| 亚洲另类视频在线观看| 亚洲综合久久一本伊伊区| 国产精品亚洲自在线播放页码| 亚洲一级特黄特黄的大片| 亚洲人成人无码.www石榴| 亚洲av无码成人影院一区| 国产精品亚洲精品日韩电影| 国产午夜亚洲精品不卡电影| 亚洲国产精品一区二区三区久久| 亚洲国产精品国产自在在线| 国产亚洲精品看片在线观看 | 亚洲人成网国产最新在线| 亚洲一级毛片免费看| 伊人久久亚洲综合影院首页| 亚洲国产精品成人AV在线| 成人亚洲综合天堂| 国产亚洲色婷婷久久99精品91| 亚洲精品无码AV人在线播放| 亚洲日本va午夜中文字幕一区| 亚洲综合色丁香麻豆| 一本色道久久综合亚洲精品蜜桃冫 | 亚洲国产成AV人天堂无码| 亚洲无mate20pro麻豆| 亚洲成a人无码亚洲成www牛牛| 在线a亚洲v天堂网2018| 亚洲综合色自拍一区|