主なコンテンツ

〜主なコンテンツ〜

1. Unityで製作したゲームと製作Tips
  1. 三月精チャレンジ(東方Project二次創作)
    1. 作り方
  2. 英語学習2D(オリジナルスマホアプリ)
2. UE4
3. ゲームアプリ見学
4. Bitbucket & SourceTreeでの一連の流れ
  1. 前半
  2. 後半
5. Tips
  1. UnityのTips
  5. SQL文のTips
  6. Final IK
  7. GearVR+Unity

2023年1月18日水曜日

38. Camera and Spring Arm

 おかえり。


これで、キャラクター クラスとキャラクター ブループリントができました。


カメラ コンポーネントやスプリング アーム コンポーネントなどのコンポーネントの追加を開始します。


それでは飛び込みましょう。


ロビー マップに移動して、BP_Blaster_character をドラッグします。


まず、ゲームモードを設定していないため、自動的にキャラクターを所有することはありません。


しかし、キャラクターを選択し、自動所有プレイヤーの詳細パネル検索に移動し、それを player_0 に設定した場合、プレイを押すと、このキャラクターが自動的に所有されます。


しかし、カメラはほとんどキャラクターの内部にあることがわかります。


そのため、キャラクターを所有しているときにビューを制御するには、カメラとスプリング アームが必要です。


したがって、これらのコンポーネントを C++ から追加します。


これが blasterCharacter.h と BlasterCharacter.cpp です。


いくつかの新しい変数を宣言します。


public セクションにコンストラクターがあります。 ここには、Tick と SetupPlayerInputComponent を含む 2 つ目のパブリック セクションがあります。


これらの公開機能をここの一番上にあるこの公開セクションに移動したいと思います。


また、この時点で、これらの関数が何をするかをすべて知っているはずなので、これらのコメントが必要だとは本当に思いません。 なので、それらのコメントは削除します。

ここでは、Tick と SetupPlayerInputComponent を [トップ パブリック セクション] に移動します。 および保護されたセクションの下。


プライベートセクションを希望します。


そこで一つ追加します。


この公開セクションはここに置いておきます。 この領域は、さまざまなメンバー変数の単純な getter と setter 用に予約します。


ここのプライベート セクションでは、ここにスプリング アームとカメラを追加します。

そこで、use spring arm コンポーネントを前方宣言します。


これを CameraBoom と呼ぶことにします。


さて、これには新しいプロパティ マクロが必要になります。


だから私はこれをどこでも見えるようにするつもりです。


そして、CameraBoom とカメラを 1 つのカテゴリに入れたいと思います。


これを CategoryCamera と呼びます。


そしてもちろん、実際のカメラ自体も必要です。これも前方宣言されます。


そして、これは UCameraComponent になります。


これを FollowCamera と呼ぶことができます。


さて、これもVisibleAnywhere、そしてCategoryCameraにします。 これで、変数を宣言しました。


しかし、これらを構築する必要があります。 これを行い、Blaster キャラクター コンストラクターを作成します。


現時点ではこれらのコメントは必要ないと思うので、ここでこれらのコメントを削除します。 彼らは初心者をスピードアップさせるためのものです. したがって、ここでコンストラクターでそれらを削除できると思います。


CameraBoom を作成しましょう。 だから私はカメラブームと言ってデフォルトのサブオブジェクトを作成します。


これは USpringArmComponent です。


テキスト マクロでは、これを CameraBoom と呼びます。


もちろん、ここではスプリング アーム コンポーネントを使用しているため、そのタイプのヘッダーを含める必要があります。 「GameFramework/SpringArmComponent.h」をインクルードします。


これで、アンリアル エンジンのドキュメントでいつでもクラスを検索して、このインクルードを確認できます。


通常、CameraBoom をルート コンポーネントに接続しますが、カメラ ブームをメッシュ コンポーネントに接続したいと思います。


これは、後でカプセル サイズを変更するしゃがみ機能を使用するためです。


カプセルは私たちのルートであり、スプリング アームがカプセルに取り付けられた状態でカプセル サイズを変更すると、スプリング アームが動きます。


ということで、代わりにスプリングアームをメッシュに取り付けます。

セットアップ アタッチメントを呼び出して、get mesh でアクセスできるメッシュを使用します。


次に、カメラ ブームのターゲット アームの長さを設定します。 それでは、cameraBoom->TargetArmLength としましょう。 これを 600 に設定します。


しかし、それを調整したいかどうか見ていきます。


