🤖

Unity Photonチュートリアル その2

2021/09/18に公開

その1

3. ゲームシーン

https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/pun-basics-tutorial/game-scenes

ゲームをプレイする用のシーンを作成する。
ここでは人数に応じてフィールドのサイズが大きくなるようにする。

プロジェクトパネルからシーンを新規作成し、Room for 1という名前にする。
キューブを床と壁に配置してフィールドを作成する。

次に、ルームから退出する用のスクリプトとボタンを作成する。
ルーム退出の実装は複数のシーンで使いまわす必要があるため、プレハブとして実装する。

Game Managerという空のオブジェクトを作成し、Game Managerのスクリプトを作成してアタッチする。作成したオブジェクトをAssetsパネルにドロップしてプレハブにする。

UIメニューからボタンを選択して追加。テキストをLeave Roomにする。
ボタンのOnClickにGame ManagerのLeave関数をアタッチする。
ボタンのアンカープリセットを使うことで、画面に合わせたボタンの配置が可能になる。
今回はShift + Altを使って、top + stretchに設定する。
Leaveボタンも同様にAssetsにドロップしてプレハブ化する。

Room for 1を複製してRoom for 2,3,4を作成し、フィールドのサイズを変更する。

最後に、すべてのシーンがビルドされるようにFile -> Build Settingsを開き、Scene In Buildに作成したシーンをドロップして登録する。
この時に、起動時に初回に表示したいLauncherシーンが先頭に来るようにする。

4. ゲームマネージャとレベル

https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/pun-basics-tutorial/gamemanager-levels

参加人数に応じて#3で作成した各シーンに切り替える実装を入れる。
部屋の参加人数はPhotonNetwork.CurrentRoom.PlayerCountで取得できる。
PhotonNetwork.LoadLevel("Room for " + PhotonNetwork.CurrentRoom.PlayerCount);
をコールして、Room for Xのロードを行う。
LoadLevelのメソッドは必ずMasterのクライアントが実行することに注意する。
自分がマスターであるかはPhotonNetwork.IsMasterClientで確認ができる。
次に、LauncherスクリプトのOnJoinedRoomを編集して、Room for 1に入室する処理を追加する。

この状態で実行し、Playを押すとルームに入り、Leaveでルームから退出できるようになる。しかし、今のままだと、Launcherに戻って着たタイミングで再度ルームに入室してしまう。

ログを見るとLeaveした直後にOnConnectedMasterがコールされていることがわかる。
これを回避するために、OnConnectedMasterで接続状態を評価して、接続中にのみルームに入室するようにする。

5. プレイヤー

https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/pun-basics-tutorial/player-prefab

ユーザが操作するためのプレイヤーを追加する。
プレイヤーの実装をするときは、空のシーンを作成してオンライン環境や実際の環境でなくても動作できるようにテスト用のシーンを用意しておくと便利。
プレイヤーのオブジェクトはプレハブとして作成する。

ネットワーク上でオブジェクトをインスタンス化する場合はResourcesにいる必要がある。
Resources内のプレハブが名前が重複すると最初に見つけたプレハブを使用するので注意が必要。
今回はデモ用のfbxを使用して実装を進める。

ResourcesのフォルダとScenes内に開発用の空のシーンを作成する。
Robot Kyleをシーンに追加して名前をMy Robot Kyleに変更する。
My Robot KyleをResourcesフォルダにドロップしてプレハブとしてプロジェクトに登録する。

My Robot KyleのコンポーネントにCharactorControllerを追加する。
My Robot Kyleをダブルクリックして正面からのViewに切り替える。
インスペクタのCharactorControllerにあるパラメータを修正して、Colliderが中央に来るように調整する。

プレハブの内容に変更を加えた場合は、プレハブのインスペクタの右上にある、OverridesのプルダウンからApply Allを選択してプレハブ全体に反映させることができる。

fbxのアセットはアニメーターグラフを使って制御する。今回はデモ用のアニメーターグラフを使う。
AnimatorのControllerにKyle Robotを指定する。
指定したらAplly Allでプレハブに反映させる。

次に、Animator Controllerを使用してプレイヤーを動かす。
Animator Controllerでは、Speed, Hi, Direction, Jumpの値を任意の値に変えてオブジェクトを制御できる。例えば、前に進みたい場合は、Speedを正の値に設定する。
PlayerAnimatorManagerを作成して実際に制御を行う。

GetComponentでAnimatorコンポーネントを取得。
InputGetAxisで水平、垂直方向の入力を取得して、animate.SetFloat("Speed", value)で設定することができる。

次にプレイヤーが歩くためのフィールドを作成する。
Terrainを追加してサイズを調整。プレイヤーのプレハブをY方向に動かして、オブジェクトがすり抜けないようにする。この状態で実行し、カーソルを入力すると、プレイヤーが前進する。

プレイヤーを旋回させるためには、SetFloatでDirectionを設定する。
Horizontalの入力をDirectionに設定する。Directionの値の指定は複数の値を指定する必要がある。
1つは方向、もう1つは目標に到達するまでの速度(directionDampTime)、directionDampTimeは外部から指定できるようにSerializeFieldで定義する。
directionDampTimeを大きくすると旋回時の半径を大きくできる。

ジャンプの設定をする。ジャンプのモーションは走行中にのみできるように制御する。
GetCurrentAnimatorStateInfoを使用するとStateInfoオブジェクトを取得でき、現在のアニメーションの状態を参照できる、

今のままだと、カメラが追従せず、動かしてもフレームアウトしていくのでカメラの追従を設定する。
コンポーネントにCamera Workを設定。Follow on Startのプロパティを有効にすると、カメラが追従するようになる。
プロパティを調整することでカメラの写し方や追従の仕方を調整することができる。

プレハブにPhoton Viewのコンポーネントを追加しておく。
これにより、オブジェクトを監視対象にすることができる。

プレイヤーが攻撃できるようにビームの設定をする。
キューブを変形させて、目の位置に合わせ、ビームにマテリアルを適用し赤くする。

PlayerManagerのスクリプトを作成し、Fire1のキーの押下状態で、ビームの表示・非表示を切り替える。
PlayerManagerのスクリプトをプレイヤーのオブジェクトにアタッチする。
これで、左クリック、もしくは左側のCtrlキーでビームを出すことができるようになる。

プレイヤーに体力を設定し、ビームの当たり判定を設定する。
GameManagerのインスタンスをstaticで持つようにして、他のオブジェクトからGameManager.Instanceで参照できるようにする。
GameManagerへのアクセスが容易になる。
体力の値が0を下回ったら部屋を退出するように実装して体力の実装は完了。

その3へ続く、

Discussion