这是随手记得,很杂,在做的过程中一直改,还未整理,仅供参考
Ticker
原:FTicker,现:FTSTicker(即: Thread Safe)
一、
使用目的一为了不在异步线程中调用回调函数而先回到主线程再调用回调函数来确保安全性D:\UE5_3_release\UnrealEngine\Engine\Source\Runtime\Engine\Private\SaveGameSystem.cpp
void ISaveGameSystem::OnAsyncComplete(TFunction<void()> Callback)
{
// NB. Using Ticker because AsyncTask may run during async package loading which may not be suitable for save data
FTSTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateLambda(
[Callback = MoveTemp(Callback)](float) -> bool
{
Callback();
return false;
}
));
}
二、
需要注意的是此Tick是被TickEngine所调用,因此可能即使游戏在编辑器中停止,该函数也不会停止被调用,它仍会继续运行。
所以要么这就是你期望的,要么需要一个东西来动态的管理他的生命周期
ApplyRadialDamageWithFalloff
D:\UE5_3_release\UnrealEngine\Engine\Source\Runtime\Engine\Private\GameplayStatics.cpp
其中有一段代码
// query scene to see what we hit
TArray<FOverlapResult> Overlaps;
if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull))
{
World->OverlapMultiByObjectType(Overlaps, Origin, FQuat::Identity, FCollisionObjectQueryParams(FCollisionObjectQueryParams::InitType::AllDynamicObjects), FCollisionShape::MakeSphere(DamageOuterRadius), SphereParams);
}
他使用UE物理框架中的GeomOverlapMultiImp函数用来查询重叠,其核心函数是调用LowLevelOverlap。
而ApplyRadialDamageWithFalloff函数传递了FCollisionObjectQueryParams类型参数来用于对ObjectType通道进行查询,并且使用InitType::AllDynamicObjects我们可以去看构造函数
FCollisionObjectQueryParams(enum FCollisionObjectQueryParams::InitType QueryType)
{
switch (QueryType)
{
case AllDynamicObjects:
ObjectTypesToQuery = FCollisionQueryFlag::Get().GetAllDynamicObjectsQueryFlag();
break;
}
};
int32 GetAllDynamicObjectsQueryFlag()
{
return (AllObjectQueryFlag & ~AllStaticObjectQueryFlag);
}
在FCollisionQueryFlag构造函数中
FCollisionQueryFlag()
{
AllObjectQueryFlag = 0xFFFFFFFF;
AllStaticObjectQueryFlag = ECC_TO_BITFIELD(ECC_WorldStatic);
}
那么我们可以知道假如全部ObjectType为1111 1111而WorldStatic为0000 0001那么所有的DynamicObject为1111 1110而在FCollisionObjectQueryParams类中
void AddObjectTypesToQuery(ECollisionChannel QueryChannel)
{
ObjectTypesToQuery |= ECC_TO_BITFIELD(QueryChannel);
DoVerify();
}
void RemoveObjectTypesToQuery(ECollisionChannel QueryChannel)
{
ObjectTypesToQuery &= ~ECC_TO_BITFIELD(QueryChannel);
DoVerify();
}
我们可以知道所有的DynamicObject是ECollisionChannel中除ECC_WorldStatic、TraceQuery为1外的所有Object通道(个人观点:ECC_EngineTraceChannel暂不清楚,而ECC_GameTraceChannel以我来看也是不被包含在ObjectType中的,可以看下面的代码注释,以后会用代码进行测试`GameTraceChannel`)
// If ECollisionChannel entry has metadata of "TraceType = 1", they will be excluded by Collision Profile
// Any custom channel with bTraceType=true also will be excluded
// By default everything is object type
struct FCollisionQueryFlag
Custom Collision Channel confusion
Notice that bTraceType is set to true. This channel can now be used for traces in C++ and will also show up under Trace Type when modifying collision on an object.