1st way: FTickableGameObject

The object inherited from UObject would not trigger Tick when instanced (NewObject<UObject>()), but AActor and the UActorComponent would trigger Tick.

So how to trigger Tick of the object inherited from UObject?
The answer is: inherit FTickableGameObject and UObject at the same.

Example source
header:

UCLASS()
class UCoolDownMgr : public UObject, public FTickableGameObject
{
    GENERATED_BODY()
public:
    // Sets default values for this character's properties
    UCoolDownMgr();
    virtual ~UCoolDownMgr();
 
    // Begin FTickableGameObject Interface.
    virtual void Tick(float DeltaTime) override;
    virtual bool IsTickable() const override;
    virtual TStatId GetStatId() const override;
    // End FTickableGameObject Interface.
    
private:
    
    //because engine would construct inner object when game load package (before game start), so we need to add a flag to identify which one need to be constructed on game running.
    bool bIsCreateOnRunning = false;
};

cpp:

UCoolDownMgr::UCoolDownMgr()
{
    bIsCreateOnRunning = GIsRunning;
}

void UCoolDownMgr::Tick(float DeltaTime)
{
    //Don't invoke Super::Tick(), otherwise would link failed!!!
    //Super::Tick(DeltaTime);
}
 
bool UCoolDownMgr::IsTickable() const
{
    //notify engine to ignore Tick of the object construction before game running.
    return bIsCreateOnRunning;
}
TStatId UCoolDownMgr::GetStatId() const
{
    return UObject::GetStatID();
}

Because engine would construct inner object when game load package (before game start), so we need to add a flag (bIsCreateOnRunning) to identify which one is construct on game running.

Reference:
https://blog.csdn.net/yangxuan0261/article/details/52093573

2nd way: FTickerDelegate

header:

/** Delegate for callbacks to Tick */
FTickerDelegate TickDelegate;

/** Handle to various registered delegates */
FDelegateHandle TickDelegateHandle;

cpp:

TickDelegate = FTickerDelegate::CreateUObject(this, &UMyObject::MyTick);
TickDelegateHandle = FTicker::GetCoreTicker().AddTicker(TickDelegate);

Tick function:

bool UMyObject::MyTick(float DeltaSeconds)
{
}

生活总是这样,不能叫人处处都满意。但我们还要热情地活下去。人活一生,值得爱的东西很多,不要因为一个不满意,就灰心。