Multiplayer Racing Template

マルチプレイヤー・プロジェクトのテンプレート。スターターパックとして設計されています。
をインポートすることをお勧めします。
Photon Fusion 2が必要です。
SDKのリンク Photonウェブサイト、Unity Asset Store。
5つのシーン、3台の車、3つの武器(マシンガン、ロケットランチャー、地雷ランチャー)、4つの拾う要素(ミサイル、地雷、ロケットランチャー、地雷ランチャー)が含まれています。
拾える要素(ミサイル、地雷、メディキット、ニトロ補給)。
共有モードでPhoton Fusion 2を使用。
固定更新時間 = 0.012。 (デフォルト = 0.02)
プロジェクトの構成:
\プロジェクト構成:Content – カーモデル、アイコン、マテリアル。
\Prefabs – 車のプレハブ(プレイヤー、敵)、ピックアップ要素のプレハブ、UI、武器、VFX。
\Scenes – すべてのゲームシーン。
\ScriptableObjects – ピックアップ要素のコンフィグ。
\Scripts – 全てのゲームコード
シーン
BootScene – スタートするシーン。設定やネットワークを初期化する場所として使用します。ゲーム開始時に
ゲーム開始時に一度だけロードされます。
LoadingScene – シーンを切り替える時に表示されるシーン。
MainMenu – メニューで、新しいゲームを開始したり、既存のゲームに参加したり、プレイヤー名を設定したり、プレイヤーの色を選択したり、サーバーの地域を切り替えたりできます。
プレーヤーの色の選択、サーバー地域の切り替えを行います。
GameScene – ゲームプレイのシーンです。
Demo – デモシーン。
どこから始めるか:
インストールガイドの後、Boot SceneのSettingsManagerから始めることをお勧めします。
これは永久オブジェクト(DontDestroyOnLoad)で、すべてのプロジェクト設定を含んでいます。
そのため、ゲームのすべての部分につながる最良のエントリーポイントです。
また、PlayerDataKeeperもチェックすることをお勧めする。このスクリプトはPlayerPrefsと連動し
ローカルプレイヤーに関するデータを含んでいる。

Installation Guide

  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を開きます。

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

  1. Launch full game version from \Scenes\BootScene.scene
    or demo version from \Scenes\Demo\Demo.scene

1人用のゲームを開始するには、「START RACE」→「START GAME」の順に押し、「NUMBER OF PLAYERS」を1に設定(スライダーを左に移動)し、「START PUBLIC GAME」を押します。
PLAYERS “を1に設定し(スライダーを左に動かす)、"START PUBLIC GAME “を押す。

How to add new bot

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

新しいAIプレハブを追加するには

  • 既存の敵車プレハブをコピーして、そのコピーを Bot Prefab フィールドに置く。

ブートシーンを開き、新しいAIプレハブを追加します:

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

How to add new player’s car

ブートシーンを開きます。

  • SettingsManagerを見つける。Player子オブジェクトを選択します。
  • Configsコレクションの下にある+を押します。最後のPlayerコンフィグが自動的にコピーされ、Configsコレクションの最後に追加されます。
    に追加されます。これで設定を変更できるようになりました。

新しいプレーヤープレファブを追加するには

  • 既存の選手の車のプレハブをコピーし、そのコピーをPlayer Prefabフィールドに置く。
  • プレビューモデルプレハブをコピーし、そのコピーをプレビューモデルプレハブフィールドに置きます。

完了!これでゲームを実行して、新しい車をチェックできます。
詳しくはソースコードをご覧ください: PlayerDataKeeper.selectedPrefabプロパティと
ServiceUserController.GetLocalPlayerSpawnParameters() メソッドを参照してください。

How to change car model (Player, Enemy)

車のプレハブを開く。

  • 古い車の隣に新しい車のモデルを置きます。位置と回転を設定する。位置は
    ゼロに近いか等しい。

車のホイールモデルとホイールメッシュコントローラーをリンク。ホイールモデルのトランスフォームを
フィールドに配置します。
FL – フロント左、FR – フロント右、BL – バック左、BR – バック右

