Skip to content

Instantly share code, notes, and snippets.

@tsubaki
Last active February 21, 2019 06:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsubaki/967bc15c07a95ace378cc8102d688927 to your computer and use it in GitHub Desktop.
Save tsubaki/967bc15c07a95ace378cc8102d688927 to your computer and use it in GitHub Desktop.
@tsubaki
Copy link
Author

tsubaki commented Feb 21, 2019

FPS Sample Source Code

このドキュメントはFPSサンプルソースコードの主な分野の概要を説明します。

Game class

Gameクラス(Game.cs)は、ゲームのメインループを定義するMonoBehaviorです。
すべてのゲームコードはGame.Updateメソッドから実行されます(いくつかの例外はありますが)。
ゲームクラスは、インスタンス化される最初のクラスの1つであり、ゲームの状態に関係なく常に存在します。
Gameクラスは、Audio、Input、その他のアプリレベルのユーティリティ機能を含むさまざまなシステムをインスタンス化します。

ゲームクラスは、特定の_GameLoop_を更新するように要求できます。
Gameloopsは、ゲームが存在できるさまざまなモードを実装しています。
それらは、正しい順序でシステムを更新するとともに、必要なシステムの初期化とシャットダウンを処理します。
アクティブなゲームループは実行時に変更することができます。

現在実装されているゲームループの種類は、サーバー、クライアント、プレビューです。

ServerGameLoop

ServerGameLoop(ServerGameLoop.cs)は、クライアントのリストへの接続を処理し、すべてのサーバーシステムを更新します。

ClientGameLoop

ClientGameLoop(ClientGameLoop.cs)は、サーバーへの単一接続を処理し、すべてのクライアントシステムを更新します。

PreviewGameLoop

PreviewGameLoop(PreviewGameLoop.cs)は、サーバーとクライアントのゲームループを組み合わせたものです。
バンドルを構築したりサーバーやクライアントを起動することなくゲームをプレビューする方法として、サーバーとクライアントのシステムを組み合わせて使用します。
これは、ユーザがゲームシーンをロードした状態でエディタの再生を押すとゲームループになります。

Modules

組織的な目的のために、いくつかのゲームコードはモジュールと呼ばれるものに分類されます。
モジュールには、これらのコンポーネントを更新するシステムとともにコンポーネントが含まれています。 モジュールは、ゲームループによってインスタンス化される1つまたは複数の追加の特定のクラスも含むことができる。
モジュールは、特定のサーバー、クライアント、またはプレビューの実装を持つことができます。
モジュールの場所: Assets/Scripts/Game/Modules

ReplicatedEntity Module

ゲームオブジェクトとECSエンティティの複製を処理します。

ゲームオブジェクトを複製するには、ReplicatedEntityコンポーネントが添付されたプレハブでなければなりません。
これにより、プレハブがReplicatedEntityRegistry内に確実に登録されます(ビルドツールの実行時にはいつでも "Update Registry")。
サーバーとクライアントには異なるReplicatedEntityRegistryがあり、サーバーとクライアントで異なるプレハブを作成できます。 それぞれが同じエンティティを表し、同時に同じ一連の直列化可能コンポーネントを利用する。
複製するデータを持つコンポーネントはINetworkSerializableインターフェイスを実装し、ReplicatedEntityコンポーネントと同じゲームオブジェクトに添付する必要があります。

ECSエンティティを複製するには、ReplicatedEntityFactoryから派生するScriptableObjectを作成します。
このクラスはReplicatedEntityRegistryにも登録されています。 これには、シリアライズまたはデシリアライズコンポーネントを使用してエンティティとクラスを作成するために実装する必要がある抽象メソッドが含まれています。

Player Module

プレイヤーモジュールは、プレイヤー情報のサーバーブロードキャストを処理します。 クライアント上のユーザーコマンドのサンプリングと制御文字のローカル処理。

サーバーは、接続されている各プレーヤーに対して Player エンティティを作成します。
プレーヤエンティティには、サーバが接続されているすべてのクライアントに送信するデータ(プレーヤ名、プレーヤが制御しているキャラクタなど)が含まれています。 プレーヤが表すクライアントにのみ送信されるこのデータ(例:開くUI要素)

各クライアントは、ローカルプレゼンテーションコンポーネント(例えば、カメラ制御およびUI)を有する LocalPlayer インスタンス化を達成する。
制御されているエンティティの種類に固有のコンポーネントは、カスタム処理のためにLocalPlayerに追加できます。
例えば。 CharacterModuleからの LocalPlayerCharacterControl はLocalPlayerにアタッチされて、キャラクターのプレーヤ制御を処理します。

Character Module

