Fusion Projectiles

Level Intermediate

概要

Fusion Projectiles は、シューターゲームにおいて、様々な種類の弾丸のネットワークを実装する方法を説明します。マルチプレイヤープロジェクタイルのプログラミングは、パフォーマンス、帯域幅の消費、精度のバランスを取ることが難しいタスクです。また、シミュレーションとレンダリングの弾道(カメラからの発射と銃身からの発射)の不一致を考慮したスムーズなレンダリングも必要です。Fusion Projectilesは、このタスクを少し明確化し、簡素化することを目的としています。

投射物の文脈を理解するために、サンプルは他のサポートシステム(ゲームプレイハンドリング、ヘルス&ダメージシステム、武器)と共にシンプルなFPSゲームとして作られており、シューティングゲームを作るための確固たる基礎として利用することができます。

このサンプルではHostModeトポロジーを使用しています。

トップに戻る

特徴

  • 投射データリングバッファを使用し、個々のネットワークオブジェクトを持たない投射物を扱うことができます。
  • ヒットスキャンからホーミングまで、様々な種類の弾丸を使用可能 -武器コンポーネントシステム
  • 7種類の武器
    • パルスガン
    • ライフル
    • ショットガン
    • レーザー銃
    • スナイパー
    • ホーミングガン
    • 跳弾銃
  • 銃身から実際の弾道(カメラからのショット)への補間を解決しました。
  • ヘルス&ダメージシステム
  • 爆発
  • 弾丸の予測的な発生

トップに戻る

始める前に

必要条件:

  • Unity 2021.3
  • Fusion AppId:サンプルを実行するには、まずPhotonEngine Dashboard で Fusion AppId を作成し、リアルタイム設定 (Fusion メニュー) の App Id Fusion フィールドに貼り付けてください。ゲームの開始](#startingthegame)セクションの指示に従います。

トップに戻る

ダウンロード

バージョン リリース日 ダウンロード
1.1.2 Oct 21, 2022 Fusion Projectiles 1.1.2 Build 54

トップに戻る

正しい方法を選択する

プロジェクトに入る前に、Fusionで投射物をネットワーク化するための様々なオプションについて説明します。

#

トップに戻る

A) NetworkObject With NetworkTransform/NetworkRigidbody

投射物を NetworkObject としてスポーンし、NetworkTransform または NetworkRigidbody を使って位置を同期させます。

  • ✅ シンプルなソリューション
  • ✅ 関心管理は箱から出してすぐ使える
  • ✅ 適切な物理学 (PhysX) を使用可能
  • NetworkObject のインスタンス化の負担が大きい。
  • NetworkTransform/NetworkRigidbody はトランスフォームの更新を全てネットワーク経由で送信することを意味します。
  • ❌ 必要に応じて予測されたスポーンの処理

つまり: 特定の状況下で少量の投射物にのみ適しています。

トップに戻る

B)発射データ付きネットワークオブジェクト

投射物を NetworkObject としてスポーンし、スポーンしたオブジェクトの NetworkBehaviour でネットワーク上のカスタムデータ (通常は発射タイミング、発射位置、発射方向) を使用してサーバーとクライアントで投射物の全軌跡を計算します。

  • ✅ 位置の更新に帯域幅はかからない。
  • NetworkObject のインスタンス化の負担がかかる。
  • ❌ 必要に応じて予測されたスポーンの処理
  • ❌ 手動でのインタレスト管理の処理

つまり: 特定の状況下での少量の投射にのみ適し、通常Aより優れている。

トップに戻る

C) 射撃回数プロパティ

