Cast のことを教えてください (翻訳/要約)

(以下は、英語スレッドの質問を翻訳/要約したものです。)

Cast のことを理解しようとしているのですが、とっても難しいです。まず、Cast (投げる) は「ボールを投げる」感じでメッセージをやりとりすることだと思っていたのですが、映画の俳優のキャストのことだと気がつきました。


それで、どのような機能かは分かったような気がするのですが、まだ、次の画像の赤枠で囲んだピンに何をつなげればいいのか正確には分かっていないのです。

たとえば、HUD から Character に Cast したいのです。

それで、HUDblueprint の中で FPSCharacter への Cast を追加してから、Get Player Character をあのピンにつなげたのですが、「すでにキャストされています」的な警告が出ます。何をつなぐべきでしょうか?

–yghtim

[英文スレッド][2]

(以下は、英語スレッドの回答を翻訳/要約したものです。)

Cast は面白いテーマですね。Cast というのは、あるオブジェクト (訳注: Cast To ~ ノードの左側にある Object ピンにつなげられるオブジェクトのことです) が、ノードのキャスト先 (訳注: 画像の例では LargeCube_Blueprint のことです) と同じ型であるかどうかを調べるものです。

あなたの例では、Cast To LargeCube_Blueprint が、その Object ピンにつなげられている値が何であろうとも、そのオブジェクトが LargeCube_Blueprint であるかどうか、または LargeCube_Blueprint の子ブループリントであるかどうかを検査します。もし、そうであれば、(Cast To~ ノードの右側上の実行ピンにつながる) 一連の命令を実行させ、そうでないならば、(Cast Failed につながる) 別の命令を実行させることになります。たとえば、もしもそのオブジェクトに含まれているある変数の値を Get したいならば、As LargeCube_Blueprint (= LargeCube_Blueprint として) というピンに Get をつなげます。

Cast はドラマ俳優のことを考えてみるといいです。たとえば、『Firefly』というドラマがありますね。Nathan Fillion (俳優。実在の人物) が Malcolm Reynolds (ドラマの登場人物) の親クラスです。ですから、Nathan Fillion (俳優) は、Cast To Malcolm Reynolds (Malcolm Reynolds へキャストする) ことができます。Nathan Fillion (俳優) は拳銃をもっていませんが、Malcolm Reynolds (登場人物) はもっているとします。すると、Nathan Fillion (俳優) は、Malcolm Reynolds (登場人物) にキャストすることによって、簡単に拳銃を使うことができるようになります。

(訳注: この場合の「拳銃」とは、先の「変数」のことを言っています。)

–Adam Davis :diamonds::diamonds: STAFF

(以下は、英語スレッドのコメントを翻訳/要約したものです。)

ありがとうございます。でもまだ、Object ピンに何をつなげればいいのかはっきりしないのです。LargeCube_Blueprint であるかどうか検査する必要があるということでしたよね。そこで、LargeCube_Blueprint の参照を作って、それをつなげてみたのですが、「ループしている」的な警告が出ました。

–yghtim

(以下は、英語スレッドの回答を翻訳/要約したものです。)

電話のことを想像してみてください。電話するためには、電話番号 (= オブジェクトへの参照) が必要です。番号が得られたので、ある家族に電話したとします。お父さん、お母さん、男の子、女の子の計 4 人がいる家族です (あなたが話したいのは、職場の同僚であるお父さんだとします)。その 4 人のうちのだれかが無言で電話に出ました。Cast とは、それが誰なのか知ることです。

さて、ここで、比喩から実際の話に戻りましょう。

たとえば、あなたの Character が他の Character と衝突したとします。Event Hit を使うと、自分にぶつかったアクタは Other Actor (もう一方のアクタ) として得られます。ところで、そのぶつかったアクタは弾丸でしょうか?それとも他のプレイヤーでしょうか?あるいは…。

弾丸/発射物かどうか知らなければならない場合がありますので (先ほどの電話の例のように「お父さん」であるかどうか知る必要があるので)、Other Actor を Cast します。つまり、その Other Actor への参照を、Bullet (弾丸) クラス/ブループリントに Cast します。その Bullet (弾丸) クラスの名前が仮に BP_Bullet だとすると、 Other Actor を Cast To BP_Bullet ノードにつなげることになります。もしもうまく行ったなら (= Other Actor が Bullet (弾丸) クラスであったなら)、Other Actor を Bullet (弾丸) クラスとして扱えます。その中にある変数やイベント、関数にアクセスすることができるのです。もしうまく行かなったら (= Other Actor が Bullet (弾丸) クラスでなかったなら)、Cast Failed (キャストが失敗) 実行ピンから出てくる命令が実行されることになります。

要約: あなたのケースで必要となる参照は、他の所からもってこなければなりません。Cast は何かを作るということはありません。他のやり方でオブジェクトへの参照を得る必要がありますよ。

–Erasio :diamonds: