ue4 總結十一
1、對於多人遊戲,AI控制只受服務端的管理,客戶端無需進行尋路計算,所以這些邏輯全部放到服務端
2、有時候看不到某些actor效果很可能是由於立即Destroy造成的,這是很常見的bug
3、求出物體向目標點倒下30度
4、判斷一個Tarray的某個元素是否存在
不對(程式會崩):
if (TOuterItemMgrArray[0])
正確(原因:萬一TOuterItemMgrArray不存在就會崩,該函式做了判斷):
if (TOuterItemMgrArray.IsValidIndex(0))
5、
TSubclassOf轉UObject*: 使用->GetDefaultObject()方法
TSubclassOf轉UClass* : 前面加*
6、
UObject
為物件系統的基類。類層次為:
UObjectBase
UObjectBaseUtility
UObject
UClass
C++語言不像C#,Java那樣提供完整的反射功能,我們需要定義一個數據結構(UClass)來描述C++中的類資訊,這個資料結構也稱為類的元資料。當然在UE4中UClass例項不僅僅用於描述C++(Native)類,也用來描述Blueprint生成的類。
類繼承層次:
UObject UField UEnum UProperty UBoolProperty UEnumProperty UNumericProperty UObjectProperty ... UStruct UClass UFunction UScriptStruct
連結:https://www.jianshu.com/p/1f2de6ea383c
7、
template <typename ElementType, typename IteratorType> struct TDereferencingIterator { explicit TDereferencingIterator(IteratorType InIter) : Iter(InIter) { } FORCEINLINE ElementType& operator*() const { return *(ElementType*)*Iter; } }
這裡ElementType&是返回值型別,因此返回ElementType的指標前面加個*,也即返回類本身
8、EditAnyWhere和EditDefaultsOnly的區別
如果一個UPERPROTY設為EditAnyWhere,該藍圖類拖到場景中,修改藍圖的這個變數,場景中的變數不會改變,場景中的儲存以前的變數,
如果一個UPERPROTY設為EditDefaultsOnly,該藍圖類拖到場景中,修改藍圖的這個變數,場景中不能配置該變數,全部讀取藍圖中的變數
9、在BeginPlay設定一些變數可能失效
解決方法:
delay 0.2秒再設定
10、TimeLine在同步時記得勾選Replicated
11、用於防止同步抖動的騷方法
//每一幀都更新rotation
if (fDeltaTimeServer>0.0f)
{
float fTimeSecondsDelay = UGameplayStatics::GetGameState(GetWorld())->GetServerWorldTimeSeconds() - UGameplayStatics::GetTimeSeconds(GetWorld());
fDeltaTimeServer = UKismetMathLibrary::FMax(fDeltaTimeServer, fTimeSecondsDelay);
}
else
{
fDeltaTimeServer = UGameplayStatics::GetGameState(GetWorld())->GetServerWorldTimeSeconds() - UGameplayStatics::GetTimeSeconds(GetWorld());
}
float fTimeSecondsAddTimeServer = UGameplayStatics::GetTimeSeconds(GetWorld()) + fDeltaTimeServer;
12、相機和物體發生碰撞bug:
解決方法:把物體對相機的碰撞改成overlap
13、SplineComponent
如果讓一個物體沿著曲線軌跡運動,使用該元件,在場景中選中該元件的頂點,按alt+滑鼠左鍵脫出下一段軌跡
在藍圖中,這樣讓物體沿軌跡運動
14、DestructiableComponent的Overlap事件和StaticMeshComponent的OverLap事件效果不太一樣,
DestructiableComponent的Overlap事件:
人撞到物體觸發
物體撞到人不觸發
StaticMeshComponent的OverLap事件:
人撞到物體觸發
物體撞到人觸發
解決方法:在DestructiableComponent下面再放個StaticMeshComponent,觸發事件全部呼叫StaticMeshComponent裡的Overlap
15、對於可破碎物體,如果破碎後禁掉碰撞,記得一定在fracture回撥函式中禁用碰撞,不能用自己函式多播禁
16、對於粒子特效,在播放時候呼叫SetActive函式
記得在粒子特效藍圖中取消勾選Auto Active,否則,特效一開始進入就播放
17、用vs編譯熱載入ue編輯器有時會出現一些bug,需要用vs啟動
18、有時開啟一個c++檔案,顯示已被刪除或被remame,無法開啟
解決方法:專案重新generate
19、檢測牆後面的玩家不受到爆炸傷害
做法:
使用LineTraceForObejct方法,檢測兩點之間(人物和爆炸桶)做一條射線是否有物體ObjectType為某個列舉,比如牆的ObjectType設為WorldStatic,就會返回true,輸出的hit儲存射線碰撞點的相關資訊,可以獲取到碰撞到碰撞到的actor,component等相關資訊。
Obeject Type在這裡設:
20、將碰撞通道轉換為ObjectType:
TArray <TEnumAsByte<EObjectTypeQuery>> WorldStaticObjectTypes;
WorldStaticObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldStatic));
也即這句話
UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldStatic
21、測試時繪製的線一般是在服務端繪製