언리얼엔진에서 만약 BehaviorTree AI를 사용했을때
그냥 currentTime을 선언한후 DeltaSeconds에 누적하여 그 currentTime에 따라 task의 실행을 좌우했엇다
하지만 이런경우 AI가 여러마리인 경우 CurrentTime의 누적이 일어나 훨씬 빠른
주기를 가져버리는 현상이 일어난다
이럴때는 currentTime이 아닌 Struct로 따로 메모리에 변수를 가지고
그변수에 따라 값을 조절하면된다
사용하고있는 태스크에 위쪽에 USTRUCT형식으로 메모리변수를 선언
USTRUCT()
struct FTaskSkeletonAttackMemory
{
GENERATED_BODY()
float structCurrentTime = 0.0f;
float randomEndTime;
};
ExcuteTask에서 초기화를 시켜준뒤
FTaskSkeletonAttackMemory* taskMemory = reinterpret_cast<FTaskSkeletonAttackMemory*>(nodeMemory);
taskMemory->structCurrentTime = 0.0f;
TickTask에서 currentTime대신 이 struct에서 선언한 structCurrentTime을 deltaSecond에 누적
FTaskSkeletonAttackMemory* taskMemory = reinterpret_cast<FTaskSkeletonAttackMemory*>(nodeMemory);
taskMemory->structCurrentTime += deltaSeconds;
조건을 structCurrentTime으로 변경
if (!onceAttackFlag)
{
if (taskMemory->structCurrentTime > 0.0f)
{
skeleton->PlayAttackAnimation();
onceAttackFlag = true;
taskMemory->randomEndTime = FMath::FRandRange(2.0f, 3.5f);
}
}
if (taskMemory->structCurrentTime > taskMemory->randomEndTime)
{
taskMemory->structCurrentTime = 0.0f;
onceAttackFlag = false;
FinishLatentTask(ownerComp, EBTNodeResult::Succeeded);
}
이러면 태스크가 Memort안의 변수값으로 각각 AI마다의 별도의 StructCurrentTime을 가집니다
결과물
--이것을 몰라서 수정하지못하면 AI가 늘어나면 공격주기가 1초도 안되는 현상이 일어난다--
'Unreal 디버깅' 카테고리의 다른 글
TActorIterator객체 다수사용 (0) | 2025.05.17 |
---|---|
Unreal - 텍스처 스트리밍 풀이 예산을 초과했습니다 에러 고치기 (0) | 2025.05.15 |
Unreal - 이동중 낑김현상 sweep부분 (1) | 2025.04.25 |
Unreal - EXCEPTION_ACCESS_VIOLATION 크래시 고치기 (0) | 2025.04.10 |
Unreal - 75퍼센트 무한로딩 (0) | 2025.04.10 |