글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자입니다

 

목차

     

     


     

     

    UE4에서의 원시 포인터가 UE5에서 TObjectPtr 바뀐 경우 사용방법

     


     

    문제 상황

     

    ue4버전

    UBlacboardComponent* Blackboard;

     

    ue5버전

    TObjectPtr<UBlackboardComponent> Blackboard;

    로 변경

     

     

    UseBlackboard 함수를 사용해야 하는 경우

    UBlackBoardComponent*& 을 받아와야하는 경우 문제가 생긴다.

     


     

    코드 사용

     

    UE4

    #include "Characters/CAIController.h"
    #include "Global.h"
    #include "GameFramework/Character.h"
    #include "BehaviorTree/BehaviorTree.h"
    #include "Characters/CEnemy_AI.h"
    #include "Components/CAIBehaviorComponent.h"
    #include "Perception/AIPerceptionComponent.h"
    #include "BehaviorTree/BlackboardComponent.h"
    #include "Perception/AISenseConfig_Sight.h"
    
    ACAIController::ACAIController()
    {
    	CHelpers::CreateActorComponent<UBlackboardComponent>(this, &Blackboard, "Blackboard");//UE4방식. UBlackboardComponent* Blackboard
    	
    	CHelpers::CreateActorComponent<UAIPerceptionComponent>(this, &Perception, "Perception");
    
    	Sight = CreateDefaultSubobject<UAISenseConfig_Sight>("Sight");//CreateDefaultSubobject는 생성자 동적할당, UObject는 런타임 동적할당.
    	Sight->SightRadius = 600;//시야 반경
    	Sight->LoseSightRadius = 800;//시야를 잃는 범위
    	Sight->PeripheralVisionAngleDegrees = 45;//시야각
    	Sight->SetMaxAge(2);
    
    	Sight->DetectionByAffiliation.bDetectEnemies = true;//적들을 감지o
    	Sight->DetectionByAffiliation.bDetectNeutrals = false;//중립 감지x
    	Sight->DetectionByAffiliation.bDetectFriendlies = false;//아군 감지x
    
    	Perception->ConfigureSense(*Sight);//감지 객체 지정. 시야감지로 지정.
    	Perception->SetDominantSense(*Sight->GetSenseImplementation());//시야감지를 최우선 감지타입으로 설정.
    }
    
    void ACAIController::OnPossess(APawn* InPawn)
    {
    	Super::OnPossess(InPawn);
    
    	Enemy = Cast<ACEnemy_AI>(InPawn);//Enemy에 possess되는 Pawn을 넣어준다.
    	SetGenericTeamId(Enemy->GetTeamID());//TeamID 지정
    
    	CheckNull(Enemy->GetBehaviorTree());//Enemy가 BehaviorTree를 가지고 있는지 체크
    
    	UseBlackboard(Enemy->GetBehaviorTree()->BlackboardAsset, Blackboard);
    
    
    	Behavior = CHelpers::GetComponent<UCAIBehaviorComponent>(Enemy);//Enemy내의 BehaviorComponent를 가져온다.
    	Behavior->SetBlackboard(Blackboard);
    
    	RunBehaviorTree(Enemy->GetBehaviorTree());//BehaviorTree 실행
    }

    AAIController에서 상속받은 Blackboard 변수 그대로 사용.

     

    ACAIController::ACAIController()

    • CHelpers::CreateActorComponent<UBlackboardComponent>(this, &Blackboard, "Blackboard");

     

    void ACAIController::OnPossess(APawn* InPawn)

    • UseBlackboard(Enemy->GetBehaviorTree()->BlackboardAsset, Blackboard);

     

     

     

    UE5

    #include "Characters/CAIController.h"
    #include "Global.h"
    #include "GameFramework/Character.h"
    #include "BehaviorTree/BehaviorTree.h"
    #include "Characters/CEnemy_AI.h"
    #include "Components/CAIBehaviorComponent.h"
    #include "Perception/AIPerceptionComponent.h"
    #include "BehaviorTree/BlackboardComponent.h"
    #include "Perception/AISenseConfig_Sight.h"
    
    ACAIController::ACAIController()
    {
    	Blackboard = CreateDefaultSubobject<UBlackboardComponent>(TEXT("Blackboard"));//UE5 방식. TObjectPtr<UBlackboardComponent> Blackboard
    
    	CHelpers::CreateActorComponent<UAIPerceptionComponent>(this, &Perception, "Perception");
    
    	Sight = CreateDefaultSubobject<UAISenseConfig_Sight>("Sight");//CreateDefaultSubobject는 생성자 동적할당, UObject는 런타임 동적할당.
    	Sight->SightRadius = 600;//시야 반경
    	Sight->LoseSightRadius = 800;//시야를 잃는 범위
    	Sight->PeripheralVisionAngleDegrees = 45;//시야각
    	Sight->SetMaxAge(2);
    
    	Sight->DetectionByAffiliation.bDetectEnemies = true;//적들을 감지o
    	Sight->DetectionByAffiliation.bDetectNeutrals = false;//중립 감지x
    	Sight->DetectionByAffiliation.bDetectFriendlies = false;//아군 감지x
    
    	Perception->ConfigureSense(*Sight);//감지 객체 지정. 시야감지로 지정.
    	Perception->SetDominantSense(*Sight->GetSenseImplementation());//시야감지를 최우선 감지타입으로 설정.
    }
    
    void ACAIController::OnPossess(APawn* InPawn)
    {
    	Super::OnPossess(InPawn);
    
    	Enemy = Cast<ACEnemy_AI>(InPawn);//Enemy에 possess되는 Pawn을 넣어준다.
    	SetGenericTeamId(Enemy->GetTeamID());//TeamID 지정
    
    	CheckNull(Enemy->GetBehaviorTree());//Enemy가 BehaviorTree를 가지고 있는지 체크
    
    	//UE5 방식. UBlackboardComponent*변수를 만들어 Blackboard.Get()을 담아준 후 사용해야 한다.
    	UBlackboardComponent* BlackboardTemp = Blackboard.Get();
    	UseBlackboard(Enemy->GetBehaviorTree()->BlackboardAsset, BlackboardTemp);//Blackboard 사용을 위해 BlackboardData인 BlackboardAsset과 BlackboardComonent인 Blackboard를 할당한다.
    	this->Blackboard = BlackboardTemp;
    
    
    	Behavior = CHelpers::GetComponent<UCAIBehaviorComponent>(Enemy);//Enemy내의 BehaviorComponent를 가져온다.
    	Behavior->SetBlackboard(Blackboard);
    
    	RunBehaviorTree(Enemy->GetBehaviorTree());//BehaviorTree 실행
    }

    ACAIController::ACAIController()

    • Blackboard = CreateDefaultSubobject(TEXT("Blackboard"));

     

    UE5 방식. UBlackboardComponent*변수를 만들어 Blackboard.Get()을 담아준 후 사용해야 한다.

     

    void ACAIController::OnPossess(APawn* InPawn)

    • UBlackboardComponent* BlackboardTemp = Blackboard.Get();
      UseBlackboard(Enemy->GetBehaviorTree()->BlackboardAsset, BlackboardTemp);
      this->Blackboard = BlackboardTemp;

     


     

     

    사용 예시2

     

    USTRUCT(BlueprintType)
    struct FDA_Ability
    {
    	GENERATED_BODY()
    
    	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
    	TObjectPtr<const UTexture2D> Icon = nullptr;
    
    	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
    	TObjectPtr<const UMaterialInterface> BackgroundMaterial = nullptr;
    };

     

    void UTDUW_SkillIcon::ReceiveDA_Ability(FDA_Ability InDA_Ability)
    {
    	if (InDA_Ability.InputTag.MatchesTagExact(InputTag))
    	{
    		if (InDA_Ability.AbilityTag.MatchesTagExact(FTDGameplayTags::GetTDGameplayTags().Abilities_None))
    		{
    			// TObjectPtr에서 원시포인터 형태로 변환. FDA_Ability에서 const로 선언해서 const를 없애는 대신 const_cast 사용.
    			UMaterialInterface* Material_Background = const_cast<UMaterialInterface*>(InDA_Ability.BackgroundMaterial.Get());
    			UTexture2D* Texture_Icon = const_cast<UTexture2D*>(InDA_Ability.Icon.Get());
    			
                Image_Background->SetBrush(UWidgetBlueprintLibrary::MakeBrushFromMaterial(Material_Background));
    			Image_SkillIcon->SetBrush(UWidgetBlueprintLibrary::MakeBrushFromTexture(Texture_Icon));
            }
            // ...
        }
        // ...
    }

     


     

     

    참고 자료

     

    https://uecasts.com/courses/unreal-engine-5-introduction/episodes/ue4-to-ue5-tobjectptr

     

    UE Casts - Premium Unreal Engine 4 Tutorial Screencasts and Unreal Engine 4 Resources

    Premium Unreal Engine 4 Tutorial Screencasts and Unreal Engine 4 Resources

    uecasts.com

     

    https://www.youtube.com/watch?v=uv8hyf3AB-I