simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

Unity:UNETの使い方2

前回は UNET を使って、LAN外からアクセスできるオンラインゲームが作れることを確認しました。
HUDのボタン表示に頼らずにゲームを起動すると
PC側はサーバーとして、Android側はクライアントとして接続する作りにしたいと思います。

参考となる記事はこちら
tips.hecomi.com


サンプルプログラムまで書かれていました。
さすが凹みさんとこの記事ですね。

起動した環境が PCなのか Editor なのか、Android なのかで切り分けることにして
起動するとそれぞれサーバーとなる、クライアントとして接続するというコード書いてみます。

下記コードで起動するとサーバー開始、クライアント接続ができることを確認しました。

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using UnityEngine.Networking.Match;

[RequireComponent(typeof(NetworkManager))]
public class NetworkConnector : MonoBehaviour
{

    public string MatchName = "UnetTest";
    public string RoomPass = "B35Fwh3";
    public uint MatchSize = 4U;

    private NetworkManager _manager;
    private NetworkMatch _match;

    // Use this for initialization
    void Start()
    {
        _manager = GetComponent<NetworkManager>();
        _manager.StartMatchMaker();
        _manager.matchName = MatchName;
        _manager.matchSize = MatchSize;
        _match = _manager.matchMaker;

        if (Application.platform == RuntimePlatform.WindowsPlayer
            || Application.platform == RuntimePlatform.WindowsEditor)
        {
            _match.CreateMatch(_manager.matchName, _manager.matchSize, true, RoomPass, _manager.OnMatchCreate);
        }
        else if (Application.platform == RuntimePlatform.Android)
        {
            _match.ListMatches(0, 20, MatchName, _manager.OnMatchList);
            StartCoroutine(JoinMatch());
        }
    }

    private IEnumerator JoinMatch()
    {
        yield return new WaitForSeconds(3);
        var desc = _manager.matches[0]; // join first room
        _match.JoinMatch(desc.networkId, RoomPass, _manager.OnMatchJoined);
        yield return 0;
    }
}

List してから Join するまで、時間を空けなければならないことに気を付けてください。
Join して良いタイミングがいつなのか、確認する方法までは調べていません。

すぐに問題になるので、確認できたら追記します。