関数 は、ブループリントで他のグラフから実行または呼び出しができる 特定の ブループリント に属しているノードグラフです。関数には、ノードによって指定され、単一の実行出力ピンを含む関数名がつけられた エントリーポイントがあります。関数が別のグラフから呼び出されると、出力実行ピンが有効になり、 接続されたネットワークが実行されます。
使用方法については「デリゲート」を参照してください。
アクセス指定子
関数を作成する場合、その関数に対する他のオブジェクトのアクセス権を指定することができます。そのためには、選択した関数の [Details (詳細)] パネルにある Access Specifier プロパティを設定します。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/3438fd1b-2359-4745-94b8-c2235cf55d95/accessspecifier.png)
Access Specifier プロパティには次の設定が含まれています。
設定 | 説明 |
---|---|
Public | Public の設定は、他のどのオブジェクトもこの関数を呼び出せることを意味します。デフォルト設定です。 |
Protected | Protected の設定は、現在のブループリント、そして現在のブループリントから派生したブループリントからのみ関数を呼び出せることを意味します。 |
Private | Private の設定は、現在のブループリント内からのみ関数を呼び出せることを意味します。 |
純粋関数と非純粋関数
関数は 純粋関数 または 非純粋関数 のどちらかになります。両者の大きな違いは、純粋関数がステートやクラスのメンバーを一切変更しないのに対し、 非純粋関数はステートを自由に変更します。純粋関数は通常、データ値を出力するだけの getter 関数や演算子に使用されます。 関数または演算子は、データ値を単に出力します。
非純粋関数は実行入力を イベントグラフ の 関数呼び出しノード に接続して明示的に実行する必要があります。 非純粋関数は以下のいずれかのメソッドを使って指定されます。
- コードで定義された UFUNCTION に対する UFUNCTION 宣言のキーワードに BlueprintCallable を指定します。
- ブループリント エディタ で追加された関数の [Pure (純粋)] のチェックボックスにはチェックを入れないままにします。
純粋関数はデータピンへ接続され、依存するデータが要求されるとコンパイラにより自動的に実行されます。このため、 純粋関数は接続先のノードにつき 1 回ずつ呼び出されます。純粋関数は以下のいずれかのメソッドを使って指定されます。
- コードで定義された関数に対する関数宣言のキーワードに BlueprintPure を指定します。
- ブループリント エディタ で追加された関数の [Pure] のチェックボックスにチェックを入れます。
関数を作成する
ブループリント内で作成する
以下は、ブループリント クラス または Level ブループリント 内部で関数を作成する方法です。
-
関数リストヘッダー
の [Add (追加)] ボタン
をクリックして、My Blueprint タブで新規関数を作成します。
-
関数名を入力します。
ブループリント エディタの [Graph Editor] タブで、関数が新規のタブとして開きます。
関数は、 [My Blueprint] タブで 右クリック 、 [Function] を選択して作成することも出来ます。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/5b398b59-0985-4ddd-b468-d584d4f0e4df/add_function_rtclick.png)
ブループリント インターフェース内で作成する
ブループリント インターフェース で作成された関数は、 ブループリントのクラス または レベル ブループリント の関数と同じ方法で作成されますが、実装が大きく異なります。
以下は、 ブループリント インターフェース 内で関数を作成する方法です。
-
関数リストヘッダー
の [Add (追加)] ボタン
をクリックして、My Blueprint タブで新規関数を作成します。
-
関数名を入力します。
ブループリント エディタの [Graph Editor] タブで、関数が新規のタブとして開きます。
関数は、 [My Blueprint] タブで 右クリック 、 [Function] を選択して作成することも出来ます。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/4940b6ad-a38c-4ae8-80b4-3ee8bb1480a9/interface_function_rtclick.png)
使用方法については「ゲームプレイ タイマー」を参照してください。
関数を編集する
関数を作成したら、次は関数の機能を定義する必要があります。機能は以下の 2 つのプロセスで定義します。
- 必要となる入力および出力パラメータを作成します。
- 入力と出力の間にノード ネットワークを作成し、関数の動作を定義します。
[Details (詳細)] タブで、Description (説明) 、 Category (カテゴリ) 、 Access Specifier および Pure (純粋関数) の設定ができます。
関数の [Details] タブは以下の操作で開きます。
- [My Blueprint] タブで [Function (関数)] を選択します。
- 呼び出されるグラフ内で Function ノードを選択します。
- 関数のグラフ内の関数エントリ (または結果) ノードを選択します。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/f319bb9c-581e-4097-9fa4-c38ca8953550/selected_function_myblueprint.png)
入力パラメータと出力パラメータ
関数の[Details (詳細)] タブでも入力または出力パラメータを設定することができます。
以下の手順で、入力または出力パラメータを追加します。
-
[Details (詳細)] ペインの [Inputs (入力)] または [Outputs (出力)] セクションのいずれかの[New (新規)] ボタンをクリックします。
-
新パラメータに名前をつけて、ドロップダウン メニューを使用してタイプを設定します。以下の例では、 VectorA と VectorB という名前の 2 つの vector 型のデータ入力と、 Distance という名前の float 型のデータがあります。
ブループリントのマクロ とは異なり、関数に追加できるのは、データ入力とデータ出力だけです。
関数グラフのエントリおよび結果ノードは、自動的に正確なピンで更新されます。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/df1a2d0e-96e8-4e2d-b824-5efa35b46dee/function_tunnel_with_pins.png)
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/e38070ba-fd8d-48e7-8e40-c6ef63cceaac/function_call_with_pins.png)
-
パラメータの入力を拡大することによってデフォルト値を設定したり、値をリファレンス経由で渡すかどうかを選択できます。
ノード端にあるパラメータのピンの位置を変更したい場合、[Details] ペイン入力を展開して上下の矢印キーを使用します。
関数に機能を定義する準備ができました。エントリノードと結果ノード間にノード ネットワークを作成してこの作業を行います。
機能を定義する
関数は、入力ノードと出力ノード間を接続するブループリント グラフを作成して定義することができます。この例では、3D スペースで 2 点間の距離を返してピタゴラスの定理の 3D (以下に表示) を適用するために、必要なネットワークを作成します。
dx = (x2-x1)^2
dy = (y2-y1)^2
dz = (z2-z1)^2
D = sqrt(dx+dy+dz)
ブループリントのノード ネットワークに変換しました。
画像をクリックしてフルサイズで表示
関数の呼び出し
関数の作成と定義が完了したら、次はその関数を イベントグラフ に呼び出します。以下の手順で関数を呼び出すノードを作成します。
-
関数を [My Blueprint] タブからイベントグラフの空いている場所へドラッグします。
-
イベントグラフ内を 右クリック するか、適切な実行またはデータピンからドラッグしてコンテキストメニューを開きます。関数のコンテキストメニュー内を検索し、選択して関数呼び出しノードに追加します。
以下のネットワークは 2 つのベクター変数を受け取ります。ティックごとに 2 つの間の距離を測り、その距離を画面にプリントします。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/c977a278-3b96-4a25-9ad1-150e5c86c88a/eventgraph.png)
この例では、Public のベクター変数を 2 つ使います。それぞれの変数に対して、Show 3D Widget を True に設定します。ブループリントをレベルに追加すると、Point A と Point B で定義された位置に 3D ウィジェットが表示されます。 3D ウィジェットにより、ビューポート内で Point A と Point B を移動させれば、それらの値を簡単に変更することができます。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/303a6944-9879-4ba7-87ca-81a71347cbb5/points1and2viewport.png)
マップをテストする時には、この 2 点間の距離がティック時にログオンされ、関数が動作していることを確認します。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/ebe12484-1cc7-4e83-834a-c7cb72dc90c0/withbpeditorclosed.png)
外部ブループリントから関数を呼び出す
呼び出したい関数を含むブループリントへの参照を持っている限り、別のブループリント内からあるブループリント内の 関数 を呼び出すこともできます。
以下の例では、Character ブループリント (MyCharacter と呼ばれます) 内に Take Damage という関数があります。これは、呼び出されるたびに PlayerHealth と呼ばれる変数を 10 ずつ減らします。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/daa59cd0-d1cd-4e40-8833-d3bbbee08dcb/playerhealthfunction.png)
MyCharacter ブループリントからプレイヤーが武器を発砲するとスポーンする発射物である別のブループリント内には、発射物が何かにぶつかると起こるスクリプトがあります。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/02289c41-41ca-4f45-9008-cb8fd28fcb77/defaultprojectile.png)
Blueprint First Person Template Project に入っているデフォルトの MyProjectile ブループリントであるこのスクリプトは、発射物が何かにぶつかると既に何かを行うようになっています。すなわち、物理をシミュレーションし、ぶつかった位置に推進力を加えます。例えば、プレイヤーをヒットしたかをチェックし、ヒットした場合 Take Damage 関数を呼び出すようにしたいとします。
これは、Event Hit の Other ピンからドラッグして、 MyCharacter ブループリントに Casting To して行います。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/1af85abe-77c2-4034-88d8-b44d1b2571ba/casttomycharacter.png)
これを行うと、プレイヤー キャラクターへの参照を持つことになり、 As My Character ピンからドラッグして、そのブループリント内にある関数 Take Damage を呼び出します。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/3a8243c6-9914-4a79-aacf-3275c9039905/callfunction.png)
これでスクリプトの残りを接続し、破壊するようにプレイヤーをヒットした後、発射物を破壊するようにできます。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/0f1baa39-6cf4-4ad3-bb57-3273e246639c/fullprojectilescript.png)
エディタで再生すると、以下のようになります。
PlayerHealth 変数を PrintString ノードに接続し、現在の値を表示するようにしました。デフォルトを 100 に設定し、プレイヤーがウォールを撃ち、それが跳ね返りプレイヤーにぶつかると、 Take Damage 関数が呼び出され、ぶつかるごとに PlayerHealth 変数が 10 ずつ減っていきます。
トラブルシューティング関数
関数呼び出しノード上に「Unable to find function with name [FunctionName](という名前の関数が見つかりません)」というメッセージの Warning! バーが表示された場合はブループリントを コンパイル してください。
![](https://d1iv7db44yhgxn.cloudfront.net/documentation/images/3ffeca9b-fbd8-4e99-a5d6-ce954d6037be/function_warning.png)
関数の入力および出力パラメータの数を変更した場合も、ブループリントを コンパイル する必要があります。