Сбой указателя объекта в UE4 из-за поведения конечного автомата

#c #unreal-engine4

#c #unreal-engineer4

Вопрос:

Я пытаюсь создать поведение конечного автомата, и, похоже, я не могу разобраться с UE4s c . Здесь я инициализирую свои состояния и устанавливаю его в SMB

 ATryEM::ATryEM()
{

    PrimaryActorTick.bCanEverTick = true;
    MyStateMachineBehaviour = NewObject<UMyStateMachineBehaviour>();
    testState = NewObject<UMyState>();
    otherState = NewObject<UMyState>();

    if(ensure(testState))
    MyStateMachineBehaviour->Init(testState);
    
}

// Called when the game starts or when spawned
void ATryEM::BeginPlay()
{
    Super::BeginPlay();
    ChangeState();
}

void ATryEM::ChangeState()
{
    if (ensure(otherState))
        MyStateMachineBehaviour->ChangeState(otherState);
}
  

Вот как выглядит мой SMB

 
#include "MyStateMachineBehaviour.h"

UMyStateMachineBehaviour::UMyStateMachineBehaviour()
{
    CurrentState = nullptr;
}

void UMyStateMachineBehaviour::Init(UMyState* initState)
{
    if(initState)
    {
        CurrentState = initState;
        CurrentState->Enter_State();
    }
}

void UMyStateMachineBehaviour::ChangeState(UMyState* newState)
{
    CurrentState->Exit_State();
    if (newState)
    {
        CurrentState = newState;
        CurrentState->Enter_State();
    }
}

void UMyStateMachineBehaviour::UpdateState()
{
    if(CurrentState)
    CurrentState->Exit_State();
}
  

и состояния просто имеют инструкцию debug.

Комментарии:

1. Вы создаете объекты без каких-либо внешних элементов, скорее всего, они собираются как мусор.

2. внешний в смысле? Не могли бы вы уточнить? @Rotem

3. Попробуй NewObject<UMyState>(this); . Дайте ему что-то вроде родителя, который владеет им, чтобы он не получил GC’ed.