任意の NetworkBehaviour に格納されている、発射された投射物のカウントのみを同期させます。Projectileは単なるビジュアルで、標準的なUnityオブジェクトとして生成されます。Input AuthorityとState Authorityでは正確に発射されますが、プロキシでは補間された位置と回転に基づいて発射されます。

  • ✅ シンプルなソリューション
  • ✅ ネットワーク上で転送されるデータ量が最小になる。
  • ✅ サーバー上でビジュアルの生成を無視することができる
  • ✅ コントロールするオブジェクト(プレイヤー、武器)の一部としてのインタレスト管理
  • ✅ 予測的なスポーニングは必要ない
  • ❌ プロキシに不正確な点がある。プロキシはスナップショットで補間された位置にいるため、発射位置や方向がかなり異なる可能性がある。
  • ❌ 追加データがないため、最も単純な前方投射物のみ可能。
  • ❌ プロキシでは投射物の移動が不明なため、投射物の視覚は壁や他の物体を通過してしまう。

つまり: プロキシの精度やビジュアルをあまり気にしない単純なユースケースに適したソリューションです。例えば、単純な発射物や短い発射物のビジュアル(軌跡)を持つトップダウンシューティングゲームなどです。

トップに戻る

D) 投射物データバッファ

各投射物のカスタムデータを同期させ、NetworkBehaviourのリングバッファの形でネットワーク配列に格納します。投射物は、標準的なUnityオブジェクトとして生成される単なるビジュアルです。最適な帯域幅を使用するために、投射物のデータセットは疎であるべきです - 例えば、投射物の軌道は発射位置、発射方向または他のデータから計算されます - しかし、いくつかの特殊な使用例では、常に位置を更新することも可能です。

  • ✅ 良好な帯域幅の消費
  • ✅ ほとんどの発射体のユースケースをカバーする。
  • ✅ サーバーでビジュアルの生成を無視することができる。
  • ✅ 制御オブジェクト(プレイヤー、武器)の一部としての利益管理
  • ✅ 予測的なスポーニングは必要ない
  • ❌ 投影物は制御オブジェクトなしでは存在できない = 長生きはできない
  • ❌ バウンドなどの投射物物理は手動計算のみ

つまり: 非常に長寿命の投射物(所有者よりも長生きする可能性がある)、または非常に長距離移動する重要な投射物(利害関係の管理のため)を除いて、ほとんどの状況で非常に良い解決策です。


このサンプルでは、主にD(投射物データリングバッファの使用)に焦点を当てていますが、B(スタンドアロン投射物の使用)の例も含まれています。

NetworkedObjectとして生成される投射物の例については、Tanknarok sample を参照してください。

トップに戻る

ゲームの開始

デバッグスタート

ゲームを開始するには、Gameシーンを開いて再生します(Scenes/Game)。Fusion標準のNetworkDebugStartウィンドウを少し修正したものが表示され、ゲームを開始するモードを選択することができます。

Debug Start

トップに戻る

マルチピア

Start Host + 1 Client または Start Host + 2 Clients を選択すると、マルチピアモードでゲームが開始されます。この方法はプロキシ上で投射物がどのように振る舞うかをテストするのに非常におすすめです。

ピアを切り替えるには、テンキーで 0123 キーを押してください。

また、Runner Visibility Controls ウィンドウ (トップメニュー Fusion/Windows/Runner Visibility Controls) を使ってもピアを切り替えることができます。

Runner Visibility Controls

プロキシ上での撮影の動作を確認するために、クライアントA のみを可視に設定し、クライアントB のみを入力プロバイダとして有効にします。これで、クライアント B からの撮影は、クライアント A の視点から観察することができるようになります。

Runner Visibility Controls

備考: マルチピアモードが正しく動作するためには、静的フィールドを通してのシーンオブジェクトの参照を避けることが重要です(UI、カメラリグ、プレイヤーデータへのアクセスなど)が、静的を避けることは一般的にも良い、推奨される実践方法です。コードベースを通して、どのように共通のオブジェクトにアクセスするか、1つの解決策として、シーンと SceneContextのセクションを確認してください。

トップに戻る

操作方法

移動にはWSADを、射撃にはMouse1を、代替射撃にはMouse2を使用します。武器の切り替えはマウスのスクロールホイールか、適切なアルファベット番号のキーを押すことで行えます。選択した武器とその種類については、インゲームのUIを参照してください。

