【UE5】C++で関数を作成して、ブループリントでノードとして使用するまで

C++で書くと1行で完結する処理も、ブループリントで作ると多くのノードを組み合わせないといけないことがあります。C++で処理も作れるようになっておくと便利かつ効率的です。

動作確認環境

Unreal Engine: 5.3.2

1. 必要なソフトのインストール

Unreal Engine

すでにインストール済みとして、ここでは説明しません。

Visual Studio

1.「Community」版をインストールしてください。

個人開発者の場合、無料で使用できます。(詳しいライセンスは各々で確認してください。)

2.コンポーネントのインストール

Visual Studioのインストール時に、以下のコンポーネントを必ず選択してください

ワークロード
  • C++によるゲーム開発
個別のコンポーネント
  • Windows SDK (最新バージョン)
  • C++のプロファイル ツール
言語パック

必要に応じて選択してください。

2. ゲームプロジェクト作成/起動

作業中のプロジェクトがあるかもしれませんが、手順をミスってプロジェクト自体が開けなくなるのを回避するため、一旦「新規プロジェクト」で試すことをおすすめします。

※Gitなどでバージョン管理がされており、万が一戻すことができる環境を作っている場合はそのままやってもいいです。

※プロジェクトの作成時、『プロジェクト デフォルト』で「ブループリント」を選択してください。

3. C++クラスの作成

メニュー:
 ツール > 新規C++クラス…

以下の設定を行い、「クラスを作成」ボタンを押下するとVisual Studioが起動します。

3-1. 親クラスの選択

親クラスは必ず選択してください。
※「なし」を選択するとブループリント内で使えません。

特に指定がない場合、「全てのクラス:Object」を選択するといいです。

3-2. クラスファイル設定

クラスタイプ

初めてやるときは、とりあえず「public」を選択するといいです。
ブループリントから呼べないのがクラスタイプのせいなのか切り分けるためです。

public

他のC++クラスやブループリントからも使いたいクラスや関数を定義する

private

他のモジュールからは直接アクセスできないため、外部に公開したくないクラスや内部でしか使わないものを定義する

選び方の基準

public
  • そのクラスや関数が他のC++コードやブループリントから呼び出されることを意図している場合
  • プロジェクト内の他のモジュールやサブシステムからも使いたいクラスを作成する場合
  • インターフェースクラスや共通的に使われるユーティリティクラスなど
private
  • そのクラスや関数が特定のモジュール内でしか使われない場合
  • 他のモジュールに対して隠蔽したい機能を実装する場合
  • 内部ロジックやサポートクラスとして、外部に公開する必要がない場合

ファイル名

ファイル名を設定します。

パス

ファイルパスを設定します。

4. Visual Studioのセットアップ

言語設定

言語パックをインストールしている場合、設定画面で変更ができます。
※言語が原因でエラーになる場合があるため、可能であれば英語のまま使用することをおすすめします。(ここでも英語で説明します。)

メニュー:
 Tools > Options > International Settings

設定の確認

以下の設定になっているはずですが、確認しておいてください。

  • ソリューション構成:Development Editor
  • ソリューションプラットフォーム:Win64

処理を書く

ブループリントから呼び出せるようにするには、以下のエクスポート設定をヘッダーファイルに書く必要があります。

  • UCLASS()
  • GENERATED_BODY()
  • UFUNCTION()

エクスポート設定マクロ

マクロを適切に使い分けることで、コードを効率的に管理し、ブループリントやエディターと連携しやすくなります。一部を紹介します。

UCLASS()

クラス定義の前に付けると、Unreal Engineで認識できるようにします。

修飾子
  • Blueprintable: ブループリントからクラスを基に派生クラスを作成できる(デフォルト)。
  • NotBlueprintable: ブループリントから派生クラスを作成できない。
  • BlueprintType: ブループリントで変数として利用可能にする。
  • Abstract: クラスが抽象クラスであることを示し、インスタンスを作成できない。

GENERATED_BODY()

クラス、構造体の中でUnreal Engineが自動的に必要なコードを生成するために必要

UFUNCTION()

メソッド定義の前に付けると、ブループリントから呼び出し可能にします。

修飾子
  • BlueprintCallable: ブループリントから関数を呼び出せるようにする。
  • Category: ブループリント検索時のカテゴリを設定する。
  • BlueprintImplementableEvent: ブループリントで関数をオーバーライドして実装する(C++側では実装しない)。
  • BlueprintNativeEvent: ブループリントでもオーバーライド可能だが、C++でもデフォルト実装を提供する。
  • Exec: コマンドラインから呼び出すことができる関数として登録する。
  • NetMulticast / Server / Client: ネットワーク対応の関数を定義する。

UPROPERTY()

クラスのメンバ変数をUnreal Engineのリフレクションシステムに登録し、ブループリントから読み書き可能にしたり、エディターで編集可能にすることができます。

修飾子
  • EditAnywhere: エディターのプロパティウィンドウから編集可能にする
  • EditDefaultsOnly: デフォルト値のみ編集可能にする。
  • EditInstanceOnly: インスタンスに対してのみ編集可能にする。
  • BlueprintReadOnly: ブループリントから読み取り専用にする。
  • BlueprintReadWrite: ブループリントから読み書き可能にする。
  • Transient: セーブ時に値を保存しない。
  • VisibleAnywhere / VisibleDefaultsOnly / VisibleInstanceOnly: エディターでの可視性を制御。
  • Replicated: ネットワークで変数を同期する。

メタデータ

修飾子と共に記述することで様々な効果がある。

  • DeprecatedFunction: 関数を非推奨にし、エディターでの使用時に警告を表示する。
  • WorldContext: 関数がどのワールドで実行されるかを指定する際に使う。
  • DisplayName: 関数のブループリントノードの名前をカスタマイズする。
  • AutoCreateRefTerm: 関数の入力パラメータに自動的に参照用のテンポラリを生成する。
  • ToolTip: プロパティの説明をツールチップとして表示する。

ビルド

C++クラスを追加した後は、Visual Studioでプロジェクトをビルドする必要があります。

メニュー:
 Build > Build Solution

ビルドが完了すると、Unreal Engineが再びアクティブになり、C++クラスがプロジェクトに反映されます。

ビルドエラー

ソースコードに不備があるわけでないのに、ビルドに失敗する場合は以下を試してみてください。

Unreal Engineを終了してビルドする

Unreal Engineで開いているプロジェクトを終了し、再度ビルドをしてください。

Visual Studioを「管理者として実行」

権限不足により、ビルドが失敗することがあります。

Visual Studioを起動するときに、「管理者として実行」を選択してください。

「Generate Visual Studio project files」の実行

プロジェクトファイルが古くなっていたり、不整合があるとビルドに失敗することがあります。これを実行すると、必要なプロジェクトファイルが再生成されます。

  1. Unreal Engine および Visual Studio でプロジェクトを開いている場合は終了する。
  2. プロジェクトファイル「.uproject」を右クリックして、「Generate Visual Studio project files」を選択する。
  3. Visual Studioで再度ビルドする。

プロジェクトディレクトリで「Intermediateフォルダ」と「Binariesフォルダ」を削除

古いビルドのキャッシュや一時ファイルがビルドエラーを引き起こすことがあります。

  1. プロジェクトディレクトリをエクスプローラーで開く。
  2. 「Intermediateフォルダ」と「Binariesフォルダ」を削除する。
  3. Visual Studioで再度ビルドする。

ブループリントで呼び出す

呼び出すことができたら成功です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください