日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Unity3D日常开发】Unity3D中数字网格类游戏Demo实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

推薦閱讀

  • CSDN主頁(yè)
  • GitHub開源地址
  • Unity3D插件分享
  • 簡(jiǎn)書地址
  • 我的個(gè)人博客
  • QQ群:1040082875

大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時(shí)更新Unity開發(fā)技巧,覺(jué)得有用記得一鍵三連哦。

一、問(wèn)題截圖

Hello,忘了這是啥時(shí)候的存稿了。

這是一位小伙伴的需求:

我們就根據(jù)需求去整理思路、列知識(shí)網(wǎng)絡(luò)。

然后按照知識(shí)網(wǎng)絡(luò)中的概念分別去查資料,然后把它做出來(lái)。

二、整理思路

2-1、根據(jù)地圖布局,生成一組Json、XMl等數(shù)據(jù)結(jié)構(gòu)。

這個(gè)我覺(jué)得,不要用Json和XML,因?yàn)檫@兩個(gè)都是生成結(jié)構(gòu)化的數(shù)據(jù)對(duì)象,主要用于跟其他平臺(tái)的數(shù)據(jù)交換,比如說(shuō)想服務(wù)器發(fā)送一個(gè)Json格式的數(shù)據(jù),然后服務(wù)器返回一個(gè)Json格式的數(shù)據(jù),解析加載。

可以直接使用一個(gè)txt文檔用來(lái)保存地圖信息。

推薦教程 :
【Unity3D讀取數(shù)據(jù)】(一)Txt文檔操作(創(chuàng)建、讀取、寫入、修改)

【Unity3D讀取數(shù)據(jù)】(二)Json文件操作(創(chuàng)建、讀取、解析、修改)

【Unity3D讀取數(shù)據(jù)】(三)Xml文件操作(創(chuàng)建、讀取、寫入、修改)

2-2、根據(jù)Json數(shù)據(jù),渲染出地圖,更改json數(shù)字,修改不同地圖布局

這里還是不推薦使用Json,因?yàn)镴son的數(shù)據(jù)都是鍵值對(duì)形式,比如:

{“Person”:[{“name”:“張三”,“age”:18},{“name”:“李四”,“age”:19}]}

這個(gè)在傳遞數(shù)據(jù)的時(shí)候是非常有用的,可以清晰快速的解析出Json,得到j(luò)son里面對(duì)應(yīng)變量的值。

但是對(duì)于生成地圖來(lái)說(shuō),這個(gè)Json就不太合適了。

推薦使用txt,然后修改txt數(shù)字,修改不同地圖布局,也是一樣的。

當(dāng)然,也可以使用csv來(lái)保存數(shù)據(jù)。

推薦教程:
【Unity3D】利用TextAsset讀入文件并生成地圖
【Unity3D讀取數(shù)據(jù)】(五)Csv文件操作(創(chuàng)建、讀取、寫入、修改)

2-3、為不同數(shù)字配上不同的icon圖標(biāo),表達(dá)不同數(shù)字的含義

這個(gè)就可以選擇導(dǎo)入一些icon素材,比如:

導(dǎo)入到項(xiàng)目中,然后根據(jù)數(shù)字生成不同的塊即可。

推薦教程:
【Unity3D】利用TextAsset讀入文件并生成地圖

這個(gè)代碼已經(jīng)寫的好了,再修改一下應(yīng)該就能用。

2-4、在入口處生成原點(diǎn),支持鍵盤的上下左右移動(dòng),不可以超出地圖格子

生成原點(diǎn),沒(méi)啥好說(shuō)的,做成預(yù)制體然后使用Instantiate函數(shù)生成對(duì)象即可。

推薦教程:
Unity 中的 C# Instantiate() 方法解析

鍵盤上下左右移動(dòng)好做,只是不可以超過(guò)地圖格子需要進(jìn)行代碼判斷,或者使用碰撞墻。

推薦教程:
【Unity3D日常開發(fā)】(二)實(shí)現(xiàn)角色移動(dòng)行走之Transform、Rigidbody、CharacterController組件

這兩個(gè)有移動(dòng)的腳本,但是是付費(fèi)專欄,如果想看的話可以找我要離線版:
【Unity3D開發(fā)小游戲】《吃豆人》Unity開發(fā)教程

【Unity3D開發(fā)小游戲】《貪吃蛇》Unity開發(fā)教程

2-5、根據(jù)輸入不同的參數(shù),生成隨機(jī)地圖

