国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源

這篇具有很好參考價值的文章主要介紹了在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

這個作業(yè)屬于哪個課程 軟件工程2022年春-F班
這個作業(yè)要求在哪里 軟件工程實(shí)踐總結(jié)&個人技術(shù)博客
這個作業(yè)的目標(biāo) 課程回顧、個人技術(shù)總結(jié)
其他參考文獻(xiàn) 《構(gòu)建之法》


一、技術(shù)概述

1.1 技術(shù)使用場景

??你不滿足于別人提供的現(xiàn)成的地圖,想要利用原有的素材來將你自己的想法實(shí)現(xiàn)嗎?或者你不知道如何獲取素材,不知道如何使用素材?在此發(fā)揮你天馬行空的想象力,用你的鼠標(biāo)和鍵盤來繪制自己的王國吧!

1.2 技術(shù)難點(diǎn)

??隨機(jī)資源生成算法的實(shí)現(xiàn)。(注:本人unity版本為2021.3.2f1c1,不同版本可能組件位置有所不同)

二、技術(shù)詳述

2.1 素材導(dǎo)入

??在項(xiàng)目中,點(diǎn)擊左上角菜單欄的window,可以看到子選項(xiàng)中有一個Asset Store。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??點(diǎn)擊它我們可以來到Unity資源商店尋找我們想要的資源,包括地圖、角色、道具、材質(zhì)等等,你幾乎可以在這里找到所想要的東西。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??點(diǎn)擊左上角的2D,并勾選上“環(huán)境”、“免費(fèi)資源”(能不花錢就不花錢啊喂),我們來挑選一張心儀的地圖,進(jìn)入資源詳情頁后,點(diǎn)擊“添加至我的資源”后選擇“在unity中打開”即可。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??選擇import,等待資源導(dǎo)入。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??可以看到左下角的項(xiàng)目文件已經(jīng)把素材導(dǎo)入進(jìn)來,現(xiàn)在我們可以開始創(chuàng)作了!
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源

2.2 編輯素材

??首先我們更改一下素材的配置,主要要更改一下素材每單位的像素點(diǎn)。我們可以看到我們的Scene界面有很多網(wǎng)格,一個格子就是一個Unit,這個Pixels Per Unit就是指一個格子中的像素點(diǎn),當(dāng)這個值過大,會讓每個單位格里面的東西變得很小,個人習(xí)慣將這個值調(diào)至16,當(dāng)然你可以自由選擇。Sprite Mode更改成Multiple,這會有利于我們后續(xù)對素材的切割和制作。更改后,記得點(diǎn)擊Apply應(yīng)用。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源

2.3 繪制地圖

??繪制地圖我們需要一個載體,右鍵左部空白位置,點(diǎn)擊2D Object -> Tilemap ->Rectangular ,生成一個Tilemap,供我們在上面制作地圖。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??我們還需要一個畫板,就跟畫家的調(diào)色板一樣,他們會在上面放上各種顏料,而我們需要在上面放上我們的素材,我們的畫板就是Tile Palette。點(diǎn)擊左上角的window -> 2D -> Tile Paletee,這時候我們彈出了一個窗口,這個就是我們的畫板,將素材(顏料)放在上面,我們才可以進(jìn)行我們的創(chuàng)作。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??我們可以看到這個素材包里面有現(xiàn)成的幫我們“調(diào)制”好的顏料,不過呢有的素材包是沒有的,為了能夠掌握地圖繪制的步驟,我們來重新“調(diào)制”一遍!點(diǎn)擊畫板中的Create New Palette,將新畫板的名字重命名,然后點(diǎn)擊Create,這時候會彈窗讓我們選擇一個保存位置,我們可以新建一個文件夾,隨便命名一下(我這里命名為Map),選擇該文件夾將該畫板保存到這個位置。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??不過現(xiàn)在你可以看到,我們的畫板上沒有任何的東西,我們現(xiàn)在需要將我們的素材切割好并導(dǎo)入,也就是調(diào)制我們的顏料。在素材詳情頁面點(diǎn)擊Sprite Editor,進(jìn)入素材編輯界面,點(diǎn)擊Type更改切割類型,選擇Grid By Cell Size,更改Pixel Size中x和y使之和我們之前定義的Pixels Per Unit數(shù)值一致,之后點(diǎn)擊slice,最后記得點(diǎn)擊右上角的Apply保存。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??這時我們可以使用素材中每個單元格來進(jìn)行地圖的繪制了!將素材拖入我們的Tile Palette中,選擇一個保存的文件夾(我們還是選擇放在Map文件夾中),等待導(dǎo)入,之后我們就會發(fā)現(xiàn),我們現(xiàn)在畫板上就已經(jīng)有了素材,而且它已經(jīng)被劃分成了一小格一小格的單位,這時候,我們便可以拿起我們的畫筆,正式開始創(chuàng)作!
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??讓我們用流程圖總結(jié)一下簡單地圖制作的過程!
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源

