前回の記事はこちら
ゲーム概要の確認
今回は、CodeFightをオンラインゲームにしていきます。
先日、私の考えていたCodeFightにとても近いCHaserというゲームがあることを知ったので、内容が被らないようにするためにゲームの概要を少し変えます。
- オンラインゲーム
- 10分間の準備時間の間にコードを書き、そのあとに動かして戦う
- 準備時間中は相手のコードを見て、自分のコードを変えることができる
- ダイヤを集めて自陣に運ぶ
- ダイヤの数が多いほうが勝ち
- 準備時間以外はコードの買い替えはできない
- 各言語の特徴(ガーネット言語、トパーズ言語、ターコイズ言語)
ガーネット言語 -> 書きやすい 遅い 関数型
トパーズ言語 -> 相手に読まれにくい 速い 書きにくい スタック指向
ターコイズ言語 -> 書きやすい 遅い 手続き型
こんな感じです。
Photonについて
Photonとは、マルチプレイゲームなどを作るときに使われることが多い製品?です。
具体的にはPUN2(PUNもあるらしいですが今回はPUN2で)というパッケージでダウンロード・インストールできます。
基本的には無料です。
Photonの登録についてはこちらのサイトを参照してみてください。
Photonに関する設定など
まずOnline.csというスクリプトを作り、カメラなどに組み込みます。
generator1とgenerator2にはそれぞれ後から説明するGenerator1プレファブとGenerator2プレファブを設定してください。
プログラムは下のようにします。
using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Realtime;
public class Online : MonoBehaviourPunCallbacks
{
private int playerCount;
public GameObject generator1;
public GameObject generator2;
// Start is called before the first frame update
void Start()
{
PhotonNetwork.ConnectUsingSettings(); //初期化っぽいやつ
}
public override void OnConnectedToMaster()
{
PhotonNetwork.JoinOrCreateRoom("Room", new RoomOptions(), TypedLobby.Default);
}
public override void OnJoinedRoom()
{
playerCount = PhotonNetwork.PlayerList.Length;
GameObject playerGeneratorPrefab;
Vector3 position;
if(playerCount == 1)
{
playerGeneratorPrefab = generator1;
position = new Vector3(-1.248901f, 3.354708f, 0); //自由に変えてください
}
else
{
playerGeneratorPrefab = generator2;
position = new Vector3(-4.968252f, -3.345594f, 0); //自由に変えてください
}
Instantiate(playerGeneratorPrefab, position, Quaternion.identity);
}
}
前回からの変更
プレファブ
まず、AssetフォルダにResourcesフォルダを作り、そこにUnitプレファブだけを移動させます。
次に、Unitプレファブをコピーして、Unit1とUnit2というプレファブにします。GeneratorプレファブもコピーしてGenerator1とGenerator2というプレファブにします。
こんな感じです。
また、Resourcesフォルダ内のプレファブすべて(Unit1とUnit2)にPhotonViewスクリプトとPhotonTransformViewClassicスクリプトをアタッチします。そして、下のような設定にしてください。
こうすることで、ユニットの位置と角度の同期ができます。
プログラム
Generator.csに
using Photon.Realtime;
using Photon.Pun;
を追加します。
あと、
GameObject newUnit = Instantiate(unit, gameObject.transform.position, Quaternion.identity);
の部分を
GameObject newUnit = PhotonNetwork.Instantiate(unit.name, gameObject.transform.position, Quaternion.identity);
に変えます。
このように、これからはInstantiate
メソッドやDestroy
メソッドの代わりに、PhotonNetwork.Instantiate
メソッドやPhotonNetwork.Destroy
メソッドを使っていきます。
ただし、Instantiate
メソッドの第一引数はGameObject
型なのにPhotonNetwork.Instantiate
メソッドの第一引数は文字列型なことに注意してください。
終わりに
プロジェクトをビルドして二つ実行すると動機ができていることが確認できます!
次回は今回に続いてオンライン系の処理を実装していきます。
次回の記事はこちら