‫ねえ｡
‫お帰りなさい｡
‫さて､ 投射物ができて､ 命中イベントが発生することがわかったので､ 投射物が実際にターゲットに命中したときに何かする必要があります｡
‫そのためには､ ダメージを与えて､ 体力を把握する必要があります｡
‫そこで､ ヘルスコンポーネントと呼ばれるヘルスとダメージを扱うクラスを作成します｡
‫そして､ この機能が独自のクラスを持つ理由は､ 戦車や塔などの異なるクラスで再利用できるようにするためです｡
‫そこで､ この健康成分について説明します｡
‫これで､ シーンコンポーネントクラスの使い方に慣れました｡
‫さて､ このクラスはアクターコンポーネントと呼ばれるクラスから派生しています｡
‫実は､ ここに使用シーンコンポーネントのドキュメントがあります｡
‫そして､ 継承階層では､ その親があなたのアクターコンポーネントであることがわかります｡
‫さて､ you act aコンポーネントは､ you seenコンポーネントよりも基本的なものです｡
‫トランスフォームを搭載していない｡
‫つまり､ 位置､ 回転､ スケールは､ ユア・アクター・コンポーネントが持っているものでもないのです｡
‫アタッチメントに対応していない｡
‫アクティブコンポーネントは､ 例えば静的メッシュコンポーネントやカプセルコンポーネントにアタッチすることはできません｡
‫あくまでも､ 役者のものです｡
‫また､ 視覚的な表現や変形がないため､ 何かにくっつける必要もないのです｡
‫これに対して､ 使用シーンコンポーネントには､ 実際にトランスフォームがあり､ 他のコンポーネントにアタッチしたり､
‫他のコンポーネントにアタッチさせたりすることができます｡
‫だから､ 健康状態を把握し､ ダメージをケアするためには､ そういったものは一切必要ないのです｡
‫だから､ ある部品が最適になるように行動するのです｡
‫では､ エディタに戻って､ 新しいアクションをコンポーネント・クラスにしてみましょう｡
‫そこで､ ツールに上がり､ C++のクラスを新規に作成します｡
‫そして､ 下にスクロールすると､ アクターコンポーネントが見えますね｡
‫これが選択するものです｡
‫さあ､ 気をつけよう｡
‫アクターを選択しないでください｡
‫それは別のクラスです｡
‫実はアクターコンポーネントが持っているものよりも大きなクラスで､ いろいろなものがあるんです｡
‫特にアクターコンポーネントが必要なので､ それを選択して､ 次へをクリックします｡
‫そして､ これを単純に「健康成分」と呼ぶことができます｡
‫クラスの作成］をクリックしましょう｡
‫ここで､ 新しいヘルスコンポーネントとCPファイルを用意しました｡ 先ほど作成したヘルスコンポーネント（クラス）は､ コンポーネントとして機能するあなたから派生したものであることがわかります｡
‫だから､ ここに正しいタイプがあることを確認して､ そのUにあることがわかると思います｡
‫クラスのマクロです｡
‫このメタは､ ブループリントのスポーンテーブルコンポーネントの場所を指定します｡
‫これによって､ このコンポーネントをブループリントに直接追加できるようになります｡
‫新しい健康コンポーネントは､ 健康の世話をするつもりです｡ つまり､ いくつかの変数が必要です｡
‫では､ これらを追加して､ 非公開にします｡
‫そこで､ protectedのすぐ下にprivateセクションを追加し､ いくつかのhealth変数を追加してみましょう｡
‫さて､ これらはフロートにするつもりですが､ 最初のものをMax Healthと呼ぶことにします｡
‫これは､ 持てる体力の最大値となり､ 100Fなどの初期値に設定することができます｡
‫さて､ 最大体力に加えて､ 現在の体力を示す体力値があり､ これはダメージを受けると変化するものです｡
‫そこで､ もう一つフロートを作り､ これを単純にhealthと呼ぶことにしましょう｡
‫これでhealthを0Fに初期化し､ その値をセットしてプレイを開始することができます｡
‫その理由は､ Max Healthが独自のyouプロパティを持っていて､ 詳細パネルからそれを設定できるからです｡
‫そこで､ これにUプロパティを与えて､ どこでも編集できるようにしよう｡
‫そうすれば､ 開発を進めながら変更することができます｡
‫そして､ ここのヘルスコンポーネントCPで､ プレイを開始すると､ 単純にヘルスを最大ヘルスと同じ値に設定することができるのです｡
‫そうすれば､ 詳細パネルで変更した後でも､ ゲーム開始時にはヘルスは最大値のままです｡
‫さて､ これをコンパイルして､ エディタに戻ってBP - tankを開き､ フルブルーペイントエディタを開いてみましょう｡
‫そして､ この健康コンポーネントをコンポーネントパネルに追加することができます｡
‫そこで､ 「追加」をクリックし､ 「健康」を検索してみることにします｡
‫そして､ ここに健康を見ることができます｡
‫さて､ C++ではヘルスコンポーネントと呼んでいました｡
‫そして実際､ ポップアップで健康成分というのが表示されています｡
‫そのため､ ここで表示する際には､ その構成部分を取り除いて表示しています｡
‫また､ 静的メッシュコンポーネントやカプセルコンポーネントを探すと､ ここにもコンポーネントという言葉がないことにお気づきかもしれませんね｡
‫Healthコンポーネントの下にmax healthがあり､
‫100に設定されているのがわかると思います｡
‫それで今､ BP -- tankは健康成分を持っていて､ この健康成分を所有しているのはBP -- tankであると書いてありました｡
‫この健康コンポーネントの所有者です｡
‫コンパイルして保存して閉じて､ BP ポーン タレットを開き､ フル ブループリント エディタを開いて､ ポーン タレットにもヘルス
‫コンポーネントを追加してみましょう｡
‫そこで､ コンポーネントの追加をクリックし､ healthを検索してhealthを選択しましょう｡
‫そして今､ 私たちはタワーに健康コンポーネントも搭載しています｡
‫そこで､ これらをコンパイルして保存し､ すべてをクローズアウトして保存します｡
‫健康コンポーネントを作成し､ 異なるクラスで再利用できるようにしたいと述べました｡
‫例えば､ ポーン（塔）があれば､ その塔は独自のヘルスコンポーネントを持ち､ さらにタンクも独自のヘルスコンポーネントを持つことができるわけです｡
‫さて､ 射線がこれらのいずれかと相互作用するとき､ たとえば､ これらのものに当たったときにヒットイベントが発生すると､
‫ポーンはヘルスコンポーネントの機能を起動し､ ヘルス値を変更することができます｡
‫例えば､ ポーンの基底クラスにヘルス機能を置き､ それをタンクやタワーに継承させるといった方法と比べると､
‫ヘルス機能をコンポーネントに置き､ そのコンポーネントをクラスに追加することには､
‫いくつかの利点があります｡
‫これにより､ タンクとタワーのクラスを小さくして､ それらのクラスの特定の機能のみを扱うことができるようになりましたね｡
‫一方､ ヘルスコンポーネントは､ タンクやタワーのように動作しないものなど､ 他のアクターに追加することができます｡
‫例えば､ 破壊可能な壁を作り､ 十分なダメージを受けたらすぐに破壊されるようにすることができます｡
‫では､ どうすれば今すぐ実現できるのか､ 少しお話ししましょう｡
‫Unreal Engine にはダメージ機能が組み込まれており､ そのダメージ システムも実は非常に洗練されています｡
‫このゲームのアクターは､ いくつかのダメージイベントを継承しており､ そのうちの1つはダメージを受けたときに呼び出されます｡
‫コンポーネントヒット時と同様､ マルチキャストデリゲートです｡
‫これからポーンにヘルスコンポーネントを追加していきますが､ これらはUに基づいています｡
‫健康部品クラス｡
‫ポーンがこのon take any damageデリゲートを継承することが分かっているので､ ヘルスコンポーネントクラスで独自のカスタム関数を作成すれば､
‫この関数をコールバックとして使用し､ on take any damageデリゲートにバインドすることができるのです｡
‫そのため､ ダメージイベントが発生するたびに､ ダメージデリゲートがブロードキャストし､ その呼び出しリストでそれにバインドされている関数が呼び出されることになります｡
‫そこで次の問題は､ そのデリゲートを実際にブロードキャストさせるにはどうしたらいいか､ ということです｡
‫ダメージイベントを発生させる方法が必要です｡
‫ゲームプレイのスタティックには､ それを実現する機能があり､ 「ダメージを与える」と呼ばれています｡
‫このゲームプレイのスタティック関数を使用してダメージを与える場合､ ダメージを与えるアクターを含むいくつかのパラメータを取ります｡
‫つまり､ apply damageを呼び出すと､ take any damageデリゲートでアクターが起動し､ その応答としてコールバック関数が呼び出されることになります｡
‫つまり､ ダメージを与えるということは､ ダメージイベントを発生させるということです｡
‫そこで､ これらすべてをセットアップするために､ 3つのステップを用意しました｡
‫まず､ コールバック関数を作成します｡ この関数は､ on take any damageにバインドされるため､ 正しい入力パラメータを持つ必要があり､
‫on take any damageがこれを呼び出し､ ダメージイベントに関するすべての関連情報を渡します｡
‫ステップ2は､ このコールバックをデリゲートにバインドすることです｡
‫この方法は､ on component hitデリゲートでadd dynamic関数を使用することで確認しました｡
‫こちらも同じようにやっていきます｡
‫そして3つ目のステップは､ you game playのスタティック関数､ applied damageを呼び出してダメージイベントを発生させることです｡
‫それでは､ コードに戻り､ この設定を始めましょう｡
‫なるほど｡
‫ここではhealthコンポーネントで､ コールバック関数を追加しています｡
‫さて､ これはvoidでもいいし､ 好きなように呼んでもいい｡
‫これをダメージテイクと呼ぶことにする｡
‫また､ デリゲートにバインドしているので､ そのデリゲートに適した正しい入力パラメータを持つ必要があります｡
‫on take any damageデリゲートにバインドされる関数では､ 入力パラメータリストは次のようにする必要があります｡
‫1つ目は､ Damaged Actorというアクターポインターで､ このような音がします｡
‫ダメージを受けるのは役者です｡
‫次にdamageというfloatがあり､ これが実際のダメージ量になります｡
‫さて､ 次にダメージタイプというコストユーのポインターです｡
‫そして､ この入力パラメータがあるのは､ Unreal Engineにダメージタイプの概念があるからです｡
‫カスタムダメージは､ ダメージの種類によって異なる処理を行うための追加データを作成することができます｡
‫火災による被害
‫毒のダメージ
‫爆発的なダメージなど｡
‫また､ ダメージタイプごとにカスタム機能を実装したい場合は､ 独自のカスタムダメージタイプに実装することになります｡
‫独自のダメージタイプを作成するわけではありませんが､ この関数をon take any damageデリゲートにバインドするため､
‫これらの入力パラメータを持つ必要があります｡
‫だから､ ここに収録しているのです｡
‫さて､ 次のパラメータはAコントローラのポインタで､ これはinstigatorとUnreal Engine Damage Systemと呼ばれるものです｡
‫インスティゲーターとは､ 損害の原因となるコントローラーのことです｡
‫つまり､ 最終的にポーンを操作しているプレイヤーが被害を受けたのであれば､ そのポーンを所持しているコントローラーが発案者となるわけです｡
‫今は､ 必ずしも扇動者がいる必要はないのです｡
‫もしなかったら､ これは単にNULLになるだけです｡
‫そして､ 赤い四角が表示されたので､ ここの括弧の中でAコントローラクラスを前方に宣言して､ 関数にすることができます｡
‫さて､ 最後のパラメータはアクターポインターで､ これはダメージコーザと呼ばれています｡
‫これが､ 実際に被害を与えている役者です｡
‫これは投射物そのものでしょう｡
‫このダメージ取得コールバック関数は､ 他のヒット時のコールバック関数と同じように宣言されています｡
‫これはu関数でなければならない｡
‫そこで､ この関数にマクロを追加して､ on take any damage delegateにバインドしたときに動作することを確認します｡
‫そして､ 宣言ができたので､ CPPファイルに定義する準備ができました｡
‫だから､ ここ健康部品では､ CPP｡
‫下の方では､ この関数にボディを付けて､ クラス名で関数を完全に修飾します｡
‫そして､ 今度はコールバックです｡
‫では､ これをデリゲートにバインドする必要があります｡
‫しかし､ デリゲートはヘルスコンポーネントに存在するのではなく､ アクターに特化して存在するのです｡
‫このコンポーネントを所有するポーンの､ ダメージを受けたときのデリゲートにバインドしたい｡
‫では､ このコンポーネントのオーナーにアクセスして､ そのデリゲートのひとつにバインドするにはどうすればよいのでしょうか｡
‫さて､ こうしてプレイを始めるわけですが､ コンポーネントのオーナーにアクセスする方法は､
‫gitのオーナー関数です｡
‫これにカーソルを合わせると､ アクターポインターが返されることがわかります｡
‫コンポーネントを所有するアクターへのポインタです｡
‫コンポーネントはポーンによって所有することができ､ それらはアクターによって所有することができるので､
‫アクターポインターの形で所有者を返します｡
‫コールバック関数ができたので､ 2番目のステップとして､ ヘルスコンポーネントを所有するポーンに発生するダメージを受けるためのデリゲートに､
‫コールバック関数をバインドすることにします｡
‫コールバックをデリゲートにバインドした経験があるので､ これがヘルスコンポーネントクラスでの課題となるわけです｡
‫Begin Playでは､ コンポーネントのオーナーに存在するon take any damage delegateに､ 被ダメージをバインドすることになります｡
‫つまり､ get owner関数でそのデリゲートにアクセスすることになります｡
‫言い換えれば､ あなたは､ 所有者を取得し､ そこから､ 任意の損傷を取るにアクセスするつもりだ呼び出すつもりです｡
‫それから､ コールバックをデリゲートにバインドする方法は､
‫add dynamicを使用すればわかります｡
‫なるほど｡
‫ヘルスコンポーネントに戻り､ コールバック関数のバインディングを行う準備が整いました｡
‫git owner関数を使ってオーナーにアクセスし､ そこから矢印演算子を使ってonと呼ばれるデリゲートにアクセスし､
‫take any damageでダイナミック関数を追加し､ ユーザーオブジェクトと関数名を取るだけです｡
‫ここで､ ユーザーオブジェクトは､ 関数をバインドするオブジェクトです｡
‫これはコールバック関数を持つクラスで､ このようになる予定です｡
‫そして最後にコールバック関数を用意します｡ これはあなたになる予定です｡
‫受けた健康成分ダメージ｡
‫ここで､ operatorのアドレスを覚えておく必要があります｡ なぜなら､ これは実際には関数のアドレスを取るからです｡
‫つまり､ damage takenはon take any damageにバインドされ､ そのデリゲートの呼び出しリストに追加されます｡
‫そのため､ ダメージイベントが発生すると､ このデリゲートからブロードキャストされ､ その結果､ ダメージを受ける関数が呼び出されることになります｡
‫要約すると､ 独自のヘルス コンポーネントを作成し､ これをタンク設計図とタワー設計図の両方に追加しました｡
‫Damage Takenというコールバック関数を作成し､ on take any damageデリゲートにバインドしました｡
‫次のステップでは､ ダメージイベントを生成して､ take any damageデリゲートをブロードキャストし､
‫コールバック関数damage takenが呼び出されるようにします｡
‫そして､ 次のビデオでそれを設定します｡
‫また､ お会いしましょう｡