2.4 關(guān)于圖層

??圖層問題是一個需要長篇幅來敘述的功能,你可以利用圖層決定角色、水域、草地等元素的顯示優(yōu)先級以及碰撞等等一些細(xì)節(jié)的體現(xiàn),本博客止于地圖的簡單創(chuàng)建,接下來隨機(jī)生成物體的內(nèi)容需要你對諸如Tilemap的創(chuàng)建、預(yù)制體的創(chuàng)建等內(nèi)容有所了解,如果想對這些部分進(jìn)行學(xué)習(xí),可以查看本博客的參考內(nèi)容中的教程。

2.5 簡單的隨機(jī)資源生成

??我們首先創(chuàng)建一張地圖,將可生成資源的地塊劃分到一個圖層,剩下的劃分到另一個圖層。例如我這里將不可生成資源的地塊劃分到了unrandomground,可生成資源的地塊在randomground中。我們還需要準(zhǔn)備一些預(yù)制體,將這些預(yù)制體作為生成的資源。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??新建一個腳本,開始編寫代碼。思路如下流程圖所示:
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??首先做好前期準(zhǔn)備,保存我們需要隨機(jī)的資源:

  //需要隨機(jī)的資源
    public List<GameObject> resourceGrass = new List<GameObject>(); // 草
    public List<GameObject> resourceGravel = new List<GameObject>(); // 石頭
    public List<GameObject> resourceTree = new List<GameObject>(); // 樹木、灌木
    public List<GameObject> resourceWoodenConstruction = new List<GameObject>(); // 木制結(jié)構(gòu)
    public List<GameObject> resourceLithicalConstruction = new List<GameObject>(); // 石制結(jié)構(gòu)
    

    private Tilemap tilemap;
    private List<Vector3> randomGroundTileWorldPos = new List<Vector3>(); // 獲取可隨機(jī)的地塊
    private bool[] randomGroundTileHasEmptySlot; // 判斷地塊是否已占用,需要初始化

    private int randomGroundTileCount; // 隨機(jī)地塊數(shù)量
    private int resourcesGrassCount; // 草 數(shù)量
    private int resourcesGravelCount; // 碎石 數(shù)量
    private int resourcesTreeCount; // 樹木、灌木
    private int resourcesWoodConstructionCount; // 木制結(jié)構(gòu)數(shù)量
    private int resourcesLithicalConstructionCount; // 石制結(jié)構(gòu)數(shù)量

??初始化函數(shù),由于我們可以將腳本掛接在randomground下,因此保存所有地塊就相當(dāng)于保存了所有可隨機(jī)地塊:

 void InitializeTileMap() // 保存地圖的所有地塊
    {
        tilemap = GetComponent<Tilemap>();
        Vector3Int tmOrg = tilemap.origin;
        Vector3Int tmSz = tilemap.size;

        for (int x = tmOrg.x; x < tmSz.x; x++)
        {
            for (int y = tmOrg.y; y < tmSz.y; y++)
            {
                if (tilemap.GetTile(new Vector3Int(x, y, 0)) != null)
                {
                    Vector3 cellToWorldPos = tilemap.GetCellCenterWorld(new Vector3Int(x, y, 0));
                    randomGroundTileWorldPos.Add(cellToWorldPos);
                }
            }
        }
    }

