提到沙盒型別的遊戲,就有人給出了這樣的定義:
遊戲世界離現實世界越近,自由度、隨機度越高才叫沙盒遊戲。所謂自由度,就是你在遊戲裡想幹啥就幹啥,想開車就開車,想走路就走路。想蓋房子就蓋房子,沒有城管來找你麻煩。那麼隨機度,就是每天發生的事情不能一樣,做的任務也不會就一條線路可走。
在我的沙盒遊戲裡,地形上的樹木,岩石等都是隨機生成的,這樣不同的人玩的地圖都會不一樣。當然如果最後能做到地形也隨機生成那就更完美了。
下面我就講下樹木隨機生成在地圖上的原理。
在unity3d裡要想動態生成乙個gameobject,那需要使用instantiate函式載入樹木的模型元件到指定的座標位置上。
我們的實現步驟如下:
1.在unity3d裡的assets目錄下建立prefabs資料夾,然後在其中建立resources(重要:不然無法用**動態載入)子資料夾,再把樹木的模型預製件放入其中。
2.使用instantiate函式動態載入樹木預製件
var itemresource = resources.load("tree"+i); //i是可變隨機數
gameobject itemobj =instantiate(itemresource, new vector3(x, y, z), quaternion.identity) as gameobject;
3.使用迴圈改變i的值,以及改變x,y,z的值。
要注意的是i的值範圍,要和樹木預製件的編號匹配。x,y,z的值也要控制在地圖地形空間範圍內。
按照這樣的思路,我們很快就能隨機生成樹木了。但是仔細想想這樣就可以了麼?我們的x,y,z是隨機的座標值,其中y的值是遊戲世界裡的高度值。如果y的值隨機出來的值過大或者過小(相對於地表高度而言),那麼就悲劇了,樹木不是長在天上,就是長在地底下。
怎麼才能讓樹木剛好長在地表高度上呢?這是我們遇到的難點問題。如果有乙個函式剛好能找到隨機出的座標位對應的y軸線和地標相交接的那個點的y的值就好了。通俗的講,就是要獲取,方位在x,z時,地表所在的y值。
按照這個思路我們就找到了乙個函式,求指定座標對應地面高度的函式:terrain.activeterrain.sampleheight(position)。
這樣我們就得到地表對應的y的值了:y=terrain.activeterrain.sampleheight(new vector3(x,y,z))。
剩下的時間就是碼**的時間了,把核心難題解決了,後面的就簡單了。不過需要注意的是,如果地形不是用terrain元件來建立的,而是用的美工模型的話,就需要使用射線(ray)來找到射線和地標相交的點。
Unity3D遊戲開發
入門級unity安裝教程 一 unity五大面板 unity3d的介紹 1 介面 選單 面板 元件 unity5.x 編輯器介紹 unity開啟篇 一 滑鼠右鍵 wsadeq前後左右上下移動 shift加速移動 滑鼠右鍵旋轉檢視 滑鼠中鍵移動檢視 alt 右鍵縮放 alt 左鍵旋轉物體視角 q移動場...
Unity3D遊戲開發初探
1 如何在遊戲指令碼程式中建立物件而不是一開始就建立好物件?使用gameobject的靜態方法 createprimitive view code 其中在createcube方法中,使用gameobject.createprimitive方法來建立cube型別的遊戲物件例項,設定了它出現的座標並為它...
Unity 3D遊戲開發導學
策劃 美工軟體工程師 測試工程師 客服等.unity是一款遊戲引擎 遊戲引擎 一款遊戲最最最核心的 程式框架。包含以下系統 渲染引擎,物理引擎,碰撞檢測系統,音效,指令碼引擎,動畫系統,人工智慧,網路引擎,以及場景管理。使用遊戲引擎,開發者可以重用已有的核心技術,將精力集中在遊戲邏輯和設計上,從而簡...