使用九宮格的方式載入動態載入資源

2021-09-29 14:29:54 字數 3107 閱讀 8578

我在cadn上看了很多的關於unity的動態載入的大佬思路,我都是感覺思路很清晰,理論高大上,但是真的到我們自己去做的時候,才會發現其實不是很容易.我不如那些大佬,只寫了一點淺薄的動態載入地形的小指令碼

關於動態載入地形的方案大佬們都說了很多,我說說我的理解,地形是乙個很大塊的,我們如果直接載入會很卡,極大地消耗記憶體,所以我們需要減少記憶體的消耗,--------------這是需求

我們把大塊的地形進行切分,分為一小塊一小塊的,當我們攝像機發生移動後,就動態的改變周圍的地形塊,這樣當我們移動時,是只載入一部分的地形,這樣就節省了很大一部分的記憶體,而且這樣還不夠,我們在動態載入的地形上面還可以進行遮擋剔除,這樣如果不在攝像機範圍內的就進行剔除.

所有的大地形--------------------九宮格地形--------------------疊加進行遮擋剔除

這是解決方法

首先我們已經在層級檢視裡找到了我們利用外掛程式匯出的地形就像這樣

我們在層級檢視中建立乙個空物體來管理指令碼-這裡說一哈,你把指令碼掛在那裡都好,但是如果指令碼過多的話,最好還是有乙個專門用來管理指令碼的控制台,我就是這樣的

我們需要乙個主角-需要乙個觀察者,這個就有點哲學了,如果我不是我,那麼誰有是我,如果我不存在,那麼一切又有什麼意義呢?—哈哈這是個插曲 我們需要乙個主角 這個主角需要移動,視覺的旋轉,這個是很基本的方法,隨便寫乙個就好了

//觀察點移動

void

updateinput()

else

}

這個我也是摘錄的別人的**,但是有乙個缺點就是轉著轉著容易頭暈,好吧這不是重點,他只是乙個測試用來看看場景是不是動態載入的替身而已,說道替身,這個其實挺黑暗的東西,最早的替身是替死的身體,你看替這個子,兩個士大夫下面是個日–這不就是偷天換日的意思嗎,要兩個人才能進行-乙個是需要去替死的人,乙個是讓別人去死的人,好啦好啦,替身不重要

[

serializefield

]private

const

int v =8;

//在這裡決定是x*x的地形個數 根據格仔數來判斷

//主角或者說觀察者 你需要移動的實體

public

gameobject player;

//主角移動的速度

[serializefield

]private

float speed =

100;

//乙個一位陣列來放置所有地形資源

private terrain[

] chunkterrain =

newterrain

[(v * v)-1

];//乙個二維陣列來儲存地形的位置

private terrain[

,] numchunk =

newterrain[v

,v];

//地形的父物體 包含所有地形塊

private

gameobject terrainparent;

//所需要載入的地形 九宮格地形塊

private terrain[

] loadterrain =

newterrain[9

];

我用了二維陣列來存放地形比如numchunk[3,3]=地形的第三行第三列的terrain,這樣我們在給九宮格進行替換的時候方便

先上**–醜了別罵我啊,我是菜鳥

/// 

/// 將二維座標與地形塊進行繫結

///

/// 二維座標

/// 所有地形塊

void

shuzufuzhi

(terrain[

,] arg,terrain[

] tar)}}

///

/// 更新九宮格內的地形資料

///

///

///

void

updateterrain

(terrain[

,] arg,terrain[

] tar)

else}}

}}//全部隱藏

void

hideterrainchunk

(terrain[

,] arg)}}

///

/// 展示九宮格內的地形

///

/// 九宮格陣列

void

serializeloadterrain

(terrain[

] tar)

}

這裡主要就是乙個隱藏所有地形

展示九宮格地形

九宮格的地形資料更換

然後二維陣列與所有的地形進行繫結

//從目標物體y軸上方垂直向下發射一條射線,判斷自身在哪乙個地形塊上

string

rebackrayterrainname

(terrain[

] tearray)

else}}

}return

null

;}

,這樣我們的指令碼就寫完了,

其實我應該吧這幾個放在另乙個指令碼裡,讓資料與邏輯進行分離,這裡我也沒分開,主要是為了方便修改,有時間你們可以自行分離—畢竟這才是正道

這樣動態載入就完成了,我們還需要對地形進行遮擋剔除

首先將地形設定為靜態-static

然後開啟occlusion culling 的介面,

在層級試圖選擇我們的地形

修改occlusion culling 的介面的引數

然後就是bake 等一會就好了

當你需要看看遮擋剔除的效果時 可以選擇occlusion culling 的介面的第三個小介面這樣你就能看見你所搭建的小格仔

當然上面這個是提前進行bake操作的,還有一種不需要bake 直接進行動態烘焙的方法就是從攝像機發射射線進行檢測—可以用外掛程式來打到這樣的效果

具體操作請看這裡

其實我不會告訴你我還沒有做出來,等我做出來我再來更新,其實我覺得自己好笨,做出來的東西總是很多問題,看來以後需要加油了

android九宮格可分頁載入控制項

github位址 基本思路是viewpager gridview,每一頁viewpager檢視有乙個gridview,gridview載入九格。所以要保證資料的準確性。資料以list list t 的形式。控制項實現了高度自適應,根據控制項的個數,計算控制項的高度。內部的viewpager和grid...

自定義九宮格載入的實現

要完成自定義載入的九宮格的步驟 1 寫乙個類繼承viewgroup,同時實現他的構造方法,當然自己使用實現兩個就完全可以了,不要忘了viewgroup還有乙個必須實現的方法onlaout public classsudokuextendsviewgrouppublicsudoku context c...

Android中的九宮格

1 實現基類 1 item數量控制 private void ensureitems int count else if c count for int i 0 i getchildcount i 2 mearsure處理 override protected final void onmeasur...