ENTERキーでカーソルを固定したり解除したりすることができます。

First Play

トップに戻る

プロジェクト組織

プレハブタイプ 場所
Player and Agent /Prefabs
Weapons /Prefabs/Weapons
Projectiles /Prefabs/Projectiles

トップに戻る

プレイヤー

プレイヤー (Player スクリプト、Player プレハブ) はゲーム内で接続された仲間を表し、視覚的な要素は持っていません。プレイヤーは、統計情報、ニックネーム、選択したヒーロー、ゲームプレイへの参加希望などを同期させるために使用します。また、プレイヤーは入力を処理します。

エージェント (PlayerAgent スクリプト、 Agent プレハブ) はプレイヤーによって操作されるインゲームのキャラクターを表し、 Gameplay によって生成され、 HealthWeapons、その他通常のものを所持しています。必要に応じてスポーン、デスポーンすることができます。

Photon Dummy

トップに戻る

ProjectileManager

ProjectileManager は、Fusion Projectiles サンプルの中心部分です。投射物のデータバッファや、投射物のビジュアル表現の作成・更新・削除を処理します。Projectile Managerは、コントロールするオブジェクト(例:AgentTurret)に常駐し、そのオブジェクトが所有する全ての武器の弾を更新する責任を負います。

Projectile Manager

Projectile Manager は、投射物データを特定のプレハブに正しくペアリングするために、投射物プレハブ配列を必要とします。簡単にするために、射線マネージャはインスペクタで直接プレハブを参照します。

備考: プレハブ配列にアクセスするためのより良い解決策は、ゲーム固有のものですが、例えば、設定データを持つスクリプト可能なオブジェクトにすることができます。

ProjectileManagerProjectileData を格納し、投射物やその他の投射物の挙動を計算するために使用します。

[StructLayout(LayoutKind.Explicit)]
public struct ProjectileData : INetworkStruct
{
    public bool    IsActive          { get { return _state.IsBitSet(0); } set { _state.SetBit(0, value); } }
    public bool    IsFinished        { get { return _state.IsBitSet(1); } set { _state.SetBit(1, value); } }

    [FieldOffset(0)]
    private byte   _state;

    [FieldOffset(1)]
    public byte    PrefabId;
    [FieldOffset(2)]
    public byte    WeaponAction;
    [FieldOffset(3)]
    public int     FireTick;
    [FieldOffset(7)]
    public Vector3 FirePosition;
    [FieldOffset(19)]
    public Vector3 FireVelocity;
    [FieldOffset(31)]
    public Vector3 ImpactPosition;
    [FieldOffset(43)]
    public Vector3 ImpactNormal;

    // Custom projectile data

    [FieldOffset(55)]
    public HomingData    Homing;
    [FieldOffset(55)]
    public KinematicData Kinematic;

    public struct HomingData : INetworkStruct
    {
        public NetworkId Target;
        public Vector3   TargetPosition; // Used for position prediction
        public Vector3   Position;
        public Vector3   Direction;
    }

    public struct KinematicData : INetworkStruct
    {
        public NetworkBool HasStopped;
        public Vector3     FinishedPosition;
        public int         StartTick;
        public byte        BounceCount;
    }
}

この構造体は、このプロジェクトで実証されている投射物の機能の数が多いため、現在、非常に大きくなっています。また、同じデータ値を使用しない複数の異なる投射動作が実証されているため、データ構造体は、特定の投射データのユニオンを使用しています。

実際のゲームでは、この ProjectileData 構造体をできるだけ小さくしておくことをお勧めします。ほとんどのゲームでは、ここで紹介した機能よりも少ない機能しか必要ないでしょう。 ProjectileData の簡略版を確認してください。

public struct ProjectileData : INetworkStruct
{
    public bool    IsActive          { get { return _state.IsBitSet(0); } set { _state.SetBit(0, value); } }
    public bool    IsFinished        { get { return _state.IsBitSet(1); } set { _state.SetBit(1, value); } }