現在、カメラ ブームにも bUsePownControlRotation があります。 これを true に設定して、マウス入力を追加するときにコントローラーと共にカメラ ブームを回転できるようにします。


これで cameraBoom ができました。 カメラを作成しましょう。 そのため、フォローカメラがあります。


createDefaultSubObject を使用します。 これは UCameraComponent です。 これを followCamera と呼びます。


setupAttachment を使用して、followCamera をカメラ ブームに取り付けることができるようになりました。


そして、use springArmComponent、静的メンバー変数ソケット名を使用して、カメラを cameraBoom の socketName ソケットに接続できます。


そして、カメラ コンポーネントを使用しています。 そのため、ヘッダーを INCLUDE する必要があります。 これは camera/cameraComponent.h にあります。


現在、フォロー カメラは cameraBoom にアタッチされているため、PownControlRotation を使用する必要はありません。 したがって、followCamera->beUseControlRotation = false と言えます。


それでは、先に進んでコンパイルしましょう。


カメラがあり、もちろん、カメラ ブームがメッシュに取り付けられていることがわかります。


下部にピボットポイントがあります。 ここでは、スプリング アームが下部に取り付けられていることがわかります。


さて、ここの BLUEPRINT を見ると、約 600 単位離れているように見えます。 私たちのターゲット アームはこの 600 のようなものだからです。

しかし、ここではそれがわかりません。 カメラが床に衝突する可能性が最も高いためです。


では、カメラ ブームを上に動かしてみましょう。実際には地面から取り付けたくないからです。


カメラ ブームを取り、Z 方向の位置を 88 に設定します。そうすれば、ここの中央に取り付けられます。 カメラ ブームを少し上に移動することもできます。 それはあなた次第です。


コンパイルして再生ボタンを押すと、キャラクターから正しい距離にいることがわかります。


もちろん、まだ動き回ることはできません。


これは、その機能をプログラムしていないためです。


それが次のステップになります。


この講義では、カメラ コンポーネントとスプリング アームを追加し、それらのアタッチメントをセットアップして、カプセルであるルート コンポーネントではなく、メッシュにスプリング アームを取り付けました。


そうすれば、後でしゃがんでカプセルのサイズを変更しても、スプリング アームの高さには影響しません。


これで、移動機能をプログラムする準備が整いました。次にそれを行います。


また後で。


37. Blaster Character

 いらっしゃいませ。


キャラクタークラスの作成を開始する準備ができました。


そのため、このビデオでそれを行い、C++ クラスのフォルダー構造を設定して、プロジェクトを整理します。


それでは始めましょう。


これが私たちのプロジェクトです。


これまでのところ、C++ クラス フォルダーには BlasterGameModeBase クラスがあります。

新しい文字クラスを作成します。 そのため、右クリックして [新しい C++ クラス] を選択することで、C++ クラスと Blaster 内からそれを行うことができます。


次に、キャラクターに基づいてクラスを作成します。


それでは、文字を選択して次へをクリックしましょう。


このプロジェクトでは、キャラクター クラスに [ブラスター キャラクター] という名前を付けます。このプロジェクト用にかなりの数のクラスを作成します。


そのため、それらを独自のフォルダーに整理したいと思います。

Character というフォルダーに Blaster クラスを作成します。


パブリック フォルダー構造とプライベート フォルダー構造を使用するかどうかは、あなた次第です。


個人フォルダは使わなくてもいいので、そのままにして、BlasterCharacter と専用のキャラクター フォルダを追加するだけにします。 では、クラスの作成をクリックしましょう。


ここで、キャラクター クラスと独自のキャラクター フォルダーを追加することを選択したため、Blaster モジュールを再コンパイルする必要があるというメッセージが表示されます。これは、自動コンパイラ エラーが発生するためです。 私の言いたいことをお見せしましょう。 [いいえ]をクリックします。


Visual Studio は、プロジェクトをリロードするかどうかを尋ねてきます。


[すべて再読み込み] をクリックします。


これがプロジェクトです。 BlasterCharacter.h と .cp を含むソース フォルダーの Blaster の下に、このキャラクター フォルダーがあることがわかっています。


BlasterCharacter.cpp には、インクルード エラーがあります。 キャラクター フォルダー内から BlasterCharacter.h をインクルードしようとしていますが、CP ファイルは既にキャラクター フォルダーにあるためです。


したがって、include ステートメントでこの Character を削除するだけで、エラーを取り除くことができます。


これでコンパイルできるはずです。


