遂にオンラインゲーム化まで来ました!
が、まずは今から作る物をイメージしてみましょう。
ゲーム的には以下のようなものを作ります。
Chapter5まではオフラインで動くゲームでしたが、今回からオンラインで動くように設定していきます。
オンラインで動くように設定するためには以下の2点を設定する必要があります。
- ゲームを管理するオブジェクトの作成
- Playerオブジェクトの設定とプレハブ化
ゲームを管理するオブジェクト
今回のゲームではプレイヤーがログインすると同時にプレイヤーキャラクターのオブジェクトを生成し動けるようにしなければなりません。
なので、プレイヤー接続時に操作するキャラクターを生成するオブジェクトを作成します。
仮にこのオブジェクトの名前をゲームを管理するのでGameManagerと名づけます。
GameManager.csのソースコード
GameManagerに以下のGameManagerScriptをアタッチします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Collections; using UnityEngine; using UnityEngine.SceneManagement; public class GameManagerScript : Photon.PunBehaviour { //誰かがログインする度に生成するプレイヤーPrefab public GameObject playerPrefab; void Start() { if (!PhotonNetwork.connected) //Phootnに接続されていなければ { SceneManager.LoadScene("Launcher"); //ログイン画面に戻る return; } //Photonに接続していれば自プレイヤーを生成 GameObject Player = PhotonNetwork.Instantiate(this.playerPrefab.name, new Vector3(0f, 0f, 0f), Quaternion.identity, 0); } // Update is called once per frame void Update () { } } |
GameManagerScriptはScene battleが読み込まれた直後に処理が開始されます。
つまり、Scene battleが読み込まれた直後に自プレイヤーを作成します。
Playerオブジェクトの設定とプレハブ化
Playerオブジェクトのオンライン化設定は以下の手順を行います。
- PhotonViewコンポーネントを追加します。
- PhotonTransformViewを追加します。
- PhotonAnimatorViewを追加します。
- CharacterControlScriptのUpdate関数までのコードを以下のように変更します。
- unitychanのinspectorビューを以下の画像のように設定します。
変更後のCharacterControlScript.csのソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CharacterControlScript : MonoBehaviour { //オンライン化に必要なコンポーネントを設定 public PhotonView myPV; public PhotonTransformView myPTV; private Camera mainCam; //移動処理に必要なコンポーネントを設定 public Animator animator; //モーションをコントロールするためAnimatorを取得 public CharacterController controller; //キャラクター移動を管理するためCharacterControllerを取得 //移動速度等のパラメータ用変数(inspectorビューで設定) public float speed; //キャラクターの移動速度 public float jumpSpeed; //キャラクターのジャンプ力 public float rotateSpeed; //キャラクターの方向転換速度 public float gravity; //キャラにかかる重力の大きさ Vector3 targetDirection; //移動する方向のベクトル Vector3 moveDirection = Vector3.zero; // Start関数は変数を初期化するための関数 void Start () { if (myPV.isMine) //自キャラであれば実行 { //MainCameraのtargetにこのゲームオブジェクトを設定 mainCam = Camera.main; mainCam.GetComponent<CameraScript>().target = this.gameObject.transform; } } // Update関数は1フレームに1回実行される void Update () { if (!myPV.isMine) { return; } moveControl(); //移動用関数 RotationControl(); //旋回用関数 //最終的な移動処理 //(これが無いとCharacterControllerに情報が送られないため、動けない) controller.Move(moveDirection * Time.deltaTime); //スムーズな同期のためにPhotonTransformViewに速度値を渡す Vector3 velocity = controller.velocity; myPTV.SetSynchronizedValues(velocity, 0); } |
とりあえずここまでで設定は完了です。
次にプレハブ化をします。
プレハブ化(Prefab)
プレハブ化とはあるオブジェクトを再利用したいとき、そのデータをProjectビューに保存しておくことを言います。
今回のunitychanオブジェクトはプレイヤーがゲームに接続したときにGameManagerを通して生成したいのでプレハブ化をしておく必要があります。
プレハブ化の手順は以下の通りです。
- HierarchyビューのunitychanオブジェクトをProjectビューのAsset/Resourcesフォルダ内にドラッグ&ドロップ
(PlayerのプレハブはResourcesフォルダ内直下に置く必要があります) - Hierarchyビューのunitychanオブジェクトを削除(Delete)
これでunitychanのプレハブが完成しました。
最後にこのプレハブをGameManagerのPlayerPrefabにドラッグ&ドロップでセットします。
実際に動かしてみましょう!!
2つのウインドウを開き、それぞれでログインした結果です。
ほんの少しラグがありますが、2キャラが上手く同期できていることがわかります。
次回予告!!
次回は頭上に名前を表示させてみましょう!!
名前が表示されると一気にオンラインゲームっぽくなってきますよ!!