Multiplayer Top-Down Shooter Template(Photon Fusion 2)

新しい空のプロジェクトに追加します。
Photon Fusion 2が必要です。
SDKのリンク Photonウェブサイト、Unity Asset Store。
5シーン、2キャラクター(プレイヤー、敵)、3武器(ピストル、ライフル、ショットガン)、4パワーアップ(移動速度、発射速度、武器の精度、メディキット)。
パワーアップ(移動速度、発射速度、武器の精度、メディキット)。
共有モードでPhoton Fusion 2を使用。
プロジェクトの構成:
\コンテンツ – キャラクターモデル、武器モデル、アニメーション、アイコン、マテリアル。
\Prefabs – キャラクターのプレハブ(プレイヤー、敵)、ドロップ要素のプレハブ、UI、武器。
\Scenes – 全てのゲームシーン。
\ScriptableObjects – ドロップエレメントのコンフィグ。
\スクリプト – 全てのゲームコード
シーン
BootScene – スタートするシーン。設定やネットワークを初期化する場所として使用します。ゲーム開始時に
ゲーム開始時に一度だけロードされます。
LoadingScene – シーンを切り替える時に表示されるシーン。
MainMenu – メニューで、新しいゲームを開始したり、既存のゲームに参加したり、プレイヤー名を設定したり、プレイヤーの色を選択したり、サーバーの地域を切り替えたりできます。
プレーヤーの色の選択、サーバー地域の切り替えを行います。
GameScene – ゲームプレイのシーンです。
Demo – デモシーン。

設定

インストールガイドの後、Boot SceneのSettingsManagerから始めることをお勧めします。
これは永久オブジェクト(DontDestroyOnLoad)で、すべてのプロジェクト設定を含んでいます。
そのため、ゲームのすべての部分につながる最良のエントリーポイントです。
また、PlayerDataKeeperもチェックすることをお勧めする。このスクリプトはPlayerPrefsと連動し
ローカルプレイヤーに関するデータを含んでいる。
複数のインスタンスでの実行
同じコンピュータ上で複数のインスタンスを実行するには、エディタとコマンドライン引数に ParrelSync を使用できます。
コマンドライン引数に ParrelSync を使用できます: -authProfileName uniqueProfileName、
ここで uniqueProfileName – 各インスタンスに固有の名前。
ParrelSyncを使用している場合は、LobbyManagerの65~72行目のコードをアンコメントしてください。

インストールの仕方

  1. Photon Cloudで新しいアプリを作成する(作成されていない場合)
    1.1 “Create a new App “ボタンを押します。
    1.2 アプリの種類を “マルチプレイヤーゲーム “に設定する。
    1.3 Photon SDKをFusionに設定します。
    1.4 アプリケーション名を設定します。
    1.5 Createをクリックします。
    詳しくは、Getting Started with Photon Fusion Shared Modeのドキュメントを参照してください。
    モードを参照してください。
  2. ツール(Tools) > Fusion > Fusion Hub、またはホットキー(Alt+F)でUnity EditorのFusion Hubを開きます。Alt+F

アプリIDをPhoton CloudダッシュボードからFusion HubメニューのFusion App IDフィールドにコピーします。

  1. ゲーム本編を起動する。
    またはデモ版を起動する。

使い方

新しいボットの追加方法

  1. ブートシーンを開きます。
  2. SettingsManagerを見つけます。AI子オブジェクトを選択します。
  3. Configsコレクションの下にある+を押します。最後のボット設定が自動的にコピーされ、Configsコレクションの最後に追加されます。
    に追加されます。これで設定を変更することができます。
  4. 新しいAIプレハブを追加するには、既存のものをコピーし、そのコピーをBot Prefabフィールドに置きます。

ゲームがボットをスポーンするとき、設定リストからランダムにボットを選択します。
詳細はソースコード(NetworkObjectsSpawner.cs)を参照してください。