コンパイルが成功したので、エディターに戻り、新しい Blaster キャラクター クラスに基づいてキャラクター ブループリントを作成します。


次に、コンテンツを右クリックして、新しいフォルダーを作成します。


これは、このプロジェクトのために作成するすべてのブループリントに適用されます。


このフォルダを blueprints と呼び、blueprints フォルダ内に character フォルダを作成します。


ということで、これをフォルダキャラクターと呼ぶことにします。


そして、BlasterCharacter に基づいて新しい C++ クラスを作成できるように、ここにキャラクターのブループリントを配置します。

では、そうしましょう。


そして、Blueprint のキャラクターに貼り付けます。


ここで、この BP_BlasterCharacter に名前を付けます。


そうすれば、どれがブループリント クラスで、どれが C++ クラスであるかがわかります。


それでは、Create Blueprint Class をクリックしましょう。


これが CharacterBlueprint です。


これで、すぐにメッシュを選択できます。


メッシュを選択します。


骨格メッシュには、Learning Kit ゲームからキャラクターを選択します。


今、このように見えるエピックキャラクターがいます.


Y 方向を向いていることがわかり、X 方向に向けたいと思います。


というわけで、90度回転させます。


現在、その足はカプセルの中心にあり、カプセルの半分の高さは 88 です。


したがって、メッシュを 88 単位下に移動できます。


その位置 Z を取得して、-88 に設定しましょう。


これで、キャラクターが地面に置かれます。


というわけで、コンパイルして保存します。


これで、キャラクター クラスとブループリントが完成しました。


これでキャラクター クラスが作成され、このクラスに基づく設計図ができました。このクラスをキャラクター フォルダーに貼り付けました。


したがって、C++ ソリューションは整理されています。


今後のビデオでは、カメラとスプリング アームを追加し、いくつかの入力とプログラム動作機能を追加します。


また後で。

2022年12月18日日曜日

36. Retargeting Animations

 いらっしゃいませ。


いくつかのアニメーションがありますが、まだいくつか必要です。


そのため、Maximo からいくつかのアニメーションを取得し、それらをエピックに再ターゲットすることを検討します。


スケルトンを作成して、キャラクターに使用できるようにします。


最初に、無料のアニメーションについて Maximo を調べます。


ここでは、無料のアニメーションのもう 1 つの優れたソースである Maximo を紹介します。


Maximo に初めてアクセスする場合は、無料で Maximo のログインを作成できるように、ログインが必要です。


まだお済みでない場合は、無料でサインアップしてからログインしてください。


ログインしたら、使用するキャラクターを選択する必要があります。


これらのいずれかを選択できますが、Epic Games のマネキンに似ているため、これを選択します。


ここで、エピック スケルトンがポーズをとっている A ポーズではなく、T ポーズになっていることがわかります。


しかし、これについては後ほど説明します。


使用したいキャラクターを選択したら、ダウンロードすることができます。


ダウンロードをクリックすると、ダウンロードと FBA フォーマットが必要になり、T シャツのポーズのままにしておくことができます。


それでは、ダウンロードをクリックしてみましょう。ダウンロードが完了すると、ダウンロード フォルダに FBA が表示されます。


これを Unreal Learning Kit プロジェクトに追加します。


これが私のプロジェクトで、ここにアニメーション スターター パックがあります。


Maximo アニメーション用に別のフォルダーを作成するので、単純にこのフォルダーを Maximo と呼びます。


Maximo フォルダー内に、Character という名前の新しいフォルダーを作成します。


そして、ここでそのキャラクターをインポートできます。


だからここにこの名前がついた。


Maximo Character に名前を変更します。 この Maximo Character.fbx をインポートします。


[インポートの追加] をクリックします。 [ゲーム/マキシモ/キャラクター]にインポートします。


ダウンロード フォルダでその FBX を見つけて [開く] をクリックすると、いくつかのオプションが表示されます。


次に、骨格メッシュをインポートします。この FBX には独自の骨格があるため、骨格は選択しません。


そのため、[すべてインポート] をクリックすると、スムージング グループ情報が見つからないというエラーが表示されます。


これは一般的です。


これは、このアセットにスムージング グループ情報がないためです。


大丈夫。


X をクリックします。この Maximo キャラクターが表示され、独自の Maximo キャラクター スケルトンがあることがわかります。


このスケルトンを見ると、スケルトンが Epic Games のスケルトンに似ていることがわかりますが、階層と名前が少し異なります。


したがって、アニメーションをリターゲットするときは、それを考慮する必要があります。


これで、メッシュとスケルトンとマテリアルをすべてキャラクタ フォルダに保存します。


Maximo では、右クリックして新しいフォルダーを作成し、このフォルダーを animations と呼びます。


これで、いくつかの Maximo アニメーションをダウンロードして、ここに配置できます。


Maximo では、アニメーションをクリックします。


さて、ダウンロードしたこのキャラクターを使うことが重要です。


すべてのアニメーションは、この特定のキャラクターにリギングされます。


必要なアニメーションがいくつかあります。


1 つは、その場で回転するアニメーションが必要なことです。


Turn Right を検索します。


そして、回転アニメーションがたくさんあります。


しかし、必要なものは揃っています。


たとえば、右回転と呼ばれるものを選択すると、キャラクターがその場で回転していることに気付くでしょう。


しかし、私たちはこれを望んでいません。


キャラクターを独自のコード ロジックで変換したいので、そのロジックは使用できません。


しかし、ここで右折のアニメーションが表示されていることに注意してください。


これはしゃがんでいるもので、これは所定の位置にあります。


実際にキャラクターを回転させるのではなく、アニメーションを再生しているだけです。


だから私はこれをダウンロードすることができます。


[ダウンロード] をクリックします。FBX 形式とスキンをダウンロードする必要があります。


使用しているキャラクターにリギングされるように、スキンと一緒にダウンロードすることが重要です。


1 秒あたりのフレーム数を 30 のままにし、キーフレームの削減をなしにして、[ダウンロード] をクリックします。 これで、ダウンロード フォルダに右折アニメーションができました。

34. Assets, 35. Retargeting Animations in Unreal Engine 5

 (前略)

今、私は Epic Games Launcher にいます。「ミリタリー ウェポン シルバー」を検索します。


そして、大量の武器を含む無料のアセット パックがあります。


それは「軍事兵器、銀」と呼ばれ、無料のコレクションにあります。


また、無料コレクションから削除する予定はありません。


いくつかの異なる武器アセットが含まれており、これらの武器ごとにパーティクル システムとサウンドも含まれているため、これは素晴らしいことです。


したがって、これは素晴らしいスターティング パックです。


さて、このサイド パックから始める理由は、サポートされているエンジン バージョンが 4.4 から 4.21 までしかリストされておらず、Unreal Engine 5 を使用していることに気付くからです。


では、これらをどのように使用するのでしょうか。


さて、これをアンリアル エンジン 5 プロジェクトに組み込む方法をお見せしたいと思います。


これは非常に優れたスキルであり、Unreal Engine の 5 つのプロジェクトにアセットを追加する際の選択肢が増えます。


これらのアセットをプロジェクトで提供したいのですが、そうするライセンスがありません。


そのため、これをプロジェクトに追加する方法を説明する必要があります。


これで、Unreal Engine の任意のバージョンと互換性のあるアセットを追加できるようになります。


Unreal Engine バージョン 4.21 が必要であることがわかりました。これにより、ライブラリにアクセスして Unreal Engine バージョン 4.21 をインストールできます。


すでにここにあることがわかります。


ハードディスクの容量が限られている場合は、マーケットプレイスや他の場所から他の武器アセットを選択して、問題なくフォローできます。


しかし、4.21 とのみ互換性のあるアセットを Unreal Engine の 5 つのプロジェクトに取り込む方法を紹介します。


そこで、4.21 プロジェクトを作成します。


4.21 をローンチし、新しいプロジェクトを選択します。これを青写真プロジェクトとして維持します。


また、開始コンテンツは必要ないため、空白を選択できます。


ここで、このフォルダを選択して、Blaster プロジェクトのすぐ隣に貼り付けます。


そのフォルダを選択し、これを UE4_Assets と呼びます。 そしてプロジェクトを作成します。


これが私の Unreal Engine 4.21 プロジェクトです。


これで完全に空になりました。このプロジェクトに [軍用武器、シルバー アセット] を追加します。


だから私は市場に戻ってきました。


これが軍用武器、シルバー アセット パックです。


[プロジェクトに追加] をクリックします。


さて、アセット 4.21 プロジェクトの UI です。


それを選択して、[プロジェクトに追加] をクリックします。


それが完了したら、私のプロジェクトに追加して、ここに軍用武器のシルバーを置きます。


また、ここにすべてのアセットを表示するショーケース レベルが付属しています。


アサルトライフル、ピストル、スナイパーライフル、ロケットランチャー、ショットガン、グレネードランチャーがあります。