ここでは、Wheel Mesh Offsetフィールドでホイールモデルのオフセットを調整することもできます。
詳しくはWheelMeshControllerプレハブをご覧ください。

  • プレハブから旧車モデルを削除します。
  • 新しいモデルに合うように、ホイールの半径と位置を調整します。

前輪と後輪の間隔を同じにする。

CenterOfMassを車の下、車輪が当たる高さに置く。

注:重心を前後に移動させると、車の挙動が変わる。
(0, 0, -0.2)では車が重く感じられ、(0, 0, 0.2)では軽く感じる。

ExhaustPipeVFXの位置を調整する。

新しい車の色を変更させるには、車のメッシュをCarColorControllerコンポーネントとリンクさせます

CarColorControllerはMeshColorAdjustersのコレクションを含み、選択されたメッシュとマテリアル(マテリアルIDによって)を再ペイントします。
マテリアルを再ペイントします。
各MeshColorAdjusterには以下が含まれます:
Mesh Renderer: 再塗装されるメッシュへの参照。
マテリアルID:同じメッシュ上に複数のマテリアルがある車のために、再塗装するマテリアルのインデックス。
メッシュに関連するすべてのマテリアルはMeshRenderer(デフォルトのメッシュコンポーネント)に格納されています。
メッシュにマテリアルが1つしかない場合は、マテリアルIDを0に設定してください。
カラーファクター:リペイント(色の置き換え)の強さ。1は100%を意味します。

プレビューモデル・プリファブ(メインメニュー用カーモデル)の更新:

  • 必要なプレビューモデルプレファブを開きます。
  • 新しい車モデルを古い車の隣に置きます。
  • WeaponBoxを古い車から新しい車に移動します。
  • プレハブから古い車モデルを削除します。
  • 車のメッシュを MainMenuPreviewCarController コンポーネントにリンクします。これは
    CarColorController(上記参照)と全く同じですが、プレビューモデル用です。

How to change car parameters (speed, brakes, friction):

  • 車のプレハブを開きます。
  • ルートオブジェクトでCar Physics Controllerコンポーネントを見つけます。
    これは車のエンジンと車輪をコントロールします。

ここで次のパラメータを変更することができます:
モーターパワー – 車のモータートルク。値が大きいほど、車は速くなります。
Axles – ホイールペア制御。ホイールのトルク、ブレーキ、ステアリングを操作します。自動ブレーキ
車が逆方向にアクセルを踏み始めると作動。車を速く止めるのに役立ちます。
ギア – 基本的なギア。各ギアにはスピードレンジとモータートルク倍率があり
倍率があり、加速を調整できます。ギアは遅延なく自動的に切り替わります。
グラビティ – より良い結果を得るためのカスタムグラビティ。
ステアリング – 車速に応じた一般的なステアリング動作を設定するグラフ。
ハンドブレーキステアリング – アクティブハンドブレーキ中の追加ステアリングを設定するグラフです。
車速に応じて)。

サスペンションとホイールの摩擦を調整するには、WheelColliderコンポーネントを設定する必要があります。
すべてのホイールは、それ自身のWheelColliderを持っています。

調整する前にUnity Official Wheel Collider Documentationを確認することをお勧めします。
そこにはWheel Colliderのパラメータに関する必要なデータがすべて含まれています。
ただし、ホイールフリクションカーブの設定はスキップし、以下の画像のようにフリクション値を設定することをお勧めします。
のように設定することをお勧めします。これは、車の設定を開始するのに最適なパラメータです。

ステアリング・ホイールの場合、剛性が高いほどコントロール性が高まる(ステアリングが速くなる)。
モーター・ホイールでは、剛性が高いほど加速が速くなります。
剛性が低いと、すべての車輪で滑りやすくなります(ドリフト)。
注:重心はホイールの剛性挙動に影響します。
詳細はカー・プレファブをご覧ください。

How to add new weapon

WeaponType.csを開き、新しい武器タイプを追加します。

  • ブートシーンを開きます。
  • SettingsManagerを見つけます。Weapon子オブジェクトを選択します。
  • Weaponsコレクションの下にある+を押します。自動的に最後の武器設定がコピーされ、Weaponsコレクションの最後に追加されます。
    に追加されます。
  • Weapon Typeフィールドのドロップダウンメニューで、新しく定義された武器タイプを選択します。
  • Infinite Ammo = trueに設定します。このパラメータにより、弾薬を拾わずに武器をテストすることができます。
    弾薬を拾わずに武器をテストすることができます。

車のプレハブを開く。

  • 武器を探す。
  • 武器の一つをコピーする。
  • WeaponTypeを新しい武器タイプに設定します。

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

PlayerCarBehaviourに新しい武器を追加。

武器の射撃入力を追加。

Enable input.

Add input handling.

How to add another game scene

既存の GameScene を複製する。Environmentオブジェクト内の何かを変更する。
– Build Settingsにシーンを追加する。
– 実行時にコードからPlayerDataKeeper.selectedSceneの値を設定する。
– 新しいゲームセッションを開始する。参加したクライアントは自動的にシーンをロードします。
現在、プロジェクトには1つのシーンしかなく、値は常に “GameScene “です。
しかし、拡張の準備はできています。
ゲームシーンを適切に動作させるには、WayPointGroupsとCheckpointsを設定する必要があります。
チェックポイントは、レースの各車両の進捗状況(順位、ラップ、ステータス)を管理するためのソリューションです。
をコントロールするソリューションです。各車両はチェックポイントを次々に通過し、周回を重ねるごとにフィニッシュする。
また、車は最後のチェックポイントでリスポーンします。
シーン上のチェックポイントは、GameManager上のCheckpointControlコンポーネントによって処理されます。

ボットを円状に移動させるには、WayPointGroupsを使う必要がある。
ボットはグループからランダムに1点を選択し、この点に移動する。
ボットが十分に近づくと、リストから次のグループを取得し、移動する新しいランダムな点を選択する。
に移動する。WayPointGroupsには、異なる色でマークされた5つのポイントが含まれます。
シーン上のWayPointGroupは、GameManager上のAIPathControlコンポーネントによって処理されます。
注意:ボットがチェックポイントでリスポーンした後に向きを変える場合、そのチェックポイントにWayPointGroupを追加します。
を追加します。ボットはそのチェックポイントを通過したとみなし、次のグループを選択します。

How to add new pick-up item

ピックアップは2つのパーツからできています: Pick-Up Itemプレハブとスクリプト可能なオブジェクトの2つから構成されます。
コマンド。
プロジェクトにはモディファイア・コントロール・システムが含まれています。
パターンがあります。オブジェクト(弾薬、ニトロ、
medkit)を拾ったり、ダメージを受けたりするコマンドをブロードキャストして処理するのに使われる。
すでに用意されているコマンドを使ったり、カスタマイズしたり、新しいコマンドを作ったりすることができる。以下に説明する)。

既存のコマンド説明
Instant Damageダメージ 弾丸のダメージとして使用される。地雷などの可能性もある。
Continuous Damage退場時間を伴うダメージ(火、毒など
Instant HealMedkit
InstantAmmo選択した武器種の弾薬
InstantNitro補充用ニトロ

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

Create scriptable object from menu: Assets > Create > Modifier Container

既存のプレハブの1つをPick-Up Itemsにコピーし、そのプレハブのスクリプ タブルオブジェクトを、新しく作成したスクリプタブルオブジェクトに置き換えます。

ゲーム内でピックアップアイテムを見るには、シーンに配置してシーンを保存します。

How to create new modifiers/commands

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

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

Instant修飾子:

Continuous modifier (contains tag):

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

PackModifierメソッドとUnpackModifierメソッドをオーバーライドします。
重要: 新しいモディファイアは ModifierBase と同じ名前空間に置いてください。
インスタント・モディファイア

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

Continuous Modifier:

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

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

既存のプレハブの1つをPick-Up Itemsにコピーし、そのプレハブのスクリプ タブルオブジェクトを、新しく作成したスクリプタブルオブジェクトに置き換えます。
Containerフィールド)を新しく作成されたスクリプト可能オブジェクトに置き換えます。

