‫ねえ｡
‫お帰りなさい｡
‫さて､ すでにベースとなる -- C++ クラスを作成しました｡
‫このビデオでは､ そのクラスから派生して､ ベースとなる -- をもとに新しい子クラスを作成します｡
‫では､ なぜそのようなことをしたいのか､ その理由を説明しましょう｡
‫つまり､ この base -- クラスがあり､ base -- から派生する2つの異なるクラスがあることが分かっています｡
‫タンクもあるし､ タワーもある｡
‫さて､ ベースにはメッシュとカプセル､ そしてスポーンポイントが含まれています｡
‫そして､ これらはタンクとタワーの両方が受け継ぐことができるものです｡
‫でも､ タンクとタワーでは､ それぞれ異なる機能も出てきます｡
‫ひとつは､ 戦車が世界の中を動き回り､ しかもプレイヤーに操作されることです｡
‫そのため､ キーボードやマウスから入力を受けるように設定する必要があります｡
‫一方､ タワーはただそこに座っているだけになる｡
‫その行動はすべてコードで制御されるため､ プレイヤーからの入力は必要ありません｡
‫そこで､ タンクとタワーでは動作が異なるため､ 継承を利用してベースクラスの子クラスを作り､
‫共通する部分を継承した上で､ 異なる機能をそれぞれのクラスに追加していくことにします｡
‫エディタに戻って､ C++のクラス､ Tune Tankのフォルダに移動して､
‫ベースとなるクラスと､ そこから派生するクラスを作成します｡
‫ここで右クリックし､ create C++ class derived from base -- を選択します｡
‫そこで､ このクラスを base -- と同じ source slash tune tanks フォルダに置くことを許可してみましょう｡
‫そして､ この名称は､ タンクと呼ぶことにします｡
‫つまり､ 戦車クラスは､ 実際に戦車を操作してワールドを動き回るためのクラスということになります｡
‫それでは､ クラスの作成をクリックしてみましょう｡
‫さて､ コンパイルが終わり､ 新しいタンクファイルとタンクCPを含むvsコードが表示されました｡
‫今､ これらはかなりむき出しになっています｡
‫ここには何もないのですが､ 見えないところでベースとなる -- クラスからいくつかのものを受け継いでいます｡
‫私たちは､ そのようなコンポーネントをベースに追加しています --｡
‫これらはプライベート変数であっても､ このクラスには存在します｡
‫さて､ タンクのクラスができたので､ いくつかのことについて説明しましょう｡
‫戦車には必要だが､ 砲塔には必要ない｡
‫さて､ 戦車を操作するわけですから､ レベル中に転がっている戦車に注目する方法が必要です｡
‫さて､ この写真に写っているのは､ こちらがカメラの部品です｡
‫C++のクラスは､ カメラコンポーネントです｡
‫そして､ この赤い線は､ スプリング・アーム・コンポーネントと呼ばれ､ そのC++クラスは､ スプリング・アーム・コンポーネントです｡
‫これらのコンポーネントを追加することで､ ...カメラの視点から見ることができるようになります｡
‫そして､ カメラとそのスプリングアームが何らかの方法で取り付けられていれば､ 世界のあちこちに......ついて行くことになります｡
‫さて､ ここでエディタに戻って､ --のフォルダに戻り､ BP -- tankを開くと､ ビューポートをクリックして､
‫すべてを見ることができるようになります｡
‫そして､ カプセルカンプを選択して､ 追加をクリックし､ スプリングアームを選択します｡
‫スプリングアームの部品です｡
‫赤い線のように見える｡
‫スプリングアームコンポーネントを選択した状態で､ 別のコンポーネントを追加し､ カメラを選択することができます｡
‫さて､ スプリングアームにカメラを取り付けたら､ 実際にコントロールを始めると､ カメラの視点から見ることができるようになりました
‫--｡
‫今､ スプリングアームはかなり重宝しています｡
‫このターゲットアームの長さがあって､ それを調整すると､ スプリングアームと一緒にカメラも調整されるのがわかると思います｡
‫つまり､ これはカメラとの距離をコントロールする方法なんです--｡
‫これらは間違いなく -- クラスに必要なものですが､ ブループリントで追加するのではなく､
‫C++ 側から追加することにします｡
‫だから､ それらを削除する｡
‫そこで､ 今回のチャレンジでは､ 戦車クラスにあるものを追加していただきたいと思います｡
‫一つは､ スプリングアームのコンポーネントとカメラのコンポーネントが必要なので､ これらの変数を作成し､ ポインタを作成します｡
‫先にパブリックセクションとプライベートセクションを作り､ これらの変数をプライベートセクションに置きます｡
‫さて､ これらをUのプロパティにする必要があるので､ プロパティマクロを与え､ 以前の講義で学んだことに基づいて､
‫適切な指定子をこれらのマクロに記入します｡
‫これらの変数を作成したら､ コンストラクタを作成し､ これを public セクションに記述して
‫CP ファイルに定義します｡ コンストラクタ内では､ デフォルトのサブオブジェクトを作成して､ カメラとスプリングアームのコンポーネントを作成します｡
‫これらの部品は必ずセットアップアタッチメントを使用して何かに取り付けてください｡
‫スプリングアームコンポーネントをルートコンポーネントに取り付けたいと思います｡
‫そこで､ ルートコンポーネントを使用して､ セットアップアタッチメントを設定し､ カメラの場合は､ スプリングアームに取り付けます｡
‫ベースとなる -- クラスを参照することができます｡
‫Aこれらを行うためのコードがどのようなものか､ 思い出してみてください｡
‫先にビデオを一時停止して､ これらのものをタンククラスに追加してください｡
‫わかりました｡
‫だから､ 私たちはタンクにいるんです｡
‫さて､ まず最初に｡
‫公開用と非公開用を用意したい｡
‫そこで､ プライベートセクションに､ これら2つの新しいコンポーネントを追加することになります｡
‫Uスプリングアームのコンポーネントが欲しいところですが､ これはポインタになるので､ このスプリングアームを呼び出すことができます｡
‫また､ 新しいカメラコンポーネントも必要で､ これをカメラと呼ぶことにします｡
‫それでいいんです｡
‫名前が少し違う場合｡
‫さて､ さっそくですが､ ここでインテリセンスのエラーが表示されています｡ つまり､ これらをフォワード宣言する必要があるのです｡
‫そこで､ class with spring armとclass with cameraを使うことにします｡
‫そして今､ これらは前倒しで宣言されました｡
‫では､ 新しいプロパティを用意しましょう｡
‫では､ 新しいプロパティマクロを追加してみましょう｡
‫そして､ プロパティ・マクロの内部には､ いくつかの指定子が必要です｡
‫コンポーネントは､ 詳細パネルでパラメータを調整するために､ どこでも見えるようにする必要があることを確認しました｡
‫今､ イベントグラフに触れる必要性がすぐにあるとは思えないので､ ブループリントの読み込み､ 書き込み､ ブループリントの読み込みのみは必要ないと思います｡
‫それでいいんです｡
‫追加したのであれば､ 今は省いています｡
‫これらにカテゴリーをつける｡
‫これらはコンポーネントなので､ 他のコンポーネントと一緒にコンポーネント・カテゴリーに入れるだけです｡
‫さて､ 私はこれらをイベントグラフに公開しないので､ ここで指定したプライベートアクセスを許可するメタは必要ありません｡
‫だから､ スプリングアームはこれで十分だし､ カメラ部品も同じようにあなたの財産をあげたい｡
‫だから､ それをコピーしているんです｡
‫これで部品が揃いましたね｡
‫次に､ それらをコンストラクタで構成する必要があります｡ つまり､ コンストラクタが必要なのです｡
‫さて､ コンストラクタはクラスと同じ名前になるので､ タンクとなり､ このコンストラクタをCPファイルに定義する必要があります｡
‫では､ Tank CPで戦車を作成してみましょう｡
‫つまり､ 関数本体とタンクコンストラクタには､ クラス名とスコープ解決演算子をプレフィックスとして付ける必要があります｡
‫それが､ このダブルコロンです｡
‫この方法では､ 単に新しい関数を作成するだけでなく､ このクラスのコンストラクタを定義することになります｡
‫では､ これらの部品を組み立てていきたいと思います｡
‫では､ まずスプリングアームから見ていきましょう｡
‫そこで､ スプリングアームイコールデフォルトのサブオブジェクトを作成し､ これをUスプリングアームコンポーネントとします｡
‫そして本文では､ このスプリングアームを単にこう呼ぶことにします｡
‫そして､ アタッチメントには､ スプリングアームを設定し､ アタッチメントを設定し､ ルートコンポーネントを渡します｡
‫今すぐ
‫待ってましたよ｡
‫そこにあるのは
‫不完全なクラスタイプへのポインタというIntelliSenseのエラーは､ 春のアームコンポーネントを使用しています｡
‫それは､ スプリングアームのコンポーネントを作成して使用するので､ ヘッダーファイルをインクルードする必要があるからです｡
‫これが私のアンリアル・エンジンのドキュメントで､ 下にスクロールすると､ 私のインクルードがあります｡
‫それをコピーして､ この一番上､ タンクの縁のすぐ下に貼り付けます｡
‫さて､ 一般的な注意点ですが､ クラスのヘッダーファイルは一番上にインクルードし､ その下にコンポーネントのインクルードを置くことになります｡
‫そこで､ スプリングアームを用意しました｡
‫いよいよカメラの組み立てです｡
‫そこで､ カメラと言うことにして､ デフォルトのサブオブジェクトを作成し､ カメラコンポーネントを作成します｡
‫そして､ テキストマクロでは､ これを単にカメラと呼ぶことにします｡
‫そしてカメラには､ スプリングアームを通すセットアップアタッチメントと呼ぶことにしています｡
‫もちろん､ カメラのヘッダーファイルも必要です｡
‫アンリアル・エンジンのドキュメントで､ ドキュメントを検索と書いてあるところで､ you camera
‫componentと入力すると､ you camera componentが表示されます｡
‫それを選択します｡
‫そして､ カメラコンポーネントのドキュメントです｡
‫このファイルをコピーして､ ファイルの一番上に貼り付けます｡
‫そして､ これでいいはずだ｡
‫さて､ ではこれをコンパイルしてみましょう｡
‫なるほど｡
‫というわけで､ コンパイルに成功しました｡
‫エディターとここに戻ってみよう -- Tank.
‫もちろん､ 何も表示されません｡ なぜなら､ tankはbaseから派生しており､ 先ほど追加したコンポーネントはtankクラスに追加されたものだからです｡
‫つまり､ BP -- tankはtankクラスから派生したものではないので､ これらを取得することはできません｡
‫タンク クラスをベースにした新しいブループリントを作成することもできますが､ その場合､ これらのコンポーネントをもう一度セットアップする必要があります｡
‫それに､ 2回目の作業をする気にはとてもなれません｡
‫この青写真をタンククラスに修復する簡単な方法があります｡
‫クラス設定を選択した状態で詳細パネルを開くと､ クラスオプションが表示され､
‫この親クラスがあります｡
‫ドロップダウンではbase uponになっていますが､ クリックするとtankを検索し､ ベースクラスとしてtankを選択することができます｡
‫そして今､ このブループリントはタンククラスから派生しています｡
‫メッシュやカプセルサイズなど､ コンポーネントに設定したプロパティはすべてそのまま残っていることがわかります｡
‫ただ､ 今､ 私たちはカメラを見ています｡
‫実は､ スプリングアームとカメラもあるんです｡
‫そして､ 今､ スプリングアームを選択すると､ その赤い線が見えます｡
‫だから､ これはすごいことなんです｡
‫だから､ このスプリングアームの部品を取って､ 目標とするアームの長さを変えることができたのです｡
‫また､ 回転モードを選択し､ 少し上に回転させることで､ 水槽に対してカメラが下向きになるように回転を変更することも可能です｡
‫好き だから今､ カメラの位置を変えてはいけないということを指摘したいです｡
‫カメラを選択し､ ワールド内で移動させ､ 位置や角度をちょうどよくするのが魅力的かもしれません｡
‫しかし､ これは正しいやり方ではありません｡
‫正しい方法は､ スプリングアーム部品の回転と目標アーム長を設定することです｡
‫そして､ その理由は､ スプリングアームの先端にカメラを取り付けたいからです｡
‫スプリングアームは､ カメラが壁にぶつかると縮んで障害物を避けたり､
‫池への視界を遮ったりと､ さまざまな機能を内蔵しているんですよ｡
‫ですから､ カメラの位置や回転を調整するのではなく､ そのカメラをスプリングアームの先端に取り付けて､
‫スプリングアームを調整することになるのです｡
‫このビデオでは､ tank クラスを作成し､ base pond から派生させて､ base pond クラスからその品質を継承しています｡
‫スプリングアームコンポーネントとカメラコンポーネントを追加し､ それらを可視のみを使ってエディタに公開し､
‫独自のカテゴリーに入れました｡
‫というわけで､ 一歩一歩完成品に近づいているわけですが､ 次回の講義でも､ このタンクの開発を進めていきます｡
‫また､ お会いしましょう｡