1. 程式人生 > >ue4 總結十一

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、測試時繪製的線一般是在服務端繪製