新しいプレーヤーを追加する方法

  1. ブートシーンを開きます。
  2. SettingsManagerを見つけます。Player子オブジェクトを選択します。
  3. Configsコレクションの下にある+を押します。最後のプレーヤーのコンフィグが自動的にコピーされ、Configsコレクションの最後に追加されます。
    Configsコレクションの最後に追加されます。これで設定を変更することができます。
  4. 新しいプレーヤープレファブを追加するには、既存のプレーヤープレファブをコピーし、そのコピーをPlayer Prefabフィールドに置きます。
    プレイヤーを選択するには、実行時にコードからPlayerDataKeeper.selectedPrefabの値を設定する。
    現在、プロジェクトには選手が1人しかいないので、値は常に0である。
    しかし、拡張の準備はできている。
    詳細はソースコードを参照: PlayerDataKeeper.selectedPrefabプロパティと
    ServiceUserController.GetLocalPlayerSpawnParameters() メソッドを参照してください。

キャラクターモデルの変更方法(プレイヤー、エネミー)

  • キャラクター・プレハブを開きます。
  • 新しいキャラクターモデルを古いモデルの隣に配置します。位置と回転をゼロにします。

アニメーターコントローラーを旧モデルから新モデルにコピーし、ルートモーションをオフにする。

新しいキャラクターモデルにCharacterIKControllerコンポーネントを追加します。これはモデルの左手を選択した武器のグリップに取り付けるために使用されます。

RightHandWeaponsオブジェクトを、古いモデルの右手(手首)から新しいモデルの右手(手首)へドラッグします。

RightHandWeapons の位置と回転をゼロに設定する。

  • RightHandWeaponsギズモが正しい方向を向いていることを確認する。正しくない場合は回転させます。
  • モデルによっては、X:0 Y:90 Z:0、またはX:90 Y:90 Z:0になることがほとんどです。これらの値は、試してみるには良い出発点です。

CharacterAnimationControllerのAiming Transform AngleフィールドにRightHandWeaponsのXとYの角度をコピーする。

ランタイムで照準方向を調整することをお勧めします。
AimingTransformAngleフィールドを微調整することで可能です。
シーンに0台のボットをセットして、プレイモードを実行し、値を変更してください。デモシーンは完璧でしょう。
ゲームがまだ動いている間に、値をコピーするのを忘れないでください。
それでもまだ何かおかしいようであれば、キャラクタモデルのRigタブで必要なボーンを設定するか、BoneAngleAdjusterを使用することをお勧めします (詳細は後述します)。
アバターマッピングタブで必要なボーンを回転させてみて、"Done “を押してください。変更は
実行時に適用されます。

注意: プレイモードをオフにしても、リグの設定は保存されます。
右手首からボーンを調整することをお勧めします。
リグの設定に加えて、プロジェクトにはBoneAngleAdjusterが含まれています。
が含まれています。これは、既存のボーン回転にオフセットを追加するように設計されています。

武器の垂直方向の照準方向を補正するために、すべてのキャラクターはTargeting Point
トランスフォームが含まれています。これにより、各武器の照準オフセットを調整できます。

キャラクターアニメーションコントローラーのアニメーターフィールドを、新しいモデルのアニメーターで更新する。

プレイヤーであれば、Character Color ControllerのRenderersコレクションを新しいモデルのレンダラーで更新します。レンダラーで更新します。(AIはキャラクターカラーコントローラを持っていません)。

キャラクターで背骨の重さ、胸の重さ、胸の上の重さのパラメーターを設定する

アニメーションコントローラー

選手のロボットモデルのように、背骨がない骨格もあります。この場合は、既存の骨にウェイトを設定することをお勧めします。そうでない場合は、すべての背骨にウェイトを分散させることをお勧めします。

武器モデル(右手にある)の位置と回転を設定します。
RightHandWeaponsオブジェクトは向きをコントロールするように設計されており、ゼロの位置にとどまるようになっています。
の位置に留まることになっている。しかし、その子オブジェクトは移動または回転するように設計されており、キャラクターモデルに最もフィットするように設定します。
キャラクタ・モデルに最適になるように設定されます。
注意:RightHandWeaponsの子オブジェクトをオンにしたままにしないでください。
に表示されます。

すべての作業が終わったら、古いモデルを削除してプレハブを保存します。
Note: モデルの左手の位置をさらに調整したい場合は、各武器の各武器のLeftGripIKの位置と回転を調整できます。

新しいモデルの色を変更させるには、キャラクターのメッシュをCharacterColorControllerコンポーネントで行う。

すべてのCharacterColorControllerは以下を含みます:
Renderers:再塗装されるメッシュレンダラへの参照。
メッシュに関連するすべてのマテリアルは、SkinnedMeshRenderer(デフォルトのメッシュ
コンポーネント)に格納されます。
カラーファクター:リペイント(色の置き換え)の力。1は100%を意味する。
新しい武器の追加方法

  • WeaponType.csを開き、新しい武器タイプを追加します。
  • ブートシーンを開きます。
  • SettingsManagerを見つけます。Weapon子オブジェクトを選択します。
  • Weaponsコレクションの下にある+を押します。自動的に最後の武器設定がコピーされ、Weaponsコレクションの最後に追加されます。
    に追加されます。
  • Weapon Typeフィールドのドロップダウンメニューで、新しく定義された武器タイプを選択します。

WeaponControllersプレハブを開いてください。

既存の武器を複製し、Weapon Typeを新しいタイプに設定します。ここで武器に新しい銃(バレル)を追加し、デフォルトの方向を設定します。
通常の武器には銃身が1つありますが、ショットガンには5つあります。
WeaponModelTransformKeeperは次のステップでキャラクターのプレハブ内に設定します。

RightHandWeaponsプレハブを開いてください。

  • RightHandWeaponsの子オブジェクト(武器)を1つ複製します。
  • キャラクターのプレハブを開き、キャラクターの右手にあるRightHandWeaponsオブジェクトを見つけてください。CharacterAnimationControllerのAiming Transform Fieldをクリックすると見つけやすい。

スクリーンショットのように、RightHandWeaponsの新しい武器をWeapon
Controllersにリンクします(オブジェクトをドラッグ&ドロップします)。
こうすることで、ウェポンコントローラーに、グラフィック、ファイアポイント、左IKグリップがどこにあるかを知らせることができます。
RightHandWeaponsのすべての武器には、WeaponModelTransformKeeperコンポーネントが含まれています。

注意:RightHandWeaponsの子オブジェクトをオンにしたままにしないでください。
に表示されます。

  • 新しい武器をWeapon ControllersからWeaponsコレクションにドラッグ&ドロップします。
    WeaponControlSystemコンポーネントのWeaponsコレクションにドラッグ&ドロップします。

WeaponControlSystem.csに格納されているデバッグコマンドで武器をチェックする。

注:武器の垂直方向の照準方向を補正するために、すべてのキャラクターはTargetingポイントトランスフォームが含まれています。これにより、各武器の照準オフセットを調整することができます。

ゲームシーンの追加方法

  • 既存のGameSceneを複製する。Environmentオブジェクトを変更する。
  • Build Settingsにシーンを追加する。
  • 実行時にコードからPlayerDataKeeper.selectedSceneの値を設定する。
  • 新しいゲームセッションを開始する。参加したクライアントは自動的にシーンをロードします。
    現在、プロジェクトには1つのシーンしかなく、値は常に “GameScene “です。
    しかし、拡張の準備はできています。
    新しいピックアップオブジェクトの追加方法
    ピックアップは2つのパーツからできています: ドロップアイテム(プレハブ)と、コマンドを持つスクリプト可能なオブジェクトです。
    プロジェクトにはモディファイアコントロールシステムが含まれています。
    パターンがあります。オブジェクト(武器、
    パワーアップ、メディキット)を拾ったり、ダメージを受けたりするコマンドをブロードキャストして処理する。
    すでに用意されているコマンドを使ったり、カスタマイズしたり、新しいコマンドを作ったりすることができます。以下に説明する。
Existing commandsDescription
Continuous Accuracy ModifierAccuracy power-up with exit time
Continuous DamageDamage (Fire, Poison, etc) with exit time
Continuous Fire Rate ModifierFire rate power-up with exit time
Continuous Speed ModifierMovement speed power-up with exit time
Instant DamageDamage. Used as bullet damage. Could be mines, etc
Instant HealMedkit
Weapon Switch CommandWeapon pick-up

ScriptableObjectsDrop Configsに保存されているピックアップで使用されるスクリプト可能なオブジェクト。
Pick-up prefabs stored at \Prefabs

  • メニューからスクリプタブルオブジェクトを作成: メニューからAssets > Create > Modifier Container

既存のプレハブを1つコピーして、そのプレハブのスクリプタブルオブジェク ト(Containerフィールド)を新しく作成したスクリプタブルオブジェクトに置き換える。

  • ブートシーンを開きます。SettingsManagerを見つけます。AI子オブジェクトを選択します。
  • 新しく作成したプレハブを AI Settings > Configs > Drop Elements コレクションに追加します。

新しいモディファイア/コマンドを作成する方法
プロジェクトにはモディファイア・コントロール・システムが含まれている。
パターンがある。オブジェクト(武器、パワーアップ、メディキット)を拾ったり、ダメージを受けたりするコマンドをブロードキャストし、処理するために使用される。
独自のモディファイア/コマンドを作成するには、次の手順に従ってください:

  • 新しいクラスを作成し、InstantModifierかContinuousModifierを継承する。
    InstantModifierは、持続時間のないモディファイア(コマンド)の基本クラスです。
    ContinuousModifierは、持続時間のあるモディファイアの基底クラスです。
  • クラス名の上に[Serializable]属性を追加します。
  • 以下の例のように、クラスのコンストラクタを定義します。

Instant modifier:

Continuous modifier (contains tag):

プロジェクト内のすべての連続修飾子は、名前の次の単語の最初の文字でタグ付けされます。
NewCustomModifierのタグは “ncm “である。
タグは、同じ効果を持つ連続モディファイアを1つのモディファイアにまとめるために必要です。
タグが必要。

  • PackModifierメソッドとUnpackModifierメソッドをオーバーライドします。
    重要:新しいモディファイアは、ModifierBaseと同じ名前空間に保持すること。

Instant Modifier:

PackModifierメソッドとUnpackModifierメソッドは、特定の修飾子のフィールドに格納されたカスタムデータをパックしたりアンパックしたりする命令を格納するように設計されています。
メソッドは、特定の修飾子のフィールドに格納されたカスタム・データをパックおよびアンパックする命令を含むように設計されています。
この例では、PackModifierは3つのカスタム・フィールド(newIntParameter、newFloatParameter、newStringParameter)を受け取り、object[]にパックします。
これらはJSON互換の変数の可能性があります。
モディファイアを受け取り、object[]から元に戻すには、UnpackModifierが必要です。

Continuous Modifier:

詳しくは、ScriptsModifiers フォルダにある他のモディファイアを参照してください。

  • 新しいクラス NewCustomModifierContainer を作成し、ModifierContainerBase から継承する。
  • CreateAssetMenuを追加する。
  • GetConfig()メソッドをオーバーライドする

Create container: Assets > Create > Modifier Container > New Custom Modifier Container

PrefabsDropからプレハブの一つをコピーする。

  • 作成したNew Custom Modifier ContainerファイルをプレハブのPickUpItemController > Containerフィールドにドラッグ&ドロップします。

プレハブをシーンに配置するか、AI設定のドロップ要素リストに追加する(推奨)。

  • ModifiersControlSystem に NewCustomModifier の処理メソッドを追加。

このメソッドはモディファイアのロジックを処理しなければならない。また、このメソッドは
コンポーネントから呼び出されることになっています。
どのように動作するか すべてのモディファイアタイプ(または少数)に対して、特別な処理メソッドが
ModifiersControlSystemに格納されています。
この修飾子に関連する何か(ステータス、値など)をチェックする必要がある場合、この
メソッドを呼び出します。通常、毎フレーム呼び出される。

