UE4 動態陣列 TArray容器

2022-06-26 15:03:14 字數 2982 閱讀 6432

為什麼使用ue4提供的容器類?

如果你用過c++的stl庫,你就知道stl提供了各種各樣的容器/資料結構,使得你對處理很多資料的時候非常快捷高效。ue4同樣也提供了類似的庫,庫裡面的型別是以t開頭的,使用ue4提供的容器庫可以更好地實現跨平台。所以在ue4進行開發的時候我們很少去使用stl容器,更多時候是使用ue4提供的容器。

如果你學過c++的模板,你就知道tarray是乙個模板型別,t是由我們指定的任意型別。比如你想建立乙個陣列元素都是int型別的動態陣列,那麼這個陣列型別就是tarray,類似的,你可以建立tarray、tarray等等,t甚至是可以是你自己建立的c++類。

tarray中所有資料元素都是t型別的,因此不能混合各種不同型別的元素進去這個容器。tarray沒有設計成被繼承的,所以不應該去繼承它。並且new/delete乙個tarray是危險的行為。當tarray的生命週期結束時(超出作用域),容器裡面的所有元素也會被銷毀。當你從另乙個tarray建立乙個新的tarray會複製所有資料元素到新的變數,而不會共享這些元素的記憶體。

為了建立乙個動態陣列,你可以這樣寫:

tarrayintarray;

注意,int32是32位整形,而int會根據機器不同而位元組不同,所以為了跨平台建議使用int32。
這時候,因為我們沒有資料填充到該陣列裡面,所以還沒有記憶體被分配。

1) tarray::init

在ue4的官方文件可以看到該函式的宣告:

void init(const elementtype & element, int32 number)

該函式用於設定陣列為number個,並且每個元素值的為element,例如:

intarray.init(10, 5);//

intarray == [10,10,10,10,10]

2) tarray::add

先來看該函式的宣告:

int32 add( const elementtype & item)

該函式用於新增新元素到動態陣列末尾。

3) tarray::emplace

先來看該函式的宣告:

templateint32 emplace( argstype &&... args)

該函式也是用於新增新元素到動態陣列末尾。示例:

tarraystrarr;strarr.add(text("

hello

"));strarr.emplace(text("

world

"));//

strarr == ["hello","world"]

雖然add和emplace都是新增新元素到動態陣列末尾,不過它們的內部實現是不同的:

在上面的示例中,add建立了乙個fstring臨時變數,然後傳遞給陣列,在陣列內部再次呼叫拷貝建構函式來複製這個fstring臨時變數。但是emplace使用了c++11的右值引用技術,它不會構造臨時變數,而是在陣列內部使用這個字串常量來建立fstring變數。因此,由於emplace少了一次拷貝建構函式操作,所以emplace會比fstring高效。但是由於add比emplace更具可讀性,如果是普通的c++內建型別(不會有拷貝建構函式的巨大開銷),建議使用add。

4) tarray::push

tarray::push提供了兩個一樣功能的過載函式可以分別代替add和emplace。所以無論何時使用push比add和emplace更加方便了:

void push( const elementtype & item )void push( elementtype && item )

通常迭代都至少有兩種方式,一種是使用索引,一種是使用迭代器。

1) 使用索引迭代動態陣列

為了練習我們的陣列,我們可以在靠近npc的函式中列印該陣列。我們將anpc::prox_implementation修改成如下**:

void

anpc::prox_implementation(

aactor*otheractor,

uprimitivecomponent*othercomp,

int32 otherbodyindex,

bool

bfromsweep,

const fhitresult &sweepresult

)

//獲得第一人稱控制器

aplayercontroller* pcontroller = getworld()->getfirstplayercontroller();

if(pcontroller)

}}

注意,每次除錯列印的資訊都在原來的除錯資訊上面,所以陣列裡面的內容依次是1、3、7,而不是7、3、1。

2) 使用迭代器迴圈陣列

void

anpc::prox_implementation(

aactor*otheractor,

uprimitivecomponent*othercomp,

int32 otherbodyindex,

bool

bfromsweep,

const fhitresult &sweepresult

)

//獲得第一人稱控制器

aplayercontroller* pcontroller = getworld()->getfirstplayercontroller();

if(pcontroller)

}}

在實際開發中,因為使用迭代器進行迭代更簡潔美觀,我們通常都會這樣進行迭代容器。

找到乙個元素是否在 tarray

尋找ue4容器是容易的。它通常使用find成員函式完成。使用前面建立的陣列,我們可以通過鍵入以下**行來找到值10的索引:

int index = array.find( 10 ); // would be index 3 in image above

ue4 動態載入資源

動態載入非藍圖資源 如 聲音等使用loadobject 資源型別 nullptr,text 資源路徑引用 載入藍圖資源 獲得藍圖類 loadclass 藍圖的型別 nullptr,text 資源路徑引用 c 這裡需要注意就是資源的路徑需要額外加上 c 例如uclass result1 loadcla...

ue4玻璃材質 UE4 材質

本文中,我們將首先討論基於物理的渲染,什麼是材質域,什麼是材質,什麼是材質例項,什麼是主材質,我們將討論材質的一些建議和禁忌。最後,我們將了解一些材質概念,你可以將其用於各類專案中的材質。pbr 表示基於物理的渲染,基於物理的渲染意味著我們根據現實模擬光線,而不是根據主觀想法模擬光線。光線的最終效果...

ue4集合型別 UE4 集合 TSet容器

一 tset是什麼 ue4中,除了tarray動態陣列外,還提供了各種各樣的模板容器。這一節,我們就介紹集合容器 tset。類似於tarray,尖括號裡面的t是模板型別,可以是任何c 型別。乙個集合表示了一組互不重複的資料元素。比如tset表示了一組float集合,tset表示了一組fstring集...