UNETの使い方に苦戦中。
サーバー↔クライアントとホスト↔プレイヤーが同じスクリプトで動くというのがいまいち理解しづらい。
解説もいくらか見つけたけど、同じようなFPSの作り方ばかりだったので基本的に公式マニュアルを参考にした。
とりあえず分かったことのメモ。
テスト環境
まず新規プロジェクトからCreate EmptyでGameObjectを2つ作る。
1つ目は Network Manager(ネットワーク管理) と Network Manager HUD(テスト用UI) を追加したマネージャーオブジェクト。
2つ目は NetworkIdentity(ネットワークに必須) とテスト用スクリプトを追加したコントローラオブジェクト。
あと通信の確認用にInputFieldとボタンを配置した。
テスト用スクリプト
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
using UnityEngine; using UnityEngine.Networking; using System.Collections; using UnityEngine.UI; public class UnetCTRL : NetworkBehaviour{ public InputField in1,in2; [SyncVar] public string syncStr= "sync"; void Start(){ Debug.Log("Start."); in1.onEndEdit.AddListener( (v)=>{ input = v; }); } void Update () { //右クリックでパラメータの確認 if (Input.GetMouseButtonDown (1)) { CmdMethod(); ClientMethod(); ServerMethod(); Debug.Log(input); Debug.Log(syncStr); Debug.Log("--isLocal :"+isLocalPlayer); Debug.Log("--Auth :"+hasAuthority);//IdentifyのAuthority相当 } } //SyncVarで同期するパラメータを設定。hookで変更時のメソッド指定。 //サーバーの値が変更されるとクライアントに配信。 //クライアント側で変更すると同じ値にならない。 [SyncVar(hook = "HookMethod")] public string input = ""; public void HookMethod(string str) { Debug.Log("Hook Method"); in1.text = str; //inputと同じになるがタイミングとしてstrでないとダメ in2.text = str; //動作確認用 } //メソッド名にCmdプレフィックスが必要。 //サーバーに対してなんらかのリクエストを行う。 //プレイヤーオブジェクトからでないと実行できない。 //オブジェクトに対するLocalClientAuthorityがないと実行されない。 [Command] void CmdMethod(){ Debug.Log("Command Method"); syncStr="syncedCmd"; } //メソッド名にRpcプレフィックスが必要。 //サーバーから呼び出すとクライアントで実行する。 //クライアントから呼ぶとエラー:RPC Function RpcMethod called on client. [ClientRpc] public void RpcMethod(){ Debug.Log("RPC"); in2.text = "btn"; //動作確認用 CmdMethod(); } // ホスト(サーバー)はクライアントでもあるため全員が使える。 [Client] void ClientMethod() { Debug.Log("Client Method"); syncStr="syncedClient"; } // 呼び出してもホスト以外は実行しない。 [Server] void ServerMethod(){ Debug.Log("Server Method"); syncStr="syncedServer"; } } |
あとはビルドしたものUnityの実行画面で動作確認する。
確認したこと
サーバー→クライアントはSyncVarで共有できる。
ClientRpcでもクライアントのメソッド呼び出しができた。
しかしクライアント → サーバーがうまくいってない。
というかローカルプレイヤー → ホストが動作しない。
この辺の関係はたぶんこんな感じだと理解してるけど自信はない。
コマンドを使えばクライアントからサーバーへリクエストを送ってサーバー上で実行するはずだけど、なぜかホストでないと実行されない。
そこで コントローラオブジェクトをプレハブ化してシーンから削除。
マネージャーの Player Prefab にプレハブをアタッチして、Auto Create Player をオンにするとローカルプレイヤーとして認識されコマンドが使えるようになった。
クライアントからサーバーではなく、ローカルプレイヤーからサーバーの流れになるみたいです。
所感
プレイヤーの概念がよくわからず苦労した。
プレイヤーが通信の核だったので、その部分をきちんと理解できないと辛い。
Network Messagesでも通信可能みたいだけど殊更情報が少なくてよくわからない。
とりあえず、ようやく第一歩を踏み出せました。