HealthControllerコンポーネントからHandleHealthModifiersメソッドを呼び出し、受け取ったヒールコマンドやダメージコマンドを処理する。
を処理する。
WeaponコンポーネントからCalculateFireRateMultiplierメソッドが呼び出され、取得したパワーアップに応じて発射速度をチェックする。
をチェックします。
WeaponControlSystemからHandleWeaponSwitchCommandsメソッドを呼び出し、武器の切り替えを処理します。
メソッドを呼び出す。
このメソッドの中で、必要なモディファイアがあるかどうかをチェックし、もしあれば、カスタムロジックを実行し、その結果を返します。
ロジックを実行し、その結果を返す。ない場合はデフォルト値を返します。
キャラクターは弾が当たったり、ドロップエレメントを拾ったりすることでモディファイアを得ることができます。
ModifiersControlSystemはCommandReceiverコンポーネントからすべてのモディファイアを受け取ります。
詳しくはModifiersControlSystemとCommandReceiverを参照してください。

モディファイアは

  • HandleHealthModifiersメソッドのように、引数を取り、更新されたデータを返す。
  • CalculateSpeedMultiplier、CalculateFireRateMultiplier、または
    CalculateAccuracyMultiplier。
  • は何もせず、フラグとして動作します: ContainsModifier() のようにコールバックデリゲートで動作します。
  • HandleWeaponSwitchCommandsのようなコールバックデリゲートで動作します。
  • その他のカスタムロジックを実行する。
    要するに、モディファイアはコマンド・オブジェクトなのだ。)
    注:ModifiersControlSystemはコンポーネントです。すべてのキャラクターは
    ModifiersControlSystemを持っています。
    しかし、キャラクタのロジック以外でも使用することができます。

Lobby

Class nameDescription
LobbyManagerシングルトン。
ロビーを作成し、参加するためのメソッドが含まれています。
を含むロビーを作成し、参加するためのメソッドが含まれています。
ロビーが満員になり、ゲームセッションを開始する準備ができたときに、新しいゲームをホストするメソッドが含まれています。
ゲームセッションの開始。
LobbyDataControlNetworkRunnerからのコールバックを処理する。

Game

Class nameDescription
GameManagerシングルトン。
ゲームの状態をコントロールするメソッドとイベントを含む。
また、ユーザースコアのリストも含む。
NetworkObjectsControlGameManagerの一部。パブリックオブジェクト。
シーン上のすべてのキャラクター(プレイヤー、ボット、サービスオブジェクト)のリストを格納します。
あらゆるタイプのキャラクタに簡単にアクセスするために使用します。
NetworkObjectsSpawnerGameManagerの一部。パブリックオブジェクト。
キャラクターやボットのスポーン/リスポーンに使用される。

Character

Class nameDescription
PlayerBehaviourプレイアブルキャラクターのロジック:移動、回転、射撃コマンド。
AIBehaviourボットキャラクターのロジック:ナビゲーション、移動、回転、ターゲット探し戦闘操作、射撃コマンド。
BasicNetworkTransformNetworkTransformのロジックを簡素化。セットアップが簡単。驚きなし。補間と外挿を含む。
CharacterIdentityControlisPlayer、isBotのIDマーカーを含む。
オーバーライド: NetworkBehaviourのIsLocalPlayer、IsOwner。
また、カスタムキャラクタースポーンパラメータも含まれています。
RigidbodyCharacterControllerCharacterControllerの代わりにUnity rigidbodyを使用。
CharacterAnimationControllerキャラクターのアニメーション、アニメーションレイヤー、スケルトンをコントロールし正しい方向に照準を合わせる。
照準トランスフォームが必要です。
右手に寄る。アルゴリズムは、照準トランスフォームが常にキャラクタの視線方向を向くようにします。
背骨を回転させることで、キャラクターの視線の方向を常に見るようにします。