I am trying to implement a timer in a simple C++ class。
I compiled the project with vs2022 and received an error message
1>[1/5] Compile CTickMgr.cpp
1>D:\Program Files\Epic Games\UE_5.1\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h(516): error C2338: static_assert failed: ‘You cannot use UObject method delegates with raw pointers.’
Here is my code implementation:
CTickMgr.h
#include "TimerManager.h"
#include "GameFramework/Actor.h"
#include "Engine/World.h"
#include "Engine/GameInstance.h"
#include "EngineUtils.h"
class CTickMgr
{
public:
CTickMgr();
virtual ~CTickMgr();
void OnTick();
static CTickMgr* Inst();
void Init(FTimerManager& TimerManager);
FTimerHandle TimerHandle;
};
CTickMgr.cpp
static CTickMgr* g_pTickMgr = NULL;
CTickMgr::CTickMgr()
{
}
CTickMgr::~CTickMgr()
{
}
void CTickMgr::Init(FTimerManager& TimerManager)
{
TimerManager.SetTimer(TimerHandle, FTimerDelegate::CreateUObject(this, &CTickMgr::OnTick), 0.01, true);
}
void CTickMgr::OnTick()
{
UE_LOG(LogTemp, Error, TEXT("CTickMgr::OnTick"));
}
CTickMgr* CTickMgr::Inst()
{
if (NULL != g_pTickMgr)
g_pTickMgr = new CTickMgr();
return g_pTickMgr;
}
MyGameMode.cpp
void MyGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
Super::InitGame(MapName, Options, ErrorMessage);
FTimerManager& TimerManager = GetWorld()->GetTimerManager();
CTickMgr::Inst()->Init(TimerManager);
}