※ 개인적인 공부를 위해 포스팅 하는 글입니다.
# 테스크, 서비스, 디코레이터를 C++로 만들어 보자
ㆍ 이런식으로 상속을 받는 C++를 테스크, 데코, 서비스를 파주자.
# 모듈을 추가해 주자
# 서비스
ㆍ Tick을 이용해서 만든 서비스 블루프린트 버전이였다. 이걸 C++로 옮기면..
ㆍ 설명이 필요없게 직관적이다. TickNode같은 경우는 f12로 타고들어가서 찾아줫다
ㆍ 이런 여러가지 옵션들을 생성자에서 설정해 줄 수 있다.
ㆍ 변수명같은 경우엔 보통 에디터를 영어로 하고 보면 동일하긴 하다.
void UBTService_FindTarget::TickNode(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{
Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds);
APawn* LocalPawn = OwnerComp.GetAIOwner()->GetPawn();
if (LocalPawn == nullptr)
{
return;
}
UWorld* World = LocalPawn->GetWorld();
if (World == nullptr)
{
return;
}
FVector Location = LocalPawn->GetActorLocation();
TArray<FOverlapResult> OverlapResults;
FCollisionQueryParams CollisionQueryParam(NAME_None, false, LocalPawn);
bool bResult = World->OverlapMultiByChannel(
OverlapResults,
Location,
FQuat::Identity,
ECollisionChannel::ECC_GameTraceChannel2,
FCollisionShape::MakeSphere(SearchRadius),
CollisionQueryParam
);
if (bResult)
{
for (FOverlapResult& OverlapResult : OverlapResults)
{
AR1Character* R1Character = Cast<AR1Character>(OverlapResult.GetActor());
if (R1Character)
{
OwnerComp.GetBlackboardComponent()->SetValueAsObject(TargetKey.SelectedKeyName, R1Character);
DrawDebugSphere(World, Location, SearchRadius, 16, FColor::Green, false, 0.2f);
return;
}
}
}
OwnerComp.GetBlackboardComponent()->SetValueAsObject(TargetKey.SelectedKeyName, nullptr);
DrawDebugSphere(World, Location, SearchRadius, 16, FColor::Red, false, 0.2f);
}
ㆍ Collision같은 경우에 C++로 오면 코드가 좀 지저분해진다... 채널별로 어쩌구 저쩌구... 이런건 찾아서 필요한걸 잘 사용하도록 하자
#테스크와 데코레이터
ㆍ 핵심은 별로 다를게 없어서 코드만 첨부
# 에디터에 노출되며 비해이비어 트리에서 사용할 수 있다.
※ 작업을 BP로 좀 크게 해보고 C++로 옮기는 식으로 연습을 많이 해봐야겠다.
'언리얼엔진 > 언리얼 C++' 카테고리의 다른 글
객체를 따라다니는 UI (1) | 2024.10.25 |
---|---|
UI 위젯블루프린트 (4) | 2024.10.25 |
Behavior Tree (Task, Service, Decorator) - BP (1) | 2024.10.25 |
AI Controller (0) | 2024.10.24 |
Post Process (0) | 2024.10.23 |