    private byte   _state;

    public byte    PrefabId;
    public byte    WeaponAction;
    public int     FireTick;
    public Vector3 FirePosition;
    public Vector3 FireVelocity;
    [Networked, Accuracy(0.01f)]
    public Vector3 ImpactPosition { get; set; }
    [Networked, Accuracy(0.01f)]
    public Vector3 ImpactNormal { get; set; }
}
備考: union (= StructLayout(LayoutKind.Explicit) 属性) を使用すると、構造体の内部にプロパティを持つことができなくなり、Networked 属性と Accuracy 属性を使用することができなくなります。Unionを使用しなければ、ImpactPositionImpactNormalAccuracy アトリビュートを使用して、帯域幅を節約できます。

トップに戻る

投射物

Projectileスクリプト(プレハブ)は2つの使い方があります。

1) GetFireDataOnFixedUpdate メソッドを実装し、ProjectileData** の生成と操作に使用されます。これらのメソッドは、状態権限と入力権限の両方で FixedUpdateNetwork から呼び出され、プレハブインスタンスではなくプレハブ上で直接 呼び出されます

public abstract ProjectileData GetFireData(NetworkRunner runner, Vector3 firePosition, Vector3 fireDirection);
public abstract void OnFixedUpdate(ProjectileContext context, ref ProjectileData data);
Note: Projectile は NetworkBehaviour ではないので、NetworkObject とは関連付けられませ ん。そのため、GetFiredDataOnFixedUpdate で使用するネットワークデータは、すべて ProjectileData 構造体に含める必要があります。

2) Projectileインスタンスは、投射物の視覚的表現としても使用されます。これにより、移動コードのような FUN (シミュレーション) と Render の機能を共有することができます。Projectileインスタンスに対して実行されるメソッドは Activate, OnRender, Deactivate で、純粋に視覚的なものです。

public void Activate(ProjectileContext context, ref ProjectileData data)
{
    PrefabId = data.PrefabId;
    IsFinished = false;

    OnActivated(context, ref data);
}

public void Deactivate(ProjectileContext context)
{
    IsFinished = true;

    OnDeactivated(context);
}

public virtual void OnRender(ProjectileContext context, ref ProjectileData data)
{
}

public virtual void Discard()
{
    IsFinished = true;
}

Discardメソッドをオーバーライドすることも可能です。(例えば、Dissolveエフェクトを再生するために)発射物がサーバー上で発射されなかった場合、予測が外れた場合のカスタム動作のために使用します。

すべての発射物は、新しい NetworkObject (例: 爆発) と同様に、衝撃時にビジュアルエフェクトをスポーンすることができます。

トップに戻る

発射物の種類

Fusion Projectilesには、一般的なシナリオで使用することができるいくつかの発射物があります。

ヒットスキャン発射物

Also known as Raycast or Instant projectiles

指定された最大距離を持つレイキャストで、発射入力時に即座に発射され、ヒットは即座に評価されます。

InstantHitscanProjectile
武器の銃身からターゲット位置までの視覚的な軌跡を表示することができます。軌跡は時間が経つと消えます。
武器の例 スナイパー(消える軌跡)、ショットガン(即座に可視化)

Sniper
砲身から着弾までの軌跡を再現したヒットスキャン投射物

FlyingHitscanProjectile 命中は即座に処理されるが、指定された速度でターゲット位置まで移動するダミーの飛行弾がある。 武器の例 :ライフル

Rifle
ダミー弾を飛ばすヒットスキャン投射物

トップに戻る

キネマティック投射物

Also known as just Projectile

時間と共に移動し、シミュレーションティックごとに前の位置と新しい位置の間で短いレイキャストを実行する投射物。

SimpleKinematicProjectile 直線的に飛行するキネマティック投射物。 武器の例:パルスガン

Pulse Gun
キネマティック投射物

