你的浏览器不支持canvas

让我们携手共创奇迹!

源码

Date: Author: LBD

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自WindCrazy

这是随手记得,很杂,在做的过程中一直改,还未整理,仅供参考

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);
}

那么我们可以知道假如全部ObjectType1111 1111WorldStatic0000 0001那么所有的DynamicObject1111 1110而在FCollisionObjectQueryParams类中

void AddObjectTypesToQuery(ECollisionChannel QueryChannel)
{
    ObjectTypesToQuery |= ECC_TO_BITFIELD(QueryChannel);
    DoVerify();
}

void RemoveObjectTypesToQuery(ECollisionChannel QueryChannel)
{
    ObjectTypesToQuery &= ~ECC_TO_BITFIELD(QueryChannel);
    DoVerify();
}

我们可以知道所有的DynamicObjectECollisionChannel中除ECC_WorldStaticTraceQuery为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.


对于本文内容有问题或建议的小伙伴,欢迎提出问题