這個(gè)根據(jù)參數(shù)生成隨機(jī)地圖,首先,需要先確定有幾行幾列,才能進(jìn)行排列。

然后維護(hù)一下地圖數(shù)據(jù)數(shù)組,地圖數(shù)據(jù)數(shù)組保存的信息是:

1個(gè)入口、x個(gè)普通道路、x個(gè)戰(zhàn)斗道路、x個(gè)普通房間、x個(gè)戰(zhàn)斗房間

根據(jù)傳遞進(jìn)來(lái)的參數(shù),如5個(gè)普通房間,2個(gè)戰(zhàn)斗房間,3個(gè)戰(zhàn)斗道路,那么這個(gè)數(shù)組就是:

In:入口
CommonRoom:普通房間
CombatRoom:戰(zhàn)斗房間
CombatRoad:戰(zhàn)斗道路
CommonRoad:普通道路
mapInfoNums=[In=1,CommonRoom=5,CombatRoom=2,CombatRoad=3,CommonRoad=0]

然后對(duì)于每一行每一列來(lái)說(shuō)。

隨機(jī)生成一個(gè)房間或者道路,然后在數(shù)組中判斷這個(gè)房間還是道路是否還有數(shù)量。

有的話生成,沒(méi)有的話再隨機(jī),直到數(shù)組中的所有值都為0停止。

當(dāng)然,這個(gè)先確定有幾行幾列,比如加起來(lái)才10個(gè)道路房間,直接1行10列也是不合理的。

所以,可以將所有的房間道路加起來(lái)取中位數(shù),作為行列的值即可。

推薦教程:
Unity數(shù)組Array筆記
Unity數(shù)組Array
Unity取隨機(jī)數(shù)的用法

三、案例參考

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++){/* 每一行的內(nèi)容都是逗號(hào)分隔,讀取每一列的值 */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"://戰(zhàn)斗道路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"://戰(zhàn)斗房間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、隨機(jī)生成地圖

//隨機(jī)生成地圖 普通房間 戰(zhàn)斗房間 普通道路 戰(zhàn)斗道路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://戰(zhàn)斗道路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://戰(zhàn)斗房間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、左右上下移動(dòng)

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);}}//判斷在不在格子內(nèi)private bool GemAt(Vector2 pos){foreach (Vector2 item in map.listPos){if (pos == item){return true;}}return false;} }

源代碼下載地址:
https://wwn.lanzoui.com/izWcYwnv81a

四、后言

你的點(diǎn)贊就是對(duì)博主的支持,有問(wèn)題記得留言:

博主主頁(yè)有聯(lián)系方式。

博主還有跟多寶藏文章等待你的發(fā)掘哦:

專欄方向簡(jiǎn)介
Unity3D開發(fā)小游戲小游戲開發(fā)教程分享一些使用Unity3D引擎開發(fā)的小游戲,分享一些制作小游戲的教程。
Unity3D從入門到進(jìn)階入門從自學(xué)Unity中獲取靈感,總結(jié)從零開始學(xué)習(xí)Unity的路線,有C#和Unity的知識(shí)。
Unity3D之UGUIUGUIUnity的UI系統(tǒng)UGUI全解析,從UGUI的基礎(chǔ)控件開始講起,然后將UGUI的原理,UGUI的使用全面教學(xué)。
Unity3D之讀取數(shù)據(jù)文件讀取使用Unity3D讀取txt文檔、json文檔、xml文檔、csv文檔、Excel文檔。
Unity3D之?dāng)?shù)據(jù)集合數(shù)據(jù)集合數(shù)組集合:數(shù)組、List、字典、堆棧、鏈表等數(shù)據(jù)集合知識(shí)分享。
Unity3D之VR/AR(虛擬仿真)開發(fā)虛擬仿真總結(jié)博主工作常見(jiàn)的虛擬仿真需求進(jìn)行案例講解。
Unity3D之插件插件主要分享在Unity開發(fā)中用到的一些插件使用方法,插件介紹等
Unity3D之日常開發(fā)日常記錄主要是博主日常開發(fā)中用到的,用到的方法技巧,開發(fā)思路,代碼分享等
Unity3D之日常BUG日常記錄記錄在使用Unity3D編輯器開發(fā)項(xiàng)目過(guò)程中,遇到的BUG和坑,讓后來(lái)人可以有些參考。

總結(jié)

以上是生活随笔為你收集整理的【Unity3D日常开发】Unity3D中数字网格类游戏Demo实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。