??接著就開始生成資源,這里舉例生成草的函數(shù):

  void GenerateGrass(System.Random rm) // 生成草
    {
    	int aRandomTile;
        for (int i = 0; i < 150; i++) 
        {
			while(!randomGroundTileHasEmptySlot[aRandomTile])
            {
              	aRandomTile= rm.Next(0, randomGroundTileCount);
            }
            Vector3 spawnPos = randomGroundTileWorldPos[aRandomTile];
            int aRandomRes = rm.Next(0,resourcesGrassCount);
           	GameObject spawnRes = resourceGrass[aRandomRes];
            Instantiate(spawnRes, spawnPos, Quaternion.identity);
            randomGroundTileHasEmptySlot[aRandomTile] = false;
        }
    }

??編寫完代碼后,將腳本掛在randomground下,將需要生成的資源以預(yù)制體的形式拖入,點(diǎn)擊運(yùn)行,就可以得到我們想要的效果
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??不過我們發(fā)現(xiàn),當(dāng)物體較多時,生成的速率會變慢,這是因?yàn)槲覀冇靡粋€數(shù)組去存儲地塊的生成資源情況會使得在地塊稀少時尋找可利用地塊耗時增加,我們可以改進(jìn)一下,將生成過資源的地塊直接從我們保存地塊的列表之中移出,代碼如下:

void GenerateTree(System.Random rm) // 生成樹木、灌木
    {
        for (int i = 0; i < 100; i++) // 生成樹木和灌木
        {
            randomGroundTileCount = randomGroundTileWorldPos.Count; // 隨機(jī)地塊數(shù)量
            int aRandomTile = rm.Next(0, randomGroundTileCount);

            Vector3 spawnPos = randomGroundTileWorldPos[aRandomTile];

            int aRandomRes = rm.Next(0, resourcesTreeCount);
            GameObject spawnRes = resourceTree[aRandomRes];
            Instantiate(spawnRes, spawnPos, Quaternion.identity);

            randomGroundTileWorldPos.Remove(spawnPos);
        }
    }

??可以發(fā)現(xiàn)效率較上一種方法高的多。

三、可能遇到的問題以及解決方案

3.1 素材問題

Q:Unity商店里有我很喜歡的素材,但是賣的很貴怎么辦?
A:
??如果只是新手練手使用,可以由tb或者pdd等渠道獲取,但如果要用于商業(yè),必須由本人在版權(quán)方所提供的渠道購買(Unity商店),否則會有侵權(quán)的問題。不過Unity商店提供的素材經(jīng)常有大力度的打折,你可以收藏下你喜歡的素材等打折時購買。這里推薦一個B站Up主Lee哥的游戲開發(fā)加油站,他經(jīng)常發(fā)一些優(yōu)質(zhì)且有很大折扣的Unity素材,可供參考。

Q:我在切割素材時,有些按Grid By Cell Size類型切割并不能得到我想要的效果?
A:
??可以嘗試著選擇其他類型的切割方式,或者是調(diào)整一下每個單元格的像素量,素材質(zhì)量有高有低,有時還需要自己微調(diào)。

3.2 地圖制作問題

Q:我明明給地圖某些部分添加了碰撞體積,但是子彈能穿過去?
A:
??地圖的碰撞體積一般由如下圖三部分構(gòu)成,選擇Composite Collider 2D中的Geometry Type(指定復(fù)合碰撞體生成的幾何體的類型),將其設(shè)為Polygons(設(shè)置符合碰撞體,以便為由凸多邊形組成的合并碰撞體集合體生成封閉輪廓),然后在子彈的碰撞體積中,設(shè)置Rigidbody 2D的Collision Detection為Continuous(連續(xù)檢測,防止對象穿過所有靜態(tài)碰撞體)
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
??可參考Unity-Rigidbody組件、Unity官方文檔-GeometryType。

3.3 隨機(jī)生成資源問題

Q:生成的物體位置與我設(shè)想的不一致?
?? 正常情況下樹木如果在它腳下這塊石板上生成,應(yīng)該會是如下圖所示,但實(shí)際會往下偏移
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
A: 這是預(yù)制體的錨點(diǎn)問題,在sprite Editor中將對應(yīng)物體的錨點(diǎn)往下移動即可。
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
Q:生成的物體圖層有問題,例如樹木后面的物體應(yīng)該是被遮蔽的,事實(shí)卻不是如此?
A:
??點(diǎn)擊Edit選擇ProjectSettings,在Graphics中選擇Transparency Sort Mode,將其置為Custom Axis,此時在同一圖層上,物體會根據(jù)所處的Y值排序,即Y值越高,顯示優(yōu)先級越靠后,便解決了該問題