AdvancedKinematicProjectile
重力の影響を受け、壁や他のオブジェクトに跳ね返ることができるキネマティック発射物。この発射物タイプでは、複数の発射物の挙動を管理することができます。

  • タッチで爆発する落下投射物
    武器の例 :パルスガン(代替弾:グレネード

  • 落下してバウンドし、しばらくすると爆発する発射物
    武器例 :ライフル(代替射撃:グレネード

  • 直進性の高い発射物 武器の例 :跳弾銃

Ricochet Gun
跳弾銃の跳ね返り投射物

HomingKinematicProjectile
能動的に回転して目標に命中する投射物。移動するターゲットに当てるために、ターゲットの位置を予測することができる。ターゲットとなる体の部位、旋回特性、ターゲットシークの動作を指定することが可能。 武器の例 :ホーミングガン(高速ホーミング弾の主砲、低速リターゲティング弾の副砲 - ロケット )。

Homing Gun
ホーミングガンの投射物

トップに戻る

光線

Also known as Beam or Laser

時間経過とともにダメージを与える一定の光線です。光線は武器コンポーネント WeaponBeam を使って実装されています (詳細は 武器コンポーネント セクションを参照してください)。このプロジェクトでは実際には投射物ではありません。 武器の例:レーザー銃

Laser Gun
レーザー光線

トップに戻る

スタンドアローン投射物

スタンドアロンネットワークオブジェクトとして生成できる投射物です。特殊な状況でのみ使用する必要があります。Choosing The Right Approach の項も参照してください。

DataStandaloneProjectile。 標準的な射影機機能のラッパーです。ProjectileManager と同じように ProjectileData を作成・更新しますが、1つの投射物に対してのみ行います。予測的に生成することができる。 武器の例:跳弾銃(代替射撃 - Bouncing Drop)

トップに戻る

投射物の補間

一人称視点のゲームで投射物を発射するとき、投射物の計算を銃身から直接行うか(現実的な方法)、カメラの中心から行うか(標準的な方法)を選択することができます。

備考: リアルなアプローチは、いくつかの(ハードコアの)ゲームで使用されています。これは発射をよりリアルに感じさせますが、安定性に欠け(発射位置がプレイヤーのアニメーションに依存する)、武器がカメラからオフセットされているため不要なヒット(コーナー問題)が発生しやすくなります。

Fusion Projectilesは、カメラ中心から発射するという、より標準的なアプローチを採用しています。しかし、この方法では、シミュレーションされた軌道(カメラを起点)とレンダリングされた軌道(武器樽を起点)の間に不一致が生じます。この問題は、武器樽から実際の発射経路まで、発射位置の時間的変化を補間することで解決されます。補間値(補間時間、補間しやすさ)は、すべての運動学的発射物に対して設定することができます。

Projectile interpolation
トップダウンビューからの投射物補間

Kinematic projectile setup
キネマティック投射物の設定

備考: 投射物の補間はキネマティック投射物のみに必要です。投射物がどこに衝突するかはすでに分かっているので、ダミー飛行ビジュアルはそのポイントに直接移動できるため、ヒットスキャン投射物には補間が必要ありません。

トップに戻る

武器

概要

Fusion Projectilesには、小さな武器処理システムが含まれています。基本的な実装は、武器の切り替えのみです。武器のドロップ、ピックアップ、リロード、リコイルパターン、動的分散など、より詳細な使用方法については、Fusion BR サンプルを参照してください。

しかし、あらゆる武器を管理するために、便利な武器アクションコンポーネントシステムが搭載されています。

トップに戻る

武器アクション

武器アクションは、1つの武器アクションを表す 武器コンポーネントのセット です。ある武器アクションは、例えば標準的な射撃で、他のアクションは代替射撃です。武器はさまざまな武器アクションを持つことができます。

Weapon Action
パルスガンの主要武器アクションと必要な武器コンポーネントのすべて

トップに戻る

Weaponコンポーネント

Weaponコンポーネントは、独自のロジックを持つ武器の一部を表し、異なるシナリオで再利用することができます。武器は、複数のコンポーネントで構成され、必要な機能を形成することができます。Fusion Projectilesには、いくつかの武器コンポーネントが付属しています。

-WeaponMagazine - 弾薬を供給する。 - WeaponTrigger - 武器の発射タイミングを指定します(プレイヤーの入力を確認し、武器のタイミングを制御します)。 - WeaponBarrel - 弾丸を発射します。 - WeaponFireEffect - 銃口の表示、発射音の再生、ノックバックの適用、カメラのシェイクを開始します。 - WeaponBeam - 連続したビームを発射します。

Weaponコンポーネントは、 WeaponDesires 構造体を通して緩やかに結合されています。

備考: 様々な武器を作るとき、1つまたは複数のコンポーネントを交換するだけで、他のコンポーネントは再利用できるようにします。例えば、レーザー銃の場合、WeaponBarrelコンポーネントがWeaponBeamに交換されます。弾倉は弾薬を供給し、トリガーは発射タイミングを指示しますが、効果は変わりません。他の例としては、ミニガンの場合、回転する銃身が速度を得るまでに時間がかかります。この場合、標準のトリガーの代わりにDelayedTriggerコンポーネントを作成することができます。

トップに戻る

ShakeEffect

ShakeEffect ユーティリティは、武器の発射に反応してカメラの揺れ(Game シーン内の GameplayScene/SceneCamera/Shaker オブジェクト)を駆動するために使用します。このエフェクトは WeaponFireEffects コンポーネントからトリガーされ、位置と回転のブレ幅を設定することができます。ShakeEffect ユーティリティは、異なるカメラの揺れのスタックと連続した揺れ(連続発射)をサポートしています。

Camera shake
カメラの揺れの設定

トップに戻る

HP&ダメージシステム

ヒットの同期には、投射物データに似たアプローチが使用されます。ヒット数はネットワークに接続された小さな Hit 構造体の円形バッファに格納されます。

public struct Hit : INetworkStruct
{
    public EHitAction Action;
    public float      Damage;
    [Networked, Accuracy(0.01f)]
    public Vector3    RelativePosition { get; set; }
    [Networked, Accuracy(0.1f)]
    public Vector3    Direction { get; set; }
    public PlayerRef  Instigator;
}

Hit 構造体から、適切なヒットリアクションを構築することができます。例えば、ヒットアニメーションを再生する、ヒットした方向をUIに表示する、ヒット確認とダメージインストラクターへの数値を表示する、血のエフェクトを生成する、などです。

備考: ヒットのRelativePositionが絶対位置ではなく、Hitデータに格納されていることに注意してください。プロキシの位置はサーバーから受信した最後の2ティックの間で補間されるため、血しぶきなどのヒットエフェクトをボディに正しく配置するには相対位置が適しています。

トップに戻る

ゲームプレイ要素

爆発

一定の半径内にダメージを与える単純なNetwork Object

Explosion

トップに戻る

ダメージエリア

このエリア内にいるすべてのターゲットに時間経過でダメージが適用されます。ダメージを確認するために使用します。

Damage Area

トップに戻る

Ragdoll

エージェントの死のアニメーションは、エージェントが死ぬときにリジッドボディ物理を有効にするだけで処理されます。スクリプト SimpleAgentRagdoll を参照してください。

Ragdoll

トップに戻る

Turret

SimpleTurretは単体の投射物をある程度の間隔でスポーンするために使用されます。ターゲット探索のロジックはなく、ターゲットに向かって回転することもありません。プレハブ Agent の外にある武器のテストに使用します。

Turret

トップに戻る

ゲームコア

GameManager

接続されたプレイヤーの参加と離脱を処理し、Playerプレハブを生成します。再接続のためにプレイヤーデータを保存するなど、より詳細な接続プレイヤーの処理については、Fusion BR サンプルを参照してください。

トップに戻る

Gameplay

GameplayAgent プレハブのスポーン/デスポーンを担当します。この基本的な実装は、エンドレスデスマッチとして動作します。デスマッチ、キャプチャーザフラッグ、エリミネーションなど、様々なゲームプレイ機能を追加するために継承・拡張することができます。

トップに戻る

プーリング

投射物を扱うプロジェクトでは、大量のオブジェクトがスポーンすることが予想されます (投射物、マズルエフェクト、インパクト、ヒットエフェクトなど)。新しいオブジェクトのインスタンス生成には負荷がかかるため、Fusion Projectilesでは全てのオブジェクトがプールされています。

プールには、以下の2つのタイプがあります:

  • NetworkObjectPoolNetworkObject をプールするために使用されます。NetworkObjectPoolを動作させるには、INetworkObjectPoolインターフェースを実装し、NetworkRunnerの起動時に起動パラメータとして割り当てる必要があります(これは CustomNetworkDebugStart スクリプト内で行われます)。詳しくは、FusionマニュアルのNetwork Object Pool の項を参照してください。

  • ObjectCacheは、インパクトエフェクトのようなネットワークに接続されていないオブジェクトに使用できる、一般的なGameObjectプールです。また、遅延時間を指定してオブジェクトを返す便利な機能もあります。

トップに戻る

Scene と SceneContext

Scene は、UI、カメラ、音楽、ミニマップなど、シーン特有の機能やサービス (SceneService) を扱います。シーンサービスはここから手動で更新されるため、プロジェクトに必要なタイミングで初期化、アクティブ化、非アクティブ化、更新を行うことができます。

SceneContext は、コードベース全体で必要とされる共通のサービスやその他の情報への、静的なアクセスを安全に提供します。SceneContextは自動的にシーンサービスに渡され、また GameplaySceneNetworkObjectPool のネットワークオブジェクトに割り当てられます。SceneContextへのアクセスが必要な場合は、NetworkBehaviourSimulationBehaviour ではなく、ContextBehaviourContextSimulationBehaviour から継承してください。

トップに戻る

プロジェクトの拡張

新しい武器の追加

1) 新しいプレハブを作成するか、既存の武器を複製します。

2) プレハブに少なくとも1つの WeaponAction コンポーネントと適切な武器コンポーネントが存在することを確認します。WeaponAction コンポーネントと武器コンポーネントはひとつの GameObject 上に配置することもできますが(Sniper プレハブ参照)、複数の武器アクションがある場合は階層的に配置する必要があります(Rifle プレハブ参照)。