これで、これらのすべてをプロジェクトで使用できます。


だからこれは素晴らしいです。


これらを Unreal Engine の 5 つのプロジェクトに移行したいと思います。 これは、コンテンツ フォルダの下にあるミリタリー ウェポン シルバーを右クリックして、[移行] を選択することで簡単に実行できます。


移行するすべてのアセットが表示されます。


[OK] をクリックして Blaster プロジェクトに戻り、コンテンツ フォルダーを選択します。


アセットをいつ移行しているのかわからない場合は、アセットをコンテンツ フォルダーに移行する必要があります。


他のフォルダを選択できます。


そのフォルダを選択すると、コンテンツの移行が正常に完了したことがわかります。


しかし、これらの資産を手に入れたので、いくつかの環境を追加する準備が整いました。

これで、さらにアセットを追加する準備が整いました。


そして、環境とキャラクターを含む Unreal Learning Kit を追加したいと思います。


それでは、Unreal Engine 4 プロジェクトを閉じます。

2022年12月13日火曜日

28. On Unreal Engine Versions、29. Project Creation

Unreal Engine のバージョンに関する注意 - [リソース] タブからプラグインをダウンロードする場合:


Unreal Engine 5.0 の公式リリース (Preview または Early Access ではない) を使用している場合は、Plugin - Unreal Engine 5.zip というファイルをダウンロードします。 このバージョンは、Unreal Engine 4.27 および Preview 1 と 2 でも動作します。


Unreal Engine 5.1 を使用している場合は、Plugin for 5.1.zip をダウンロードします。

2022年12月10日土曜日

27. Polishing the Menu Subsystem

 このビデオへようこそ。


いくつかのことを磨いて、メニュー システムを完成させます。


ホスティングが常に可能であることを確認したいと思います。


そのため、メニューが何を行っているかを見て、それが事実であることを確認できるようにします.


また、簡単にゲームを終了できるように、クイック ゲーム ボタンをメニューに追加します。 また、メニュー ボタンをクリックしたら無効にして、セッションが作成される前に複数のセッションを作成しようとしないようにします。


それでは始めましょう。


まず、セッションが既に作成されている場合に、セッションをホストすることに注意しましょう。


いくつかのテストを行っている場合は、小さな問題に気付いたかもしれません。


別のマシンでセッションを実行していて、このマシンから参加をクリックして参加するとします。


そして今、私はこのゲームセッションにいます。


ここで、ホスト プレイヤーがゲームを終了することですべてのプレイヤーをキックすることを決定したとしましょう。


そのため、他のマシンのテスターはゲームを終了し、メイン メニューに戻ります。


だから私はメインメニューに戻ってきました。


自分のゲーム セッションをホストできるようにしたいのですが、ホスト ボタンをクリックすると、ゲーム セッションの作成に失敗したことがわかります。


しかし、ここに面白いことがあります。


ほんの数秒待ってからもう一度ホストをクリックすると、ホスティングされます。


それで、ここで何が起こっているのですか?


それでは、コードを見てみましょう。


私は multiplayerSessionSubsystem.cpp にいます。 下にスクロールして createSession に移動します。 既存のセッションがあるかどうかを確認していることがわかります。存在する場合は、destroySession を呼び出します。


しかし問題は、destroy session を呼び出した直後に、create session を呼び出すことです。


Destroy Session が呼び出されましたが、その情報がネットワークを介してサーバーに移動し、そのセッションが破棄されるまでには時間がかかります。


そのため、Create Session をすぐに呼び出すと、セッションがまだ破棄されていない可能性があります。


その場合、セッションの作成に失敗します。


したがって、新しいセッションを作成する前に、セッションを破棄するアクションが完了していることを確認する必要があります。


幸いなことに、サブシステムでのセッションの破棄を含め、これらすべてのセッション アクションに対していくつかの関数とコールバックを作成しました。


現在使用していない destroySession 関数を作成しました。 また、sessionInterface にデリゲート リストを追加できるデリゲートもあります。


この destroySession 関数は、実際にはデリゲートにバインドされています。


コンストラクターに戻ると、destroySessionCcompleteDelegate があり、onDestroySessionComplete 関数がこれにバインドされていることがわかります。


そのため、セッション インターフェイスに直接アクセスして destroy session を呼び出すのではなく、destroy session 関数を実装し、create session で使用する必要があります。


サブシステム関数 destroySession でこの呼び出しを処理する必要があります。


