ビデオの内容紹介 前回に引き続いてドア開閉のためのブループリントを作っていきます。この巻では、陥りやすい誤りを確認しながら、最終的にドアが開閉できるようにします。関数や変数、参照の使い方を学ぶことができます。
原題 Creating a Level – 10 – Blueprint Doorway Pt2
★作成中のレベルブループリントを開く方法 (0:09)
スロー ビューポートの上アイコン群左から6番目Blueprintsを展開 → Open Level Blueprint
★グラフ内で視点を動かす方法
スロー マウスを右クリックしながらドラッグ
★グラフ内でズームアウト/インする方法
スロー マウスのホイールを動かす
☆セットされた位置までドアが動くようにする (0:24)
ビューポート内でドアを選択 → ブループリント内のスペースを右クリック → Add Reference to SlidingDoor (SlidingDoorへの参照を追加) → 右側の青色のピンからワイヤをスペースに伸ばす(ドラッグアンドドロップ) → 表示されたウィンドウの検索欄にlocationと入力 → Set Actor Location (アクタの位置をセット)を選択 → Sliding Door TimelineのUpdate(更新)からSet Actor Location内左側1番上のピン(マウスオーバーするとexec[実行]と表示される)にワイヤをつなげる → Sliding Door TimelineのDoor LocationからNew Locationにワイヤをつなげる → (この時点でPlayボタンを押してドアに近づいてもドアは動かない)
メモ ここで行ったことの意味をまとめておきます。まず、SlidingDoorへの参照がSet Actor Location (アクタの位置をセット)という関数のTargetに接続されているので、Set Actor Location (アクタの位置をセット)が処理する対象が、窓やフロアなどではなくSlidingDoorだということになります。このSet Actor Location (アクタの位置をセット)という関数は、そのアクタ(この場合ドア)を実際にその位置まで動かします(実験してみると分かりますがTimelineだけではドアは動きません)。ではその関数がいつ呼び出されるかというと、TimelineがUpdate(更新)するたびにです。ですから、このUpdateと関数がつながっているわけです。そして、具体的にどの位置までドアを動かすのかというと、TimelineのDoor Location(アニメーションカーブで決まる位置です)が関数に送られていきます。だからTimelineのDoor Locationが関数のNew Locationにつながっています。
キーワード 参照(reference): 何かの位置を教えてくれる(Getしてくれる)関数があるとします。この関数に働いてもらうためには、何の位置を取得してもらいたいのかを当然示さなければなりません。そうでなければ、窓の位置を教えればよいのか、ドアの位置を教えればよいのか関数は分からないからです。ブループリントでは、この「何の」に当たる部分が「参照」です。たとえば、「ドアのですよ」と示すのが、SlidingDoorという名前がついた「参照」(ドアへの参照)だったりするわけです。関数のTargetにつなげることで、関数は「ドアの位置を取得すればいいのですね」と分かることになります。
☆ドアが動くものとして設定する (1:19)
スロー ビューポート内でドアを選択した状態で、DetailsのMobility(可動性)をMovable(移動可能)にする
メモ しかし、この時点でPlayボタンを押してドアに近づいてもドアはどこか彼方に行ってしまいます。この原因は、アニメーションカーブでゲーム開始時のドアの位置を(0,0,0)にしているからです。この問題を解決するためには、次のようにします。
☆ドアが消えてしまわないようにするために、ゲーム開始時にドアの位置を取得しておく (2:30)
スロー スペースで右クリック → 検索欄にbeginと入力 → Event Begin Play(プレイ開始時のイベント)を選択 → 先ほどAdd Reference to SlidingDoorから作成したSlidingDoorを選択 → 選択した状態でCtrl+W(複製ができる) → 右側の青色のピンからワイヤをスペースに伸ばす(ドラッグアンドドロップ) → 表示されたウィンドウの検索欄にlocationと入力 → Get Actor Location(アクタの位置を取得)を選択 → Return Value(戻り値)からワイヤをスペースに向かってドラッグアンドドロップ → Promote to Variable(変数に昇格)を選択 → 左側My Blueprintの下Variablesの欄の一番下の仮の名前にDoor Initial Location(ドアの初期位置)という名前を新たに入れる → Event Begin PlayのexecピンからワイヤをDoor Initial Locationに接続
キーワード 関数(function): 何らかの情報を教えてくれたり、何らかの処理をしてくれるノードです。たとえば、あるものの位置を教えてくれる関数や、あるものをある位置まで移動させる関数などがあります。関数の流れは普通、ある値を渡すと、ある値を返してくれたり、あることを処理してくれるという流れになります。
戻り値(return value): 関数から返ってくる値のことです。「返り値」とも言います。
変数(variable):具体的な値が入っている文字のことです。たとえば、aという文字に3という値を入れた時、変数はaであり、その変数の値は3です。中の値がいろいろ変わっても、aという文字は代わらないので、変数を使うと便利な場合が多々あります。
メモ ここで行ったことの意味をまとめておきます。アニメーションカーブで設定したドアの位置が、ゲーム開始時に(0,0,0)であるので、これに実際の位置を足さなければなりません。アニメーションカーブで設定した値は、ドアの実際の位置「から」どのくらい動くかという値であり、実際のドアの位置ではありません。
そこで、まずゲーム開始時にドアの位置を取得しています。そのためには、Get Actor Location(アクタの位置を取得)という関数を使っています。位置を取得する対象はもちろんドアですから、ドアへの参照を関数のTargetにつなげています。
関数が返してくれる値を変数(Door Initial Location)に昇格しているのは、扱いやすくなるからです。たとえば、後で何らかの都合で中の値を変えなければならなくなっても、変数にしてあれば、値の部分だけを変えるだけで、変数自体は変える必要がないからです。逆に、変数ではなく生の値のままであったら、いろいろな場所でその生の値を使っている場合は、修正が大変です。
さて、この位置の値をこの変数にセットするのは、ゲーム開始時にしたいので、Event Begin Playをつなげています。これはイベントノードなので、何かをトリガーすることができるのでした。この場合は、ゲーム(プレイ)が開始したらセットをトリガーしています。
☆ドアの本当の位置を計算して、そこまでドアを動かすようにする (3:29)
スロー 左側My BlueprintのDoor Initial Locationをグラフ内にドラッグアンドドロップ → Get(取得)を選択 → ピンからワイヤをスペースにドラッグアンドドロップ → 検索欄にadd → Vector plus Vector(ベクタ+ベクタ)を選択 → (ワイヤどうしが線が重なって見づらくならないようにするために一旦ワイヤを外す)ワイヤのつながっているピン上でAltを押しながら左クリック → 下の方のベクタ(マウスオーバーするとstruct’Vector’Bと表示されるほう)に改めてワイヤを接続する → Sliding Door TimelineのDoor LocationとVector plus Vectorのstruct’Vector’Aを接続する → Vector plus Vectorの右側のピンからSet Actor LocationのNew Location(新たな位置)にワイヤをドラッグアンドドロップ → 左上Compileを左クリック
★ワイヤの接続を切る方法 (4:06)
スロー ワイヤのつながっているどちらかのピンを、Altを押しながら左クリック
メモ ここで行っていることの意味をまとめておきます。先ほど作った変数(Door Initial Location)をさっそく利用しています。これにアニメーションカーブのドアの相対的位置を加えています(アニメーションされるドアの実際の位置になります)。この時、両者ともベクターなので、Vector plus Vectorという関数を使っています。加えた結果をNew Locationにつなげて、ようやくこの位置までドアが動くようになります。
メモ ただし、これでテストしてみると最初に近づいてもドアが開きません。一旦バックして再度近づくと開きます。次で原因を考えます。
☆ビューポートとブループリントを同時に見て原因を考える (4:59)
スロー ウィンドウをフロートさせて、ビューポートとブループリントを同時に見えるように並べる → Alt+P (Playボタンと同じ) → (ビューポートの動きとブループリントの流れを同時に見ることができます)
★ウィンドウをフロートさせる方法 (4:59)
スロー ビューポート内左上の黄色い三角をクリック
メモ ①ビューポートの動きとブループリントの流れがシンクロします。それを見ると、ドアに近づくとOnActorBeginOverlapとOnActorEndOverlapが同時に発動していることが分かります。これは、ドアが開いたために、ドア自身がセンサー(TriggerBox)から出たことによってOnActorEndOverlapが発動するためです。②いろいろやっているうちにウィンドウが消えた場合は、エディタ左上の「Window」をクリックすると、「Details」や「Viewports」や[Scene Outliner」があるので、それをクリックします。
なお、ウィンドウを元に戻さなければならないので、
★ウィンドウの配置を変える方法
スロー タブの部分をつかんで移動すると、白い補助線による区画割りが現れるので、望みの区画のところまでドラッグして、ウィンドウの大きさが変わるのを見てドロップする。
★ウィンドウからタブを非表示にする方法(フロートを取り消す方法) (6:28)
スロー タブの部分を右クリック → Hide Tab(タブを非表示に)を選択
☆OnActorBeginOverlapとOnActorEndOverlapが同時に発動する問題点を修正する (6:21)
スロー TriggerBoxを選択 → DetailsのCollisionのCollision PresetsでTriggerからCustomに変更 → ignore(無視)にチェック(これでTriggerBoxが無効に) → Pawnという項目でoverlap列のチェックボックスにチェック (TriggerBoxがPawnだけに反応するようになります)
キーワード Pawn(ポーン): プレイヤー(私たち)またはAI(コンピュータ)によってコントロールされるゲーム内のキャラクターのことです。外見だけでなく、コリジョンなどの物理的相互作用のあり方もここで決まります。
☆OnActorEndOverlapの発動に遅れを取り入れる (8:16)
スロー OnActorEndOverlapのピンからワイヤをスペースにドラッグアンドドロップ → 検索欄にdelayと入力 → Delayを選択 (Delayノードが挿入される) → Duration(時間)に0.5と入力 → エディタ左上のCompile
どうもお疲れ様でした。