3) Weapon コンポーネントの WeaponSlot を設定し、プレイヤーの武器配列の中でどの場所を占めるかを指定します - Slot 1 は最初に表示される武器です。

4) オプションで、武器の名前とアイコンを Weapon コンポーネントに設定します。

5) プレハブAgentWeaponsコンポーネントのInitial Weaponsフィールドに、武器を割り当てます。

Weapons inspector

トップに戻る

新しい投射物を追加する

1) 新しいプレハブを作成するか、既存の Projectile を複製します。Projectileを継承したコンポーネントがあることを確認します。

2)投射物のプレハブを、WeaponBarrel コンポーネントの武器のプレハブに割り当てます。

WeaponBarrel inspector

3) 投射物を制御するオブジェクト(例:Agentプレハブ)の ProjectileManager に投射物のプレハブを割り当て、発射時に投射物を投げるようにします。

トップに戻る

三人称視点に切り替える

Fusion Projectiles は FPS ゲームとして作られていますが、ほとんどの機能は TPS ゲームにも適用されます。TPSゲームで発射する場合、まずカメラからの光線を投げて、プレイヤーが撃とうとしている地点を見つけます。実際の投擲は、キャラクターの位置(通常はキャラクターの肩付近の固定位置が有効)から、カメラキャストで得られたポイントに向かって行われます。通常、いくつかのトリック(2回目の投射でいくつかの衝突を無視するなど)があり、プレイヤーは不要なオブジェクトにあまり当たらないようにします(角の問題)。TPSの処理例として、Fusion BR を参照してください。


ドキュメントのトップへ戻る