PhotonUnity

Photonを使ってSurvial ShooterをMultiPlya可能にするハンズオン!

こんにちは!本日はPhotonを使って、Survival ShooterをMultiでPlayできるように
改造を行って行こうかと思います。

・下準備
PhotonのアセットのインストールとPhotonの登録を行う

ここからダウンロード

Survival Shooterのインストール

ここからダウンロード

今回のハンズオンで使用するスクリプトのダウンロード

ここからダウンロード

・Assets配下に今回マルチ対戦ようにスクリプトやAssetを追加したいので以下フォルダを追加

FriendsHirataSoft
FriendsHirataSoft/Scripts
FriendsHirataSoft/Resources

・FriendsHirataSoft/Scripts配下に今回ダウンロードしたスクリプトファイルを解凍して配置します。

またスクリプトはSurvival Shooterの各種スクリプトをPhotonのマルチ対戦用に改造したものとなっており

詳細は以下になります。

■追加スクリプトの解説

FriendsHirataEnemyAttack.cs

敵攻撃のスクリプトでプレイヤーにダメージを与える処理が記載されています。

FriendsHirataEnemyHealth.cs

敵のHPを同期させるための処理が記載されています。

PhotonNetwork.room.CustomProperties [enemyHealthKey]を使って部屋に存在している敵のHPを同期します。

FriendsHirataEnemyManager.cs

PhotonNetwork.player.IsMasterClientの判定が入っていて
PhotonのMasterClientのみ敵を生成できるような処理が入っています。

FriendsHirataEnemyMoveMent.cs

敵の移動処理を行うスクリプトで

photonView.isMineがtrueでないと移動処理を弾くようになっています。

つまり、生成したプレイヤー以外では、移動処理は行わずにPhotonViewと

PhotonTransformViewのPostion同期によって移動するようにしてあります。

FriendsHirataPhotonManager.cs

ゲーム中のPhoton周りの処理をまとめるために作成したスクリプトになります。

Photonの部屋入室時にプレイヤーオブジェクトを生成したり、ゲームシーンのセットアップを行ったりします。

FriendsHirataPlayerHealth.cs

photonPlayer.SetCustomPropertiesを使って、
各プレイヤーのHPを同期させる処理が行われています。

FriendsHirataPlayerMovement.cs

PhotonView.isMine がtrueの時は、通常のキー入力による移動処理を行い
falseの時は、PhotonTransformViewのPostion同期によって移動するようにしてあります。

FriendsHirataPlayerShooting.cs

銃撃処理を行うためのスクリプトになります。

friendsHirataPlayerMovement.fireの判定が入っている場合に
銃撃を行うように変更してあります。
friendsHirataPlayerMovement.fireの判定は、
FriendsHirataPlayerMovement.cs中で
マウスボタン押下時に
PhotonNetwork.player.SetCustomPropertiesで値をセットしています。

それでは、各種スクリプトの配置が終わったところで次の説明に入ります。

(ここで実際のハンズオン中では、スクリプトを画面に写して、実際にどのような処理が行われているかの解説が入ります。)

■マルチプレイ用のPrefabの作成

・Assets/_Complete-Game/_Complete-Game.unityを開きます。

FriendsHirataSoft/Resources配下にゲームシーン上に配置されている、Playerオブジェクトの

名称をFrinedsHirataPhotonPlayerにリネームします。

そして、Assets/FriendsHirataSoft/Resources配下に今リネームしたプレイヤーオブジェクトをDDしてPrefab化しておきます。


Playerオブジェクトを新しくPrefab化

 

ゲームシーン上のFrinedsHirataPhotonPlayerは削除する

次にこれから同期用の設定を行うために、

Playerのオブジェクトにアタッチされていた、

PlayerHealth.csと PlayerMovement.csをprefabから取り除いておきます。

(インスペクターから右クリックでRemoveComponentする)

 

FriendsHirataSoft/Resources/FrinedsHirataPhotonPlayer.prefab
にPhoton同期用のスクリプトを新たにアタッチする
PhotonView.cs
ObservdComponentsにPhotonTransformViewを設定する