ゲーム内でピックアップアイテムを見るには、シーンに配置してシーンを保存します。

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

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

メソッド内部で、必要なモディファイアがあるかどうかをチェックし、あればカスタム・ロジックを実行し
ロジックを実行し、その結果を返します。ない場合はデフォルト値を返します。
キャラクターは、弾(ロケットや地雷)が当たったときや、エレメントを拾ったときにモディファイアを得ることができます。
ModifiersControlSystemはCommandReceiverコンポーネントからすべてのモディファイアを受け取ります。
詳細はModifiersControlSystemとCommandReceiverを参照してください。
モディファイアは

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

クラス

Lobby

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

Game

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

Character

Class nameDescription
CharacterIdentityControlisPlayer、isBotのIDマーカーを含む。
オーバーライド: IsLocalPlayer、IsOwner、OwnerClientIdをオーバーライド。NetworkBehaviourから。
また、カスタムキャラクタースポーンパラメータも含まれています。
RigidbodyNetworkTransformネットワークカー物理エミュレーション。
リジッドボディを非キネマティックにし、ネットワークトランスフォーム同期中に他の
ネットワーク変換の同期中に他のリジッドボディと相互作用できます。
補間と外挿(予測)を含みます。
CarPhysicsController加速、ブレーキ、ステアリング、重力など、すべてのカーフィジックスをコントロールする。など。ニトロも。
ModifiersControlSystemアクティブなパワーアップとコマンドを含み、処理を待っている。
より詳細な情報はソースコードに記載されています。
CommandReceiverモディファイア/コマンドを受け取る。
WeaponControlSystemメインの武器コントロールクラス。
すべての武器とそれらを管理するためのコントロールが含まれています。
すべての武器にはWeaponコンポーネントがあります。
武器は、Bullet(弾丸)またはMine(地雷)コンポーネントを持つ弾薬オブジェクトを生成します。
コンポーネントを持つ弾薬オブジェクトを生成します。
より詳細な情報はソースコードに記載されています。
HealthController現在の体力状態をコントロールする。また、死亡イベントを実行する。
NitroController現在のニトロ量とその活性状態を制御する。
PlayerCarBehaviourプレイヤーカー入力ハンドリング:移動、ステアリング、ニトロ、武器、
その他
AICarBehaviourボットカーのロジック:移動、ナビゲーション、武器操作など。
RaceStatusController現在の順位、ラップ、レースの状況をコントロールする。
RespawnController最後のチェックポイントで車をリスポーンする。
車が破壊された場合、車の体力とニトロを回復する。
CharacterUIControllerローカルプレーヤーの場合はHUDを、ボットや他のプレーヤーの場合はステータスバーをコントロールする。
プレーヤーを制御します。
CarColorController車のスタートカラー設定
HealthVFXIndicationController車の健康状態に合わせて黒煙の強さをコントロール。
ExhaustPipeVFXController排気管のスモークとニトロ効果をコントロール。
WheelsVFXController3つの主要なホイールVFXコンポーネントを管理します:
WheelMeshController – ホイールの回転を制御します。
TireSkidMarksController – スキッドマークを制御します。
TireSmokeController – ホイールからのスモークを制御します。

Other

Class nameDescription
ServiceUserControllerセッション・ユーザー・オブジェクト。サービス利用のみ。
分離されたゲームオブジェクトとして生成されます。
PickUpItemControllerピックアップと弾薬補給を行う。復元時間があります。
PlayerDataKeeper静的クラス。ローカルデータのロード/セーブ。PlayerPrefsと連動する。
SceneLoadManagerシングルトン。LoadingSceneを通したターゲットシーンのロードと連動します。シーンをロードする2つの方法が含まれています:通常とネットワーク指向。より詳細な情報はソースコードに記載されています。
GameCameraControllerローカルプレーヤーをターゲットにしたゲームカメラ。