void UWorld::SetupPhysicsTickFunctions(float DeltaSeconds) { StartPhysicsTickFunction.bCanEverTick = true; StartPhysicsTickFunction.Target = this; EndPhysicsTickFunction.bCanEverTick = true; EndPhysicsTickFunction.Target = this; StartClothTickFunction.bCanEverTick = true; StartClothTickFunction.Target = this; EndClothTickFunction.bCanEverTick = true; EndClothTickFunction.Target = this; // see if we need to update tick registration bool bNeedToUpdateTickRegistration = (bShouldSimulatePhysics != StartPhysicsTickFunction.IsTickFunctionRegistered()) || (bShouldSimulatePhysics != EndPhysicsTickFunction.IsTickFunctionRegistered()) || (bShouldSimulatePhysics != StartClothTickFunction.IsTickFunctionRegistered()) || (bShouldSimulatePhysics != EndClothTickFunction.IsTickFunctionRegistered()); if (bNeedToUpdateTickRegistration && PersistentLevel) { if (bShouldSimulatePhysics && !StartPhysicsTickFunction.IsTickFunctionRegistered()) { StartPhysicsTickFunction.TickGroup = TG_StartPhysics; StartPhysicsTickFunction.RegisterTickFunction(PersistentLevel); } else if (!bShouldSimulatePhysics && StartPhysicsTickFunction.IsTickFunctionRegistered()) { StartPhysicsTickFunction.UnRegisterTickFunction(); } if (bShouldSimulatePhysics && !EndPhysicsTickFunction.IsTickFunctionRegistered()) { EndPhysicsTickFunction.TickGroup = TG_EndPhysics; EndPhysicsTickFunction.RegisterTickFunction(PersistentLevel); EndPhysicsTickFunction.AddPrerequisite(this, StartPhysicsTickFunction); } else if (!bShouldSimulatePhysics && EndPhysicsTickFunction.IsTickFunctionRegistered()) { EndPhysicsTickFunction.RemovePrerequisite(this, StartPhysicsTickFunction); EndPhysicsTickFunction.UnRegisterTickFunction(); } //cloth if (bShouldSimulatePhysics && !StartClothTickFunction.IsTickFunctionRegistered()) { StartClothTickFunction.TickGroup = TG_StartCloth; StartClothTickFunction.RegisterTickFunction(PersistentLevel); } else if (!bShouldSimulatePhysics && StartClothTickFunction.IsTickFunctionRegistered()) { StartClothTickFunction.UnRegisterTickFunction(); } if (bShouldSimulatePhysics && !EndClothTickFunction.IsTickFunctionRegistered()) { EndClothTickFunction.TickGroup = TG_EndCloth; EndClothTickFunction.RegisterTickFunction(PersistentLevel); EndClothTickFunction.AddPrerequisite(this, StartClothTickFunction); } else if (!bShouldSimulatePhysics && EndClothTickFunction.IsTickFunctionRegistered()) { EndClothTickFunction.RemovePrerequisite(this, StartClothTickFunction); EndClothTickFunction.UnRegisterTickFunction(); } } FPhysScene* PhysScene = GetPhysicsScene(); if (PhysicsScene == NULL) { return; } #if WITH_PHYSX // When ticking the main scene, clean up any physics engine resources (once a frame) DeferredPhysResourceCleanup(); #endif // Update gravity in case it changed FVector DefaultGravity( 0.f, 0.f, GetGravityZ() ); static const auto CVar_MaxPhysicsDeltaTime = IConsoleManager::Get().FindTConsoleVariableDataFloat(TEXT("p.MaxPhysicsDeltaTime")); PhysScene->SetUpForFrame(&DefaultGravity, DeltaSeconds, UPhysicsSettings::Get()->MaxPhysicsDeltaTime); }