PhotonTransformView.cs
SyncronizePostionにチェックを入れる
SyncronizeRotationにチェックを入れる

FriendsHirataPlayerMovement.csと

FriendsHirataPlayerHealth.csをアタッチして上記のように値を設定します。

あと、味方の銃撃を同期させるために

FrinedsHirataPhotonPlayer/GunBarrelEnd

 

GunBarrelEndのオブジェクトに

FriendsHirataPlayerShootingをアタッチします。

そして、PlayerShootingをRemoveComponentしておきます。

 

 

■敵キャラクターPrefabを複製してマルチプレイように改造

Assets/_Complete-Game/Prefabs/

配下にある各敵オブジェクトをゲームシーン中にDDして一旦配置します!

↓ゲームシーンに一旦配置する!

各種オブジェクトを以下のようにリネーム

Hellephant →FriendsHirataHellephant

ZomBear→FriendsHirataZomBear

ZomBunny→FriendsHirataZomBunny

リネーム後に以下フォルダにDDして再度新規Prefab化します。

Assets/FriendsHirataSoft/Resources

配置するとこのような構成になるかと思います。

では、再配置して複製した敵のprefabをマルチプレイ用にカスタマイズしていきます。

各種敵Prefabにアタッチされているスクリプト

EnemyAttack.cs

EnemyHealth.cs

EnemyMovement.csをremove componentします。(右クリック後に出てくるメニューから選択)

代わりに、

FriendsHirataEnemyAttack.cs

FriendsHirataEnemyHealth.cs

FriendsHirataEnemyMovement.cs

をアタッチします。

また各種アタッチされたスクリプトのInspectorの値は以前にアタッチされていたスクリプトと同様の値を入れておきます。

例)FriendsHirataHellephantの場合

・敵のPrefabに

PhotonViewとPhotonTransfomViewをアタッチします。

 

 

取り急ぎ、マルチプレイ用に使用するscriptやprefabの準備はこれで完了です!

 

■ゲームシーンをマルチ対戦ように改造

Asstes/_Complete-Game/_Complete-Game.unityを開きます。

シーンを開くと以下のような形でゲームオブジェクトが配置されているかと思います。

■マルチプレイにおける敵生成用のゲームオブジェクトを作成する

ゲームシーン中の敵生成用のゲームオブジェクトの(Enemymanagerをマルチプレイように改造します。)

このようになっているEnemyManagerを以下のように設定し直します。

変更点は、EnemyManagerをFriendsHirataEnemyManagerに差し替え

Enemyの値を新たに作成した、マルチプレイ用のenemyのprefabに差し替えます。

Hellephant →FriendsHirataHellephant

ZomBear→FriendsHirataZomBear

ZomBunny→FriendsHirataZomBunny

 

■PhotonLoad中に既存シーンを停止させるようなゲームシーン構成にする

新しくPreparingObjectsをゲームシーン中に作成し、既存のSurvial Shooter全て配下に配置します。

その後、一旦PreparingObjectsは非表示にしておきます。

■PreparingObjectsが非表示のときに代わりにゲームシーンを描画したい

ので、LoadingDisplayCameraというカメラを作成し、以下のようにインスペクターの値を設定します。

■マルチプレイ制御用のコンポーネントを作成する

次に、ゲームシーン上にfriendsHirataPhotonManagerを作成して

以下のようにスクリプトをアタッチします。

ConnectAndJoinRandom.cs

Photonの部屋に自動的に接続するためのスクリプトです。
ShowStatusWhenConnecting.cs

Photonへの接続状況を表示します。

FriendsHirataPhotonManager.cs

新規追加したスクリプトになります。

インスペクターの値を上記のように設定します。

 

■実際に動かして動作確認してみます!

ここまで来ましたら、実際にゲーム上で動かして動作確認します。

ゲーム起動後にPhotonのプレイヤーがゲーム画面上にログインしてマルチプレイができていることが確認できたかと思います。

お疲れ様でした!

 

今回ハンズオンで使用したデータは以下からダウンロードできます。

こちら