【日本語】 UE4 ホッケーゲーム part.18 Custom Event でパックをポン 【チュートリアル】
パックが壁をすり抜けて何処かへ行ってしまったり、壁にはまって動かなくなった場合の対処方法を追加していく。今回は、[SPACE] キーを押すことで、パックがテーブル中央に戻るようにして、これに対応したいと思う。だが、パックが中央に出るタイミングは、[SPACE] キーを押した時だけではなく、ゲームが始まってすぐや、ゴールした後でもいいだろう。そこで、ユーザーの指定した複数のタイミングで実行する、[Custom Event](カスタムイベント)というノードを使うことにする。
----------
今まで、[Event ~] で始まるノード(イベントノード)は2つ出てきたと思う。[Event BeginPlay] と [Event Tick] だ。[Event BeginPlay] は、最初に1回だけ実行しに行くもので、よく初期設定をブチ込みたい時に使う。[Event Tick] はいわゆる毎フレーム実行しに行くもので、いつでも監視していたい時に使う。2つともUE4が決めたタイミングで呼ばれるものである。
今回、テーブル中央にパックを出すのだが、上で述べた2つのイベントノードは使えない。最初の1回しかパックを出さないなら、1点とったら終わっちゃうし、毎フレーム出してたら画面がパックだらけになってしまうからだ。
というわけで、自分の好きなタイミングで呼べる(実行できる)イベントノードが欲しいのだが、なんとそんな素敵なノードを、EPICさんは用意してくれているのだ。それが、先にも書いた [Custom Event] というものだ。
----------
まずは [Custom Event] を作る。
- "LV_2_Game" のレベルブループリント。空いている場所で、
右クリから、"Add Custom Event" を検索して選択 - 名前を付ける。パックを出すから、"PuckDasu" としてみた
- パックを出すのだから、パックのリファレンスが必要なので追加
- [SetActorLocation] を追加して、[New Location] を [x:0 y:0 z:30] に設定
【追加の解説】
[1] とにかく先にカスタムイベントを作らなければいけないことが最大の注意点。中身を作ってから、必要に応じて呼び出すようにするのだ。「呼ぶ」場所に先にノードを入れておきたいなーと思うかも知れないが(俺だけか?)、それは順番が逆だ。「作ってから呼ぶ」、この順番を忘れてはいけない。無いものは呼べないからな。
[2] 名前を付ける前に決定してしまっても、焦らなくて大丈夫。ノードを選択して [F2] でリネームできるし(これはWindowsと同じ)、右クリからもリネームを選べるし、右側に出る [Details] からでも変更できる。心配しなくてよい。
[3] リファレンスの追加の仕方はもう大丈夫かな? アクタを選択したままで右クリな。非常に重要だから忘れないでくれ。
[4] そして、アクタの位置をテーブルの真中に「セット」するのだから、[SetActorLocation] を使う。パックが10cm浮くように [z] には "30" を入れる。
----------
さて、これで、呼び出すイベントが出来たので、早速呼びだそう。タイミングは何時か? とりあえず、ゲーム開始すぐと、[SPACE] キーを押した時の2箇所にしてみよう。
- [Event BeginPlay] から始まるノードの最後に追加していく
- 最後にあるノード [Set View Target with Blend] から白線を引っ張りだして
"PuckDasu"を検索 - 選択して完成。レベル初期化時に1回だけ呼び出すようにしたことになる
---1カ所目完了--- - 空いている所で右クリ、"space" で検索して
[Keybord Events] の [Space Bar] を選択 - そこからも [PuckDasu] をつなぐ
---2カ所目完了---
【追加の解説】
[1]~[3] ゲーム開始時に1回だけ行う場合は、ここに直接書いてしまえばいい。だが、ココだけでなく、[SPACE] キーを押した時にも同じ処理を行うことにしている。こちらにも同じことを書くのは、イイことではない。メンテナンス上の問題があるのだ。修正する時にあっちもこっちも直さないといけない。あっちだけ直して、こっちを直し忘れたなんてことも出てくる可能性がある。さらに、違う場所に同じ処理を追加したい時、同じことを書かないといけないのは面倒だ。というわけで、同一の処理はカスタムイベント化して、それを呼ぶことにしている。1つ作っておけば、修正も追加も楽ということ。
[4][5] ほぼ同上だな。
----------
これで、パックが中央に出るようになった。だが、[Compile] して [Play] してみると分かるのだが、一度壁をすり抜けたパックが戻って来ても、再度すり抜けて行くことがあると思う。これは、パックのスピードが十分に落ちていないのでそうなるのだ。戻す時に位置にしか手を加えてないので、スピードはそのままで戻って来ているのだ。では、中央に出す時にスピードにも手を加え、パックのスピードを調整してしまおう。
さあ、早速修正しないといけない箇所を発見した。この場合、2箇所に直接処理を書き込んでいたら、修正するのも2箇所で、めんどくさかったと思うぞ。一箇所を直せば済むようになっているカスタムイベント化をしておいて、よかったな~って思うだろ。な。
- カスタムイベント [PackDasu] に追加する。 "Puck" のリファレンスを出す
- リファレンスから引っ張りだして、"Set Physics Linear Velocity" を検索して選択。途中に1つノードが追加されるはず
- [New Vel] を右クリして "Split"
- [Random Float in Range] を2つ出して、それぞれ [New Vel X] と [New Vel Y] に接続。[Min] と [Max] は "-800"、"800" と "-400"、"400"。
【追加の解説】
[1] どのノードでも、コピペ出来る。リファレンスもコピペでいける。
[2] [Set Physics Linear Velocity] は高校の時に物理でやった「速度」を設定するもの。速度は "v" で表した。これは "velocity" の "v"。"linear" は「直線の」という意味。物理でやった速度は、「方向」も持ってたハズ。速度と方向を指定できるということなのだが、もっと簡単に言えば、等速直線運動の速度を設定するノードと考えればいい。これで、パックに指定の方向と速度を与えることが出来る。物体の移動方向と速度を、いきなりこれで設定出来るので、非常に便利。
※ ちな、"velocity" の "800" とはたぶん、秒速800cmのことだと思うが、自信はない。
ただ、コンポーネント単位で速度の設定をするので、真ん中に挟まれるノードが出るのだと思う。今はやらないが、試しに子を持ったアクタを作って、どうなるか実験してもいいかも。ノードとコンポーネントに関して理解が深まるかもよ。
[3] 入力ピンの分解は以前やった。これも分解して個別に数値を入れられるようにしておこう。
[4] [Random Float in Range] というのは、[Min] から [Max] の数値の間で乱数を出してくれるノード。テーブル台の横方向(y)より縦方向(x)のが長いから、縦へのスピードを早くしておく方がバランスが取れると思って、こうしたが、お好みで調整してくれ。"-" の値が出ればマイナスの方向に進むし、"+" の値が出ればプラスの方向に進む。大丈夫だよね、この辺は。
----------
さ、これで、パックが中央に出る時の調整は出来たので、かなり良くなったとは思う。マレットで、バンバン打ちまくってくれ。何かあったら、[SPACE] だ。
次回は、もうちょっとパックのことをやる予定。では、また。"Save All"。