本題
Unityでマルチプレイ通信をしたかった。一番簡単かつ手軽そうな上記サイトを参考に構築した。
スクリプト「NetworkManager.cs」
using UnityEngine;
using System.Collections;
public class NetworkManager : MonoBehaviour {
public GameObject objectPrefab;
public GameObject objectPrefab2;
public string ip = "localhost";
public string port = "5037";
bool connected = false;
public void OnServerInitialized()
{
connected = true;
Network.Instantiate(objectPrefab, objectPrefab.transform.position, objectPrefab.transform.rotation, 1);
}
public void OnConnectedToServer()
{
connected = true;
Network.Instantiate(objectPrefab2, objectPrefab2.transform.position, objectPrefab2.transform.rotation, 2);
}
public void OnGUI()
{
if(!connected)
{
GUI.Label (new Rect (40, 250, 100, 30), "HOST IP");
Rect rect1 = new Rect(100, 250, 250, 30);
ip = GUI.TextField(rect1, ip, 32);
if( GUI.Button( new Rect( 10, 10, 90, 90), "Client"))
{
Network.Connect(ip, int.Parse(port) );
}
if( GUI.Button( new Rect(10, 110, 90, 90), "Server"))
{
Network.InitializeServer(10, int.Parse(port), false);
}
}
}
void Start () {}
void Update () {}
}
正直書いた記憶がない。絶対どこかのコピペしたと思うんですけど。
サンプル実装
1.空のオブジェクトを作成し、それに上記のスクリプトを張り付ける。名前を「NetworkManager」とする。
こんな感じ。「Object Prefab」の欄はまだ気にしない。
2.適当にオブジェクトを作成する。それに「Network View」コンポーネントをつける。「Add Component>Miscellaneous>Network View」でできる。
赤いカプセル「Player1」と緑色のカプセル「Player2」を作成。
「Player1」はこんな感じ。「Network View」コンポーネントをつける。もちろん「Player2」にもつける。
「Player1」と「Player2」はプレファブにし、Hierarchyビュー上から消しておく。
この際、各Positionの値はカメラに映るように設定しておくこと。
3.「Network Manager」の「Object Prefab」に「Player1」を設定する。
上記の1節のような設定にする。
「Object Prefab」には「Player1」を、「Object Prefab2」には「Player2」を設定する。
4.ビルドして実行する。
名前は「test.exe」とでもして、実行する。
実行すると、このような画面になる(真ん中の白いオブジェクトは便宜上作成した)。
さて、ここから実際に通信できているのか確かめるのだが、1つのPC上で確認するため、IPアドレスはlocalhostのままで実行する。
あとたぶんいろいろ警告が出たりすると思われるが、自己責任の上、実行してください。
5.「Server」を押す。
赤いカプセル「Player1」が生成されたのがわかる。スクリプトでいう「OnServerInitialized()」が実行され、「Player1」がインスタンス化されたからである。
6.もう一度実行ファイルを実行する。
今実行している画面は消さずに、もう一度「test.exe」を実行する。
7.今度は「Client」を押す。
たぶん何も変化がないと思われるが、立ち上げている2つの画面を交互にクリックしていくと緑のカプセル「Player2」も生成されるはず。これは一つのPC上で立ち上げていることが原因らしい。
こんな感じになったら成功。
両方の画面で緑の「Player2」が作成されていれば、両画面で通信ができている証拠。
注意点
うまくいかない場合は、ファイアウォールが通信を妨げているか、ポートの設定がうまくいっていない可能性がある。ファイアウォールは一時的に止めておくと良いかも。あと上記スクリプトではポート番号5037となっているが、各人で接続可能なポート番号は異なるので注意。