30.参照とは? 他のブループリントクラスを参照してみよう
😺今回は"参照"とは何なのか、他のブループリントクラスを参照する方法と参照をすると何ができるのかなど、参照について一通り基礎を解説していきます。
"他のブループリントクラスを参照する"とは?
UnrealEngineゲーム開発において、あるブループリントクラスから他のブループリントクラス(またはブループリントクラスではないアクタ)を移動したり削除したり、他のブループリントクラスの変数を変更したりする場面が出てきます。そんな時に行うのが「参照」です。参照を行うと、他のブループリントクラスを削除したり、移動させたり、他のブループリントクラスの変数なども変更できるようになります。
https://scrapbox.io/files/65bcd456322e06002592c7b4.jpg
例えば上画像ではBP_Cube(左)とBP_Sphere(右)というブループリントクラスを用意しました。例えばBP_CubeがBP_Sphereを削除する処理や、BP_CubeからBP_Sphereの変数を変更させたい場合などに参照を行います。参照方法には色々ありますが今回は基本的な方法を紹介していきます。
つまり他のブループリントクラスにアクセスして何らかの処理を実行する時に行うのが"参照"です。
またこのブループリント間の参照を「ブループリント通信」と呼んだりもします。
😺つまり"他のブループリントクラスへ参照"を行う事で、他のブループリントクラスへアクセスできて色々と編集操作する事が可能になる訳です。基本的な参照方法は後ほど紹介するので、具体的に参照はどんな場面で使用するのか紹介していきたいと思います。
"参照する"具体的な例を見ていこう
例えばRPGなどのゲームでプレイヤーが敵に攻撃してHPを減らすという処理を行いたい時に参照を行います。具体的に見ていきましょう。
BP_PlayerとBP_Dragonというブループリントクラスを用意しました↓
https://scrapbox.io/files/65bcd604bbff6d0026cba819.jpg
BP_DragonにはDragon_HPというInteger型の変数を用意しました。デフォルト値は100としておきます。
https://scrapbox.io/files/65bcd647deae840024942ee6.jpg
プレイヤーがドラゴンに攻撃したとして、プレイヤー側でドラゴンのHPを減らす処理を書いていきたいと思います。しかしながらプレイヤー側のイベントグラフ側で、ドラゴン側で作ったDragon_HPの変数を変更しようと思っても、以下の様に検索してもDragon_HPのセットノードは出てきません。
https://scrapbox.io/files/65bcd6befeb7c9002dee6f21.gif
プレイヤー(BP_Player)側のイベントグラフで、以下のノードを作成します。GetActorOfClassというノード(ページ下で詳しく解説)を使用して参照を行う事で、他のブループリントクラスの変数であるDragon_HPも変更できるようになり、セットノードが追加できるようになりました↓
https://scrapbox.io/files/65bcd756bb6171002479dfa3.jpg
これでプレイヤー側でドラゴンのHPを変更する処理ができました。
つまりプレイヤーのブループリントクラスからドラゴンのブループリントクラスへ参照を行い、変数の内容を変更したという事になります。
https://scrapbox.io/files/65bcd7c3c23afc0023ca9ff7.jpg
このように他のブループリントクラスへ参照を行う事で、他のブループリントクラスの変数を変更できたりなどの操作が可能になります。なお例で挙げたGetActorOfClassノード以外にも参照方法は色々あります。
①レベルブループリントでアクタを参照してみよう
まずは一番簡単な参照方法から紹介していきます。
アクタであれば何でも良いですが、レベルにある青色のキューブ(SM_ChamferCube)を選択してレベルブループリントを開きます。
https://scrapbox.io/files/65bcd9e0a784c6002d0c917e.gif
レベルブループリントのイベントグラフにて右クリックを押すと、「SM_ChamferCubeのリファレンスを作成」するという項目があるのでクリックします。リファレンス(Refference)は参照のことです。
https://scrapbox.io/files/65bcda296c45f000257a4ef7.gif
作ったノード解説
これでSM_ChamferCubeというアクタへ参照するためのノードを追加できました。この参照ノードは先ほど選択したアクタを示しています。またアクタのデータを示すノードは薄い青色となっています。
https://scrapbox.io/files/65bcdad1c177d5002568b424.jpg
これでレベルブループリントからSM_ChamferCubeというアクタへアクセスしたという事になります。アクセスした事によってレベルブループリントからSM_ChamferCubeというアクタを削除したり、移動させたりなどが可能になりました。
BeginPlayからDestroyActorを作成して以下の様に繋げます。
https://scrapbox.io/files/65bcdbe40944e100257e1e1f.jpg
作ったノード解説
DestroyActorノードはターゲットに入力されたアクタを削除するノードです。なのでSM_ChamgferCubeを接続した事により、ゲーム開始時にSM_ChamgferCubeを削除するという処理が作られました。
プレイすると同時に選択したSM_ChamferCubeのアクタが削除されました。
https://scrapbox.io/files/65bcdcf90347cf00259b1a73.gif
このように参照を行う事でアクタを削除したりする事が可能です。
上記の方法でアクタ参照できるのはレベルブループリントだけ!!
レベルブループリントでは上記の方法のようにアクタ選択 > レベルブループリントを開く > 右クリック > リファレンスを作成で、参照を行うノードを作成できるのですがこの方法を使えるのはレベルブループリントだけになります。
🌟Step2:他のブループリントクラスを参照し,変数を変更してみよう
では最初に挙げた具体的な例(プレイヤーとドラゴン)のように、あるブループリントクラスから他のブループリントクラスを参照を行って、他のブループリントクラスの変数を変更していきたいと思います。
まず二つのブループリントクラスを用意します。Blueprintsフォルダのなかに右クリック > ブループリントクラス > Actorで作成して名前を「BP_Cube」にします。
https://scrapbox.io/files/65bcdeaf99ca590024a8035d.jpg
開いてCube(キューブ)のメッシュを追加しておきます。
https://scrapbox.io/files/65bcdf400944e100257e3465.jpg
同じように右クリック > ブループリントクラス > Actorで作成して「BP_Sphere」という名前に変更します。
https://scrapbox.io/files/65bcdf8d660efa002606beb0.jpg
BP_Sphereを開いてSphere(球)メッシュを追加しておきます。
https://scrapbox.io/files/65bcdfdb0e9b0b00251bd427.jpg
レベルに両方を配置しておきます。
https://scrapbox.io/files/65bce0b3322e060025932c4a.jpg
🐱では、球体(BP_Sphere)の方に変数を作成してキューブ(BP_Cube)からその変数を取得,変更してみたいと思います。
BP_Sphereを開いて、Sphere_HPという名前のInteger型の変数を作成します。その後コンパイルしてデフォルト値を100にします。
https://scrapbox.io/files/65bce1b1486f990024380ab4.jpg
🐱ではこのBP_SphereのSphere_HP変数をBP_Cubeから変更したいと思います。
今度はBP_Cubeを開きます。
https://scrapbox.io/files/65bce25562e68300232a405a.jpg
BP_Cubeのイベントグラフを開きます。
https://scrapbox.io/files/65bce2bcfeb7c9002deed86d.jpg
デフォルトの状態では別のブループリントクラスの変数はセットやゲットできない
この時点ではBP_CubeのイベントグラフではBP_SphereのSphere_HPをセットしたりゲットしたりする事はできません。試しに「get sphere hp」と検索してみてもノードはヒットしません↓
https://scrapbox.io/files/65bce30476ae920024e083f6.gif
これはBP_CubeとBP_Sphereは別のブループリントクラスであるためです。このように別のブループリントクラスの変数や関数,カスタムイベントなどは参照を行わないと使用する事ができません。
🐱という訳でGetActorOfClassというノードで参照を行っていきます。
BP_Cubeのイベントグラフに、BeginPlayとGetActorOfClassノードを作成してActorClassをBP_Sphereにします。
https://scrapbox.io/files/65bce39c0347cf00259b5205.jpg
GetActorOfClassノードとは?
GetActorOfClassノードはレベル上にある他のブループリントクラスを参照するノードです。ActorClassの項目に参照したいブループリントクラスを選択する事でその対象のアクタを参照します。
🐱要するにGetActorOfClassノードで他のブループリントクラスにアクセスする事ができます。
ReturnValueピン(参照を出力するピン)からドラッグして「Get Sphere HP」と検索します。すると今度はSphere_HPのGetノードが追加できるようになっています。Sphere_HPをGetで追加しましょう。
https://scrapbox.io/files/65bce4629d5a580026c01646.gif
🐱このように参照した事で、他のブループリントクラスの変数を取得したりセットできる状態になっています。また参照する系のノードではReturnValueのピンから他のブループリントクラスのノードを作成する必要があるので覚えておきましょう。
最後に実行ピンからPrintStringノードを作成して、Sphere_HPからInStringに接続します。
https://scrapbox.io/files/65bce50f7baeec0024ed732d.jpg
プレイしてBP_Cube側からちゃんとSphere_HPを取得できているのか確かめてみましょう。
https://scrapbox.io/files/65bce5cc0e9b0b00251bfa65.jpg
ちゃんとSphere_HPのデフォルト値である100を取得できました。
作ったノード解説
GetActorOfClassで他のブループリントクラス(BP_Sphere)を参照する事で、その変数を取得できテキスト表示したという流れになります。
https://scrapbox.io/files/65bce62206b986002eae037b.jpg
https://scrapbox.io/files/65bce643d513ca00265f2aeb.jpg
🐱ではセットノードの方も試してみましょう。
一度GetActorOfClassノードから後続のノードを削除します。
https://scrapbox.io/files/65bce6956f02a10025ad91e2.gif
GetActorOfClassノードのReturnValueピンから「Set Sphere HP」と検索してSphere_HPのセットノードを追加します。Sphere_HPには50と入力しておきます。
https://scrapbox.io/files/65bce6e58d1768002dda94b1.jpg
PrintStringノードで確認しても良いですが、今回は直接変数の値を確認してみましょう。BP_Sphereを開いて、Sphere_HPの目のアイコンをクリックして開いた状態にします。
https://scrapbox.io/files/65bce7920944e100257e667a.jpg
目のアイコンの意味は?
変数のデータ内容をレベルエディタで確認できる状態にするかしないか切り替えできるボタンになります。目を開いた状態で確認できる状態になります。
コンパイルします(コンパイルしないとレベルエディタで変数が表示されたいため)。
https://scrapbox.io/files/65bceea7322e06002593a24f.jpg
レベルに配置したBP_Sphereを選択してデフォルト > Sphere_HPを確認します。デフォルト値は100なので現時点で100と表示されています。
https://scrapbox.io/files/65bceef08c77d30024f74697.jpg
プレイしてみます。Shift+F1でマウスカーソルを表示 > プレイボタン横の上三角のボタンを押す(これでゲーム中にエディタ操作が可能になります) > BP_Sphereを選択 > 詳細のデフォルトからSphere_HPを確認します。
https://scrapbox.io/files/65bcf273063b990025292500.gif
Sphere_HPはちゃんと50に変化しているのが確認できます。
作ったノード解説
BP_Cubeに以下のノードを作成しました。BP_Sphereへ参照,つまりアクセスする事で変数を変更しています。
https://scrapbox.io/files/65bcf37229bd3f0025976564.jpg\
https://scrapbox.io/files/65bcf3a8deae8400249519d5.jpg
🐈:このように参照を行うと他のブループリントクラスの変数を変更したり取得したりする事ができます。それ以外にも参照するとアクタの削除や移動,他のブループリントクラスの関数やカスタムイベントを使用する事ができます。ちょっと簡単に紹介していきます↓
🌟Step3:他にも参照するとできる事は?簡単に紹介
参照すると他のブループリントクラスの変数を編集したり、削除したり移動させたり回転させたり、関数やカスタムイベントも呼び出せます。つまり参照を行うとほぼ何でも他のブループリントから操作する事が出来ようになる訳です。できる事の例を紹介していきます。
①他のブループリントクラスを移動させる事ができる
例えば他のブループリントクラスを移動させたい時には、先ほどのBP_Cube側のブループリントを以下のようにします。GetActorOfClassノードにはBP_Sphereを選択してAddActorLocalOffsetを追加し、DeltaLocationのZに200を入力しています。
https://scrapbox.io/files/65bcf4d79457d30029f49c5f.jpg
ターゲットピンにアクタの情報を入力しよう
AddActorLocalOffsetノードでどのアクタを移動させるか設定する入力ピン「ターゲット」があるので、そこにReturnValueからSphereの参照情報を繋げる必要があります。ターゲットはデフォルトでは「self」つまりそのままだとCube自身を移動させる設定になっています。なのでターゲットにどのアクタを移動させるか指定する必要があります。実は先ほどの変数でもターゲットピンが出てきましたが、同じように"どの"ブループリントクラスの変数なのかを示すためのターゲットピンです。
プレイしてみると、BP_CubeからBP_Sphereを移動させる事ができました↓
https://scrapbox.io/files/65bcf56cbbff6d0026cca374.gif
🐱このように参照によって別のブループリントクラスやアクタを移動させる事ができます。もう一つ紹介していきます↓
②他のブループリントクラスのカスタムイベントや関数を使用できる
また参照すると他のブループリントクラスのカスタムイベント(自分で作れるイベント)や関数(ノードをまとめたノード)も使用できるようになります。以下他のブループリントクラスのカスタムイベントを呼び出しています。
BP_Sphere側で右クリック > customと検索 > カスタムイベントを追加 > 名前をSphere_Eventという名前にします。
https://scrapbox.io/files/65bcf655f5723f0023900d62.gif
PrintStringノードを接続して「BP_Sphereにあるイベントが呼び出された!」と入力しておきます。
https://scrapbox.io/files/65bcf69d486f99002438d25e.jpg
BP_Cube側でノードを以下の様に作成します。GetActorOfClassノードからSphere_Eventが呼び出せるようになっているので、カスタムイベントを呼びます。
https://scrapbox.io/files/65bcf6cf652556002402dfa2.jpg
プレイしてみると、BP_Cube側からBP_Sphereのカスタムイベントを呼びだす事が出来て「BP_Sphereにあるイベントが呼び出された!」とテキスト表示されます。
https://scrapbox.io/files/65bcf702a784c6002d0d7b48.jpg
🐱このように参照すると他のブループリントクラスで作成したカスタムイベントや関数も使用する事ができます。
"参照する"とは?まとめ
参照を行うと他のブループリントクラス、またはブループリントクラスではないアクタを色々操作できるようになります。例えば他のブループリントクラスを削除したり、移動させたり、そのブループリントクラスの変数なども変更できるようになります。
https://scrapbox.io/files/65bcfa6a384fa00025f7fca3.jpg
《🌟実践演習》
風船の破裂システム
目標:BP_Sphereのサイズを徐々に上げていき、10秒後にBP_Sphereをデストロイするシステムの作成
①BP_Cubeのレベルグラフの中でブループリントを組みます。Sphereのサイズは、xyzともに、一律の大きさで増えていくので、今回はVector型を使用してサイズを大きくしていきましょう。
③サイズの変更は毎フレームごとに0.01ずつサイズを大きくしていきます。サイズの変更にはSet Actor Scale 3Dを使用します。
②ゲーム開始時に、BP_Sphereクラスを取得し、10秒のDelayの後、Destroy関数でBP_Sphereを削除しましょう。
④破壊後にエラーが出ないように、Bool型の『IsDestroy』という変数を作成し、破壊後にクラスが取得できませんというエラーが出ないようにしましょう。
https://scrapbox.io/files/669f4c7711460c001d810724.png