在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源
在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源

四、總結(jié)

??Unity的地圖制作是新手入門Unity的必學(xué)操作之一,其難度并不高,主要依靠學(xué)者的細(xì)心和耐心。關(guān)于資源的隨機(jī)生成本博客只是提供了一個簡單的辦法,實(shí)際上關(guān)于隨機(jī)地圖的生成有其他更深入的研究,包括限制資源生成范圍、地形的生成,甚至可以做到地圖全隨機(jī)而不用自己先搭建出一個框架,涉及到了各種模型分析和數(shù)值計算。學(xué)無止境,不可止步于此。

五、參考內(nèi)容

1、如何在Tilemap上隨機(jī)生成資源——bilibili
2、Unity2018教程2D入門——bilibili
3、Unity官方用戶手冊文章來源地址http://www.zghlxwxcb.cn/news/detail-401436.html

到了這里,關(guān)于在Unity中簡單地制作一張2D地圖并隨機(jī)生成資源的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 從零開始入門創(chuàng)作游戲——2D沙盤類隨機(jī)地圖的生成

    從零開始入門創(chuàng)作游戲——2D沙盤類隨機(jī)地圖的生成

    如果想做類似于泰拉瑞亞的沙盤游戲,首先需要生成隨機(jī)的地圖。 首先需要確定地圖大小和磚塊元素 1、地圖所需基本參數(shù) 因?yàn)橹挥械谝淮伍_始時會生成地圖,所以可以刪除update函數(shù) 2、磚塊元素 為了簡單,直接創(chuàng)建方塊元素來代替游戲磚塊。在資源欄右鍵創(chuàng)建即可。默認(rèn)白

    2024年02月05日
    瀏覽(20)
  • 【簡單詳細(xì)】Unity生成地形和UI小地圖實(shí)時展示人物位置的詳細(xì)制作過程

    【簡單詳細(xì)】Unity生成地形和UI小地圖實(shí)時展示人物位置的詳細(xì)制作過程

    效果: 注意:一個 父物體 Map是一個純白色image,放到左上角,要加 Mask組件 哦?。?! ? ? ? 它的 兩個子物體, 其中一個(map)是顯示出地圖紋理的image,另外一個(mapPlayer)是一個小點(diǎn),我們也用image來表示,也就是效果圖上的 綠點(diǎn) 。 ? ? 我們把人物放進(jìn)去,掛載腳本

    2024年02月05日
    瀏覽(20)
  • Unity 關(guān)于制作一個2D的小地圖

    Unity 關(guān)于制作一個2D的小地圖

    實(shí)際效果: ? 需求:1.實(shí)現(xiàn)右上角小地圖,實(shí)現(xiàn)同步本地地圖 ? ? ? ? ? 2.實(shí)現(xiàn)小地圖內(nèi)的角色圖標(biāo)和實(shí)際角色同步 實(shí)現(xiàn)原理: 1.在所需要的地圖上劃分為一下結(jié)構(gòu) 圖層Tilemap6_Minimap的Layer為Minimap 同時這里說一個問題,在同層級的圖片,序列越晚渲染越上層 2.使用另一個攝像

    2024年02月14日
    瀏覽(30)
  • unity2d實(shí)現(xiàn)一個全方位的無限隨機(jī)地圖

    要實(shí)現(xiàn)一個全方位的無限隨機(jī)地圖,可以考慮以下步驟: 1.創(chuàng)建一個空的場景,并添加一個相機(jī)和一個玩家對象。 2.創(chuàng)建一個TileMap,它將作為你的地圖板塊。你可以使用隨機(jī)數(shù)生成算法生成各種類型的地形,如森林、草地、沙漠等等,并使用TileMap將它們組裝在一起來創(chuàng)建你

    2024年02月07日
    瀏覽(23)
  • unity如何制作隨機(jī)生成器

    隨機(jī)生成器的制作至少應(yīng)具備四個個要素:需要隨機(jī)生成的物體、物體隨機(jī)生成的間隔時間、每生成一次的物體個數(shù)、一定時間后銷毀物體。 其中最關(guān)鍵的問題是如何間隔一定時間生成,這里提供兩種思路:1.運(yùn)用協(xié)程。2.做個計時器。 在這里我們需要初步了解一下協(xié)程。

    2023年04月09日
    瀏覽(50)
  • 【unity實(shí)戰(zhàn)】隨機(jī)地下城生成2——繪制地圖Tilemap的使用及一些技巧的使用(含源碼)

    【unity實(shí)戰(zhàn)】隨機(jī)地下城生成2——繪制地圖Tilemap的使用及一些技巧的使用(含源碼)

    參考原視頻鏈接: 【視頻】:https://space.bilibili.com/370283072 注意 :本文為學(xué)習(xí)筆記記錄,推薦支持原作者,去看原視頻自己手敲代碼理解更加深入 修改素材配置 切割圖片 繪制瓦片地圖 先新建我們的調(diào)色盤,保存好位置 拖入我們剛才切片好的素材 在房間預(yù)設(shè)體創(chuàng)建我們的瓦

    2024年02月13日
    瀏覽(22)
  • 13.Unity2D 橫版 可上下左右移動的雙向平臺(雙向行走+可移動+單獨(dú)判定)+隨機(jī)平臺生成

    13.Unity2D 橫版 可上下左右移動的雙向平臺(雙向行走+可移動+單獨(dú)判定)+隨機(jī)平臺生成

    ? ? 總目錄 https://blog.csdn.net/qq_54263076/category_11900070.html?spm=1001.2014.3001.5482 大多數(shù)平臺教程全是碰撞體的可移動平臺,并沒有可跳上的平臺,并且要求按下鍵會從平臺上跳下來。有也只是通過控制平臺的“2D平臺效果碰撞體”組件的單向平臺的旋轉(zhuǎn)偏移來做,但是這樣會 出現(xiàn)一

    2024年02月04日
    瀏覽(21)
  • 10.Unity2D 橫版 簡單AI 之 敵人隨機(jī)移動+自動巡邏+障礙物跳躍+懸崖處轉(zhuǎn)身+射線檢測

    10.Unity2D 橫版 簡單AI 之 敵人隨機(jī)移動+自動巡邏+障礙物跳躍+懸崖處轉(zhuǎn)身+射線檢測

    總目錄 9.Unity2D 簡單AI 之 敵人跳躍條件優(yōu)化+自動范圍內(nèi)檢測敵人發(fā)起攻擊(索敵)+對象池優(yōu)化+主角受傷死亡_ζ?? ??霧 ??狼 ???的博客-CSDN博客 Unity2D 簡單AI 之 敵人跳躍條件優(yōu)化+自動范圍內(nèi)檢測敵人攻擊+敵人二連擊。在敵人預(yù)制體下,創(chuàng)建空物體EnemyCanAttack,改成不

    2023年04月20日
    瀏覽(61)
  • 【Live2d】一張圖制作Live2d基本臉捕動畫(下)

    【Live2d】一張圖制作Live2d基本臉捕動畫(下)

    上一篇講了CubismEditor(CE)的基本操作和動畫設(shè)置,接下來就是正式的臉捕設(shè)置的創(chuàng)作了 由于立繪是睜開眼的,如果需要讓他閉眼,需要自己手繪2個眼瞼,一個上眼瞼,一個下眼瞼 (如果是自己的OC那就叫畫師幫忙畫一下和記得分層) ?我這種圖像由于眼睛附近的顏色都是一

    2024年02月03日
    瀏覽(41)
  • 利用envi與arcmap/arcgisPro制作一張植被覆蓋指數(shù)專題地圖(地圖學(xué)作業(yè))

    利用envi與arcmap/arcgisPro制作一張植被覆蓋指數(shù)專題地圖(地圖學(xué)作業(yè))

    本篇文章是作者的第一篇文章,對于軟件的使用和對專業(yè)知識的了解都很淺薄,作為遙感專業(yè)的入門級玩家,我認(rèn)為發(fā)布一篇博客來記錄自己的學(xué)習(xí)過程與成果是很有必要的,一是可以重新梳理完成學(xué)習(xí)任務(wù)的基本思路,二是總結(jié)完成這次任務(wù)中自己的收獲并鞏固提高,三是

    2023年04月25日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包