Characterモジュールはキャラクターの能力、アニメーション、そしてUIを担当します。
文字は、CharacterまたはCharacter1P MonoBehaviorのいずれかが添付されたプレハブによって定義されます。
キャラクターは、サーバーとクライアントで3Pキャラクターに使用されます。一方、Character1Pは一人称カメラビューに使用されます。
文字は CharacterTypeDefinition ScriptableObjectを使用して設定されます。
このScriptableObjectは、ServerバージョンとClientバージョンの3Pキャラクタプレハブ、および1人称カメラビューでインスタンス化された1Pプレハブキャラクタへの参照を持っています。

すべてのキャラクターの振る舞いは能力によって処理されます(位置:キャラクター/行動/能力)。
能力はアクティブで AbilityController によって制御されます。
現在の実装では、キャラクターは常に移動能力をアクティブにしています。キャラクターは同時にアクティブになることができるのは1つの他の能力だけです(例:スプリント、近接、シュート)

HeroTypeAsset(HeroTypeAsset.cs)は、ゲームの主人公を設定するために使用されます。 (注:コメントや単語の命名では主人公によく使われます)
HeroTypeAssetはヒーローのステータスと使用するキャラクター、武器、能力を定義します。

Item Module

キャラクターのアイテムを扱います。
アイテムは複製されますが、現時点ではプレハブのクライアントバージョンのみにロジックまたはビジュアルがあります。
アイテムが更新されると、それらは関連する能力の状態を読み、それらを使用して関連する効果を誘発します。

Effect Module

効果モジュールはクライアントサイド効果(gfxとサウンド)を制御します。
効果は「消し忘れ」であり、これを取り消すことはできません。
このモジュールは現在2種類の効果をサポートしています:SpatialEffectHitscanEffect
起動時に、スタティックプール内にエフェクトが作成されます。
各効果は、どのプレハブをその効果に使用すべきか、またその効果プールの大きさを定義するScriptableObject(例えばSpatialEffectTypeDefinition)を使用して設定されます。
効果はゲームコードによって要求され、それは要求されたコンポーネント(例えばSpatialEffectRequest)を持つエンティティを作成します。 これらはエフェクトシステムに追加され、そのときにエフェクトがトリガーされます。

Grenade Module

手榴弾モジュールは、手榴弾の作成と更新を処理します。 手榴弾はサーバー上で更新され、クライアントに内挿されます。

HitCollision Module

HitCollisionモジュールは、ゲーム内でダメージを受けることができるすべてのオブジェクトの衝突を処理します。
サーバーは、移動中のコライダーの位置と回転を「ロールバック」できるように格納します。これにより、衝突テストが実行される前にコライダーを任意のティックにロールバックできます。
これはサーバー側の遅れ補正に使用されます。
HitCollision for characterは、サーバーとクライアントのプレハブ間で共有できるように、別々のプレハブに設定できます。

RaySphereQueryRecieverを使用して衝突クエリをキューに入れることができます。それは最初に環境に対してレイテストを処理し、そして次に球体が衝突した衝突に対してキャストします。

衝突がヒットすると HitCollisionOwner コンポーネントがダメージイベントを追加するために使用されます。
これらのイベントはHitCollisionモジュールでは使用されません。代わりに、それは他のシステム(例えば、CharacterやDestructableProp)によってリストを読み、消去し、それらが持っている健康価値にどんなものでもダメージを与えるために使われます。

このモジュールには SplashDamageSystem も含まれています。これはある領域にスプラッシュダメージを与えることを忘れないようにする方法です。

Projectile Module

このモジュールは、発射体とそれに関連するビジュアルのクライアントへのシミュレーションを処理します。
サーバーは Projectiles を作成し、これらはクライアント側に複製されるものです。
クライアントが発射体を受け取ると、それは対応する ClientProjectile をその発射体のビジュアルと共に作成します。
発射体は、クライアント上で予測的に作成することもできます。
予測と一致する発射体がサーバから受信されると、関連するクライアント発射体がサーバからの発射体にリンクされている間に、予測は削除される。
一致が見つからない場合、予測はクライアントの発射物とともに削除されます。

Ragdoll

すべてのアクティブなラグドールの状態を更新します。 Unity物理システムによって処理されたシミュレーション

SpectatorCam

観客がコントロールできる、複製されたプレイヤーカメラをコントロールします。 これは非文字単位の制御をテストするために使用することができ、現在はかなりハッキーな状態にあります。

ECS

すべての(ほとんど)ゲームコードはECSシステムを使用して実装されていますが、ここでは_mixed-mode_と呼びます。
まだECSに実装されていない機能に依存しているため、コードはまだベースになっています。
GameObjectsとMonoBehaviors - しかし、いくつかのエンティティとデータコンポーネントで物事を盛り上げるようにしています。
また、すべてのシステムを手動でアップデートすることを選択しました。
システムがフレームごとに複数回更新される必要があるときに必要です(クライアント側の予測のように)。
しかし、私たちが進むにつれて、ますます多くのゲームコードが純粋なECSになることを期待しています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment