☕️

【UE5】BP上でTSubclassOf変数に対して特定のインターフェースを実装してるクラスだけ選択させる

2024/10/26に公開

概要

特定のインターフェースを実装してるクラスだけをUPROPERTYとして選択したいときがありました。
そのときに、MustImplementsというmeta属性を使うと、特定のインターフェースだけを実装してるUObjectだけ選択出来ることを知ったので、便利だと感じたので記事にしました。

参考になれば幸いです。

環境

UE5.4.4

やり方

TSubclassOf変数に対してMustImplement=確認したいインターフェース名(UやAなどは要らない)をUPROPERTYにつけるだけです。
例としてExampleMustImplmentsインターフェースを実装してるActorだけを選択するActorクラスを作成し、BP上で切り替えられるようにします。

手順は以下になります。

  1. インターフェースを作成する
  2. インターフェースを指定するためのUPROPERTYを含めたTSubClassOf変数をActor(手っ取り早いのがActorだったのでそうしているがそれ以外でもいい)に持たせる
  3. 2を継承したBPを作成し、インターフェースを実装したら項目が増えている確認する

インターフェース作成する

下記のようなインターフェースを用意します

※今回は選択したいだけなので関数は何も用意しません。

ExampleMustImplments.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "ExampleMustImplments.generated.h"

// This class does not need to be modified.
UINTERFACE()
class UExampleMustImplments : public UInterface
{
    GENERATED_BODY()
};

/**
 * 
 */
class IExampleMustImplments
{
    GENERATED_BODY()

    // Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:
};

UPROPERTYを含めたTSubClassOf変数をActorに持たせる

下記のActorをC++で用意します

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ExampleActor.generated.h"

UCLASS()
class AExampleActor : public AActor
{
    GENERATED_BODY()

public:
    // Sets default values for this actor's properties
    AExampleActor();

    //追加
    UPROPERTY(EditAnywhere,meta=(MustImplement="ExampleMustImplments"))
    TSubclassOf<AActor> ExampleImplementsActor;
protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

public:
    // Called every frame
    virtual void Tick(float DeltaTime) override;
};

追加したのはこの部分です。ここで使っているMustImplementを使うことで、ExampleMustImplmentsを実装したクラスだけを指定できる形になります。

//追加
UPROPERTY(EditAnywhere,meta=(MustImplement="ExampleMustImplments"))
TSubclassOf<AActor> ExampleImplementsActor;

BPを作成し、インターフェースを実装したら項目が増えている確認する

AExampleActorを継承したBPを作成し、インターフェースを実装(このBPでもいいし、他のBPでもいい)後に選択項目が増えていれば成功です。


インターフェース実装前


インターフェース実装後

参考

Is TSubclassOf<> possible with interfaces?

Discussion