【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;} }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;}}}}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 updatevoid Start(){transform.position = map.inPos;}// Update is called once per framevoid 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;} }源代碼下載地址:
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和坑,讓后來人可以有些參考。 |
總結
以上是生活随笔為你收集整理的【Unity3D日常开发】Unity3D中数字网格类游戏Demo实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 局域网屏幕监控软件_掌控局域网监控软件(
- 下一篇: k3修改服务器,金蝶k3客户端修改服务器