俺に解るように説明する "Unreal.Engine.4" 入門+

UnrealEngine4とかチュートリアルとか入門とか

【日本語】 UE4 ホッケーゲーム part.23 ゴールと得点管理3 (俺的 cast to ~~ の理解)【チュートリアル】

自作の [GameMode] である "ZZ_GameMode" に変数とカスタムイベントを追加した。2面のレベルブループリントから、このカスタムイベントを呼ぶ。場所は、[OnActorBeginOverlap (GoalCom)] の最後に付けた [PuchDasu] の前。ここに処理を追加する。

f:id:ore2wakaru:20160423174637j:plain

----------

  1. 右クリから、"game mode" で検索し、[Get Game Mode] ノードを出す
  2. [Get Game Mode] の [Return Value] ピンから引っ張って、"cast" で検索し、
  3. [Cast To ZZ_GameMode] ノードを出す
  4. [Cast To ZZ_GameMode] の出口の実行ピンから引っ張って、
    "point" で検索し、
  5. 自作したカスタムイベントである [Point Player] ノードを出す

f:id:ore2wakaru:20160423183401j:plain

  1. あとは白線を繋げればいいだけと思いきや・・・
  2. [As ZZ Game Mode] と [Target] を忘れずに繋ぐ!

f:id:ore2wakaru:20160423184947j:plain

【追加の解説】

[1] [Get GameMode] とは何か? [Get PlayerController] 同様、分かり難いノードだと思う。(俺だけか?)だが、同様なので、どっちかが分かれば、両方分かったも同然となるので、実は逆にありがたい。

[Get PlayerController] はEPICさんが用意したアクタ [PlayerController] が持っている情報にアクセスするノードだった。忘れちゃった人は、前の記事を読み直してくれ。お暇な人はさらに、ここ"知らないうちに出来てるアクタ!?"も読んでおいてくれ。おれの愚痴が書いてある。

非常に簡単に言うと、[Get GameMode] も同様、EPICさんが勝手に用意したアクタ [GameMode] の情報にアクセスするためのノードだ。[GameMode] は [PlayerController] や [DefaultPawn] なんかを規定する親分的な存在だった。

[2][3] だが今回アクセスしたい情報(得点を加算するカスタムイベント)は、EPICさんが用意したデフォルトの [GameMode] ではなく、自作した [GameMode] "ZZ_GameMode" にある。2面に入って置き換えた方だ。つまり本当は、できるなら、[Get "ZZ_GameMode"] としたいのだ。こうすれば、"ZZ_GameMode" にアクセス出来るからな。だが残念ながら、直球でアクセスするノードは用意されていない。そこで登場するのがキャスト(cast)だ。[Cast To ~~] というノードを挟んで使う。一旦、[Get GameMode] としてそこから [Cast To ZZ_GameMode] と書くことで [Get "ZZ_GameMode"] と書いたのと同じ様にすることが出来る。

キャスト(cast)とは「投げる」という意味なのだが、実際にやってることは、どうも「確かめる」的なことのように俺には思える。俺のキャストに関する理解は自作PC的な感じで、こうだ。。。違うかも。。。

CPUソケットには、i3、i5、i7など、色々なCPUが載せられる。[Get GameMode] というのは、[Get CPUソケット] みたいなレベルでアクセスしているイメージ。つまり、ソケットの先に何が繋がっているかは確かめずにアクセスしているのだ。例えば、1000本近くあるピンの45番目のピンに電気を流せばオーバークロックするように設計されていると考える。この場合、別にソケットの先に何が刺さっていても関係なく、45番ピンに電気を流せばCPUはオーバークロックする。i3だろうがi5だろうが、ソケットの先に何があっても関係ないってことだ。

だが、i7でなければ出来ない命令(8コア目を使え~とか)があった場合、ソケットの先にちゃんとi7が繋がっていることを「確かめ」なければならない。その「確認をする」のがキャストだ。一旦は、[Get CPUソケット] とし、その次に [Cast To i7] として、ソケットの先にi7が繋がっているか「確認する」。

f:id:ore2wakaru:20160423211050j:plain

今回は繋がっている先が "ZZ_GameMode" じゃないとイケないから(そこに "PointPlayer" があるから)、ちゃんと「確かめる」必要がある。だから、「キャスト」しなければならないのだ。

[4][5] [Cast To ~~] をつかうことで "ZZ_GameMode" にアクセス出来た。これで、"ZZ_GameMode" に作ったカスタムイベント "PointPlayer" を呼ぶことが出来る。すごいな。レベルブループリントから、他のアクタにあるブループリントを呼べるってことだぜ。恐るべし "cast"。キャストの概念、ご理解いただけたかな? (ま、そもそも考え方が間違ってるかもだがな。)

[6][7] あとすこしで完成だが、実行線だけ繋ぐのでは不十分。青い線も繋ぐのだ。これは [Ponit Player] ノードを見てくれれば分かるのだが、[Target] ピンを持っているだろ。つまり「リファレンスの指定」ってやつだ。な、大事だろ、リファレンス指定。ここを繋ぐとこで、これが "ZZ_GameMode" にあるイベントだと指定するのだ。繋がないと、レベルブループリント上のイベントだと思われちゃう。ちょっと面倒だな。

----------

さ、これで、相手ゴールのみだが、ゴールが決まったら、得点が加算されるようになった。点がちゃんと入るか、軽く確認をするため、"ZZ_GameMode" のカスタムイベント "PointPlayer" に [Print String] を追加して確認してみよう。

f:id:ore2wakaru:20160423213156j:plain

どうかな、コンパイルしてプレイ。ゴールに入ると、得点が加算されているな。上手くいったと思いたいのだが、、、

f:id:ore2wakaru:20160423213713j:plain

、、、1回のゴールで 2回分加算されるコトが、、、頻発。。。1点の時もあるけど、コッチのが少ないで。。。

なんでやねん。

----------

というわけで、今回はここまで、次回はこれを何とかしよう。

ではまた、"Save All"。