これが完了したら、onDestroySessionComplete コールバック関数で反応し、そこで関数を作成できます。


したがって、新しいセッションを作成していて、セッションが既に存在する場合、ここでサブシステム関数で createSession を呼び出すと、失敗するセッションを作成することがわかります。


失敗することがわかっているので、セッションとコールバック onDestroySessionComplete を作成できます。


ただし、セッションをホストしていることがわかっている場合にのみ、そのコールバックでセッションを作成したいと考えています。


したがって、いくつかの変数を作成することで、これを簡単に行うことができます。


multiplayerSessionSubsystem.h に戻り、ここの一番下にいくつかのプライベート変数を追加します。


まず、ブール値を作成したいと思います。これを bCreateSessionOnDestroy と呼びます。


ここでは false で初期化します。


そして、セッションが破棄されたときに、これとコールバックを確認します。


真であれば、新しいセッションを作成します。


ここで、セッションが既に存在するためにセッションの作成が失敗することがわかっている場合は、新しいセッションに関する情報を保存する必要があります。


開いている公開接続の数とマッチ タイプを作成したいと考えています。


この情報が必要な理由は、ここで Create Session を呼び出すと、開いているパブリック接続の数とマッチ タイプを渡す必要があるためです。


したがって、作成に失敗した最後のセッション用にこれらを保存します。


そこで、最後の NumPublicConnections という名前の int32 型のメンバー変数を作成します。 LastMatchType という名前の FString を作成します。 ここでこれらを CPP ファイルに設定し、セッションを作成できます。


したがって、Destroy Session を呼び出しているところでは、その情報を保存する必要があります。セッションが既に存在するため、セッションの作成に失敗するからです。


そして、destroy session コールバックで、Create Session を再度呼び出します。


ここで、既存のセッションが null ポインターでない場合は、最初にブール値の createSessionOnDestroy を true に設定します。 次に、パブリック接続の数と lastNumPubliCconnections を保存し、それを NumPublicConnections に等しく設定します。


したがって、numPublicConnections.

また、そのマッチ タイプも保存します。


したがって、lastMatchType は matchType と等しいと言えます。


ここで、セッション インターフェイスで直接 destroySession を呼び出しています。


しかし、ヘッダー ファイルで使用するサブシステムで定義した destroySession 関数を呼び出したいと思います。


上にスクロールすると、destroySession が入力パラメータを取らないことがわかります。


したがって、ここの createSession では、既存のセッションが既に存在する場合は、単純に DestroySession を呼び出します。

2022年12月4日日曜日

23. Tracking Incoming Players

 いらっしゃいませ。


このレクチャーでは、ゲームに入ってくるプレーヤーを追跡できるように、ゲーム モードを作成します。


そうすれば、参加したプレーヤーの数を追跡する実行中のプレーヤー数を出力できます。


後で、このプレイヤー数を使用して、ロビーから実際の試合に移行する必要があるかどうかを判断できます。


これを行う方法は、ゲームの状態を使用することです。


マルチプレイヤーに関して非常に重要な 2 つのクラスは、ゲーム モードとゲーム ステートです。


ゲームモードは、ゲームのすべてのルールを維持するために存在します。


これには、プレイヤーを新しいレベルに移動するタイミングやスポーン場所の選択方法など、ゲームに応じてさまざまなことが含まれます。


ゲーム モードには、プレイヤーがいつゲームに参加したか、いつゲームから離れたかを追跡するのに役立つ、いくつかの継承された関数があります。


ポスト ログインは、プレイヤーがゲームに参加し、そのプレイヤー コントローラーにアクセスできるたびに呼び出される、継承された仮想関数です。


ログアウト関数は、プレイヤーがゲームを離れたときに呼び出され、再びコントローラーとこの関数にもアクセスできます。


GAME STATE は、ゲームに関する状態情報を保持するように設計されています。


クライアントは GAME STATE にアクセスして、この情報を取得できます。


これは、スコアや勝利数などの特定のプレイヤーに関する状態情報ではなく、ゲームの状態情報を保持するように設計されたクラスです。


Game State にはプレイヤーの状態の配列が含まれており、プレイヤーの状態クラスは、スコア カウントなどのプレイヤー固有の情報を保持するように設計されています。


ゲームモードはゲームの状態にアクセスできるため、この配列のプレーヤーの状態を取得し、この配列のサイズをチェックすることでゲームに参加しているプレーヤーの数を確認できます。


これが私たちがやろうとしていることです。


まず、プロジェクトのゲーム モードを作成しましょう。