Photon Fusion for Unityの公式サンプルBR200を触ってみた　キャラ追加編

# *はじめ*に

Photon FusionはドイツのExit Games社が開発し、GMOグローバルサイン・ホールディングス株式会社が日本展開を行っているオンラインゲーム開発向けネットワークエンジンです。

過去の記事では基本的な使い方を中心に紹介してきました。しかし、ゲームの規模や参加人数の多いもの、サーバーモードに対応したゲームなど、大規模なものを目指す場合に参考にできる資料があまりありませんでした。

しかし2022年9月、サーバーサイドも含めた完全に動作するサンプルプロジェクトが無料公開されました。それがUnity社とPhoton Fusionを提供するExitGames社の2社が共同開発した、200人同時参加可能なバトルロイヤルゲームのBR200です。

https://doc.photonengine.com/ja-jp/fusion/current/game-samples/fusion-br/overview

前回の記事では、サーバーモードの導入方法やその注意点などについてまとめました。

[Unityで最大200人バトロワを実現するサンプル「BR200」を触ってみた　基礎編](https://qiita.com/nimushiki/items/dde8614c8173cd6537e0)

本記事では、そのBR200をカスタムし、自分の好きなキャラクターモデルをプレイアブルにする方法についてまとめました。

### 前提記事

Photon Fusionの基本的な解説は別記事で行っています。詳しく知りたい方は以下のリンクからご参照下さい。

[Photon Fusion for Unityの導入手順とPUN2との機能比較](https://qiita.com/nimushiki/items/d6fe4f0cbe0437677fa8)

関連記事

[https://qiita.com/tags/photonfusion](https://qiita.com/tags/photonfusion)

### 動作確認環境

Windows 10 Home 21H2

Unity 2021.3.5f1

BR200 Version 1.0.1

### BR200を試すための事前準備

BR200は無料ダウンロード可能かつ実行も可能なプロジェクトです。サーバーモードを使わず、最低限実行するだけであれば以下の準備をすれば可能です。

- Unity 2021.3.5f1　以降を使用
- 空プロジェクトを作成、UnityAssetStoreからBR200をインポートする
- Photonの公式サイトでの登録作業
    - 会員登録をしておく
    - ダッシュボードからBR200用のAppIDを取得して設定する

# キャラクターの追加

## 改造について

BR200の改造については公式のドキュメントがあるため、それを参考にしました。

キャラクターの追加の他、シーンの追加、武器の追加、弾の追加の全4項目について解説があります。

https://doc.photonengine.com/ja-jp/fusion/current/game-samples/fusion-br/expanding

## キャラクターの追加準備

キャラクターを追加する作業を始める前に、２つ注意する点があります。

### URPに対応したモデルを用意する

BR200はURPを採用しています。

URPは比較的新しい描画方式で、従来のシェーダーと互換性がなく、”URP対応”を謳っているキャラモデルを用意する必要があります。例えば、従来からあるUnity公式のユニティちゃんは対応しておらず、正しく表示できません。

対応しているか不明でも、標準のシェーダのみ使っているならば公式の機能であるレンダーパイプラインコンバータで変換できることもあります。

https://docs.unity3d.com/ja/Packages/com.unity.render-pipelines.universal@14.0/manual/features/rp-converter.html

### プリセットのアニメーションは利用しにくい

通常、人間型のキャラクターのリグ及びアニメーションはHumanoidで作ります。Unityアセットストアで手に入るものは恐らくほとんどそうだと思います。

しかしBR200ではGenericを前提としています。これは、Humanoidの処理が重く多人数プレイではパフォーマンスに影響が出るためです。

このことによる大きな影響は、プリセットのアニメーションを利用しにくいところです。

設定でrigのHumanoidをGenericに変更することで利用することは可能ですが、ボーンの名称や角度・位置をあわせないと正常な動きにならないため、修正に手間がかかります。

なお、自前のアニメーションが用意してあり、かつ負荷に目を瞑れる場合はHumanoid型のまま動かすことが可能です。

## キャラクターの追加手順

### キャラクターの準備

まず追加したいキャラクターモデルを用意します。今回はURP対応版のユニティちゃんを利用しました。

ちなみにこのモデルはそのままでは正常に表示できないため、Unity-Chan Toon Shaderを入れ、ShaderでUniversal Render Pipeline/Toonを選択する必要があります。

キャラクターモデル

https://unity-chan.com/contents/news/3878/

Unity-Chan Toon Shader

https://github.com/unity3d-jp/UnityChanToonShaderVer2_Project/releases

参考URL

https://hakonebox.hatenablog.com/entry/2021/11/05/000230

### BR200での作業

1. Prefabの作成
    
    Assets/TPSBR/Prefabs/Agentsフォルダの中にあるAgentBaseとMenuAgentBaseの２つをベースにVariantを作成し、今後この２つのVariantで作業を行います。以降設定に迷った場合、同フォルダのMarine、Soldierと見比べるとよいでしょう。
    
    AgentBaseはゲームプレイ時に使うPrefabです。アニメーションコントローラは使用せず、AnimationLayers以下に設定されているアニメーションで制御されています。
    
    MenuAgentBaseはキャラクターセレクト画面で表示するためのprefabです。こちらはアニメーションコントローラを使用し、待機モーションだけ設定されています。
    
    Prefab作成後、NetworkProjectConfigでRebuild Prefab Tableを行い、PhotonにPrefabを登録しておきます。
    ![Rebuild Prefab Tableボタンの位置](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/13a7c70c-b27e-a96c-7ba4-e0bd145c9bf7.png)
    

1. AgentBaseの設定方法
    
    AgentBaseのVisualsRootの下に、用意したキャラクターをアタッチします。
    
    アタッチしたら、まず必要なコンポーネントを追加します。BodyPartコンポーネント（ヒットボックス）を任意の場所、数、大きさだけアタッチします。最低限一つあればゲームは動きます。アタッチしたらルートにあるHitboxRootコンポーネントでFindHitboxesをクリックし、登録します。
    
    次に、Marine、Soldierを参考に、WeaponHandleやBackHandleのGameObjectを追加します。WeaponHandleとBackHandleはそれぞれ武器を持つ・しまう位置の基準点となります。
    
    最後に、ルートオブジェクトのコンポーネントを設定していきます。CharacterとCharacterAnimationControllerのNoneになっている部分と、WeponsのSlotsを6箇所へ、対応するゲームオブジェクトへの参照を追加します。画像はユニティちゃんで設定を終えた状態ですが、わかりにくいためMarineやSoldierも参考にするとよいでしょう。

    ![Variantを作成したままの状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/55f832ae-a514-f6a9-0cfe-626bebff717e.png)

    ![ユニティちゃんを設定した状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/2d165c1d-dec3-9fcf-0c4e-469b90ecfb2e.png)
    
    画像は設定されているMarineのWeaponsコンポーネント

    ![MarineのWeaponsコンポーネントの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/4c3fb9e6-fda8-a52e-ef5d-8714f6230b46.png)
    
2. AgentSettingsの設定
    
    Assets/TPSBR/Resources/Settings/AgentSettingsのAgentに、追加するキャラの設定を追加します。
    
3. MenuAgentBaseの設定方法
    
    ルート下にキャラクターをアタッチし、必要に応じて待機アニメーションを設定します。
    

### 注意点

キャラクターのRigのAnimationTypeに応じて、以下の作業が必要になります。

- Generic運用する場合
    
    キャラクターモデルのRigのAnimationTypeをGenericに変更します。
    
    Marine、Soldierと同じになるように、ボーンの名称、角度、位置を変更します。
    ![ユニティちゃんのボーンの名前を変更する作業の途中](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/36faa19e-af76-bcc1-3bc3-f55e5221d3ae.png)
    
    ユニティちゃんのボーンの名前を変更する作業の様子です。ユニティちゃんとは基本となる軸の方向が違うようで、この向きを揃える必要があります。

    ![ボーン構造比較１](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/d3eddebf-5629-bfe3-c4ae-a0051260dff1.png)
    
    ![ボーン構造比較２](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/ac2a3c56-3588-5b33-4b5d-9a9469ead7a3.png)

- Humanoid運用する場合
    
    必要な分だけアニメーションを用意します。
    
    再生されるアニメーションはAnimationLayers以下で設定されていますが、どのタイミングで再生されるかは、〇〇state.csファイルの中に記述されているため、完全な再現は難しいかもしれません。
    
    一応、インスペクターで設定されているファイルから、ファイル名そのものやモーションを再生することでの推測は可能です。
    
    例えば以下の画像では、Element0に武器なし状態の待機モーションが、Element1に武器構え状態の待機モーションが割り当てられています。
    ![待機モーションの設定箇所](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/4886f0d2-cf7b-4033-a3d6-55d1f03fa158.png)

    

# まとめ

キャラクターの追加について、プリセットのアニメーションを流用したい場合は用意したキャラクターの編集が必要となり、それなりに手間がかかります。

しかし、既に別のゲームで実装していたりアセットストアから入手していてアニメーションも揃っている、ボーン構造がプリセットと同じなど、一定の条件が揃えば比較的容易に可能でした。

![Humanoidのまま自前の待機モーションをとるユニティちゃん](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576800/8cf2e5bd-e54d-db10-cfa3-a18960751f77.png)