비헤이비어 트리는 태스크를 실행할 때 태스크 클래스의 ExecuteTask라는 멤버 함수를 실행합니다. ExecuteTask 함수는 다음 중 하나의 값을 반환해야합니다. 반환 값 설명 Aborted 태스크 실행 중에 중단되었습니다. 결과적으로 실패했습니다. Failed 태스크를 수행했지만 실패했습니다. Succeeded 태스크를 성공적으로 수행했습니다. InProgress 태스크를 계속 수행하고 있습니다. ExecuteTask 함수의 실행 결과에 따라 컴포짓 내에 있는 다음 태스크를 계속 수행할지, 중단할지가 결정됩니다.
전체 글
GameProgramer 취업준비 중 onestone3647@gmail.com블랙보드 블랙보드는 인공지능의 판단에 사용하는 데이터 집합을 의미합니다. NPC의 의사 결정은 블랙보드에 있는 데이터를 기반으로 진행됩니다. 비헤이비어 트리 블랙보드 데이터에 기반해 설계한 비헤이비어 트리의 정보를 저장한 애셋입니다. 언리얼 에디터에서는 비헤이비어 트리를 시각화해 저장할 수 있는도록 편집기능을 제공합니다. 비헤이비어 트리 노드의 종류 비헤이비어 트리의 노드는 루트(Root), 컴포짓(Composite), 태스크(Task), 데코레이터(Decorator), 서비스(Service). 총 5 가지의 종류가 존재합니다. 루트(Root) 비헤이비어 트리의 시작을 나타내는 노드이며, 한 개의 노드만 연결할 수 있습니다. 디테일 패널에서 이 비헤이비어 트리에서 사용할 블랙보드 애셋을 설정할 수 있습니..
AIControllerClass = APRAIController::StaticClass(); AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned; PRAIController 클래스를 생성하고 생성한 AIController를 사용하도록 AIController의 클래스 속성을 PRAIController의 클래스로 설정하고 AI의 생성옵션을 PlaceInWorldOrSpawned로 설정합니다. 레벨에 배치하거나 새롭게 생성하는 캐릭터마다 PRAIController 액터가 생성되고 캐릭터는 각 PRAIController의 지배를 받습니다.
언리얼 실행 환경은 메모리에 떠있는 언리얼 오브젝트가 사용 중인지 아닌지를 주기적으로 검사하고, 사용하지 않는 물체를 발견하면 메모리에서 자동으로 제거합니다. 이를 가비지 컬렉션(Garbage Collection)이라고 합니다. 언리얼 오브젝트가 사용 중인지 여부는 다른 언리얼 오브젝트가 해당 오브젝트를 참조하는지로 판단하는데, 예를 들어 FHitResult의 멤버 변수 Actor의 선언이 일반 참조로 선언된다면 해당 함수에서의 참조로 인해 제거돼야 할 액터가 메모리에 그대로 남아있는 문제가 발생할 수 있습니다. 이런 문제를 방지하기 위해 FHitResult는 참조로부터 자유롭게 포인터 정보를 전달해주는 약 포인터(TWeakObjectPtr) 방식으로 멤버 변수를 선언했습니다. 약포인터로 지정된 액터에 ..
OwnerPRPlayerCharacter->OnCoolDownRatioChangedDelegate.AddUFunction(this, FName("BindSkillSlot")); OwnerPRPlayerCharacter->OnCoolDownRatioChangedDelegate.AddUObject(this, &UPRSkillPaletteWidget::BindSkillSlot); UObject의 멤버 함수를 바인딩 할 경우 AddUObject를 사용합니다. 멤버 함수 중 UFUNCTION 키워드를 사용하여 선언한 함수는 AddUFunction으로 바인딩 할 수 있습니다. AddUObject의 경우 함수 포인터를 넘겨주고, AddUFunction은 함수 이름을 인자로 넘겨주면 됩니다.
에러가 발생한 상황 UPROPERTY(BlueprintReadWrite, meta = (AllowPrivateAccess = "true", BindWidgetAnim)) UWidgetAnimation* SpreadSkillPaletteAnim; C++에서 UWidgetAnimation 변수에 WidgetAnimation을 바인딩합니다. 발생한 에러 해결 방법 UPROPERTY(BlueprintReadWrite, Transient, meta = (AllowPrivateAccess = "true", BindWidgetAnim)) UWidgetAnimation* SpreadSkillPaletteAnim; 바인딩하고자 하는 UWidgetAnimation변수의 UPROPERTY 매크로에 Transient 키워드를..
FTimeline TestTimeline; UCurveFloat* TestFloatCurve; UCurveFloat* ChangeFloatCurve; FOnTimelineFloat TimelineProgress; if(TestFloatCurve != nullptr) { TestTimeline.AddInterpFloat(TestFloatCurve, TimelineProgress, NAME_None, TEXT("Test")); } if(ChangeFloatCurve != nullptr) { TestTimeline.SetFloatCurve(ChangeFloatCurve, TEXT("Test")); } TimeLine에 Curve를 등록할 때 TrackName을 설정하고 SetCurve 함수로 TrackName..