基本的には以下のMLAPIのQuick Startに従って話を進めます。
GitHubのMLAPI.unitypackageをダウンロードし、ダブルクリックしてUnityのプロジェクトにImportします。
同期するオブジェクトはCube等何でもいいですが、UnityChan使った方がそれっぽいのでオススメ。
ネットワーク管理するObjectを作る
空のGameObjectにNetworkingManager的な名前を付けて、以下の2つのScriptをアタッチします。
・NetworkingManager
・Unet Transport
そしてNetworkingManagerの下の赤線の箇所に上からそれぞれ
・PlayerとなるPrefab(同期したいPrefab、今回はUnityChan)
・NetworkingManagerGameObject
を設定します。
同期したいObjectにScriptをつける
同期したいObjectには最低限NetworkdeObjectスクリプトを付与します。
その上でプレイヤー等の位置も同期するような場合はNetworkedTransformを付与します。
さらにAnimatorも同期したい場合はNetworkedAnimatorを付与します。
Player等にNetworkedTransformを付与し忘れると、Objectが初期位置にスポーンしますが、その後の移動等が同期されないため、Playerが移動してもネットワーク先では初期位置から動いてないように見えます。
NetworkedAnimatorを使う場合はAnimatorに対象のAnimatorを指定してください。
以下の例ではUnityChanを使用したので、UnityChanObjectを指定しています。
PlayerControllerで排他処理
Prefab化したPlayerを動かす際に何も処理を行わないと、ネットワーク上の自キャラと他人の操作するキャラの区別がつかないため、同時に動いてしまいます。
なのでIsOwnerでなければ処理を行わないようにします。
基本的にUpdate系のメソッドで早期リターンすればOKです。
void FixedUpdate () // or Update()
{
if (!this.IsOwner) return;
// 動く処理
}
HostかClientかServerか
本質的にはStartServer()かStartClient()しかないと考えた方がいいです。
StartHost()はStartServer()+StartClient()と思いましょう。
別サーバーを立てずに起動中のPCがサーバーとして動きます。
とりあえずテストするだけであればUIに適当なボタンを2つ用意し、
StartHost()とStartClient()を割り当てれば機能します。
public void OnClickStartHost()
{
MLAPI.NetworkingManager.Singleton.StartHost();
}
public void OnClickStartClient()
{
MLAPI.NetworkingManager.Singleton.StartClient();
}
接続するサーバー情報はUnet Transport Scriptに書いてあります。
デフォルトではループバックアドレス(127.0.0.1)が割り当てられていますので、自動的に起動中のPCがサーバーになります。
仮にサーバーを独立して建てる場合はBuild SettingでLinux等の適切なターゲットとServer Buildを選べばOKと思われる(試してない)。
その場合、適当なObjectで実行時にStartServer()させればいいはず。
public class Server : MonoBehaviour
{
void Start()
{
MLAPI.NetworkingManager.Singleton.StartServer();
}
}
なおStartではなく止める場合はStopHost()等を使います。
Exe実行時
ここまででとりあえずローカルサーバとして機能します。
適当なフォルダにBuildしてそれぞれ実行するとこんな感じ。
コメント
[…] MLAPI を使ってみる | Once and Only […]