0

価格が理由で Photon 経由で Unity を介してネットワーキングを行うことに決めました (ネットワーキングのより良い方法があれば教えてください)。ユーザーがゲームに入ると最初に他のマッチ ( AKA ルーム / ゲーム) がある場合は参加し、ない場合は作成します。しかし、ユニティマッチメーカーの使用方法の明確な説明を見つけるのに苦労しているので、最近の更新でユニティがネットワークシステムを大幅に変更しているように見えるので、コードを開発して目的の動作を取得することができます。 5.4 は現在古くなっています。私が見つけた唯一の有用なものはこのサンプルコードですが、システムをもっと理解したいので、重要な概念を見逃すことはありません。

今日私があなたに尋ねているのは、現在の統一に関連するマッチメイキング システム (スクリプトを含む) の明確な説明に私を導くことができるか、それとも、明らかにはるかに難しく、より時間がかかることですが、自分でやってみることができますか?私のような他の人の今後の参考になります。

読んでいただきありがとうございます。もちろん、どんな回答でも大歓迎です。

[私はC#で働いています]

編集:

私の質問に答えるのが非常に難しいことは理解しています。そのため、目的の動作が得られるまでサンプル コードをテストし、解決できないエラーを投稿します。

問題1

  1. 正確なコード (簡単に参照できるように以下に含まれています) を、ネットワーク マネージャーに添付したスクリプトにコピーしました。しかし、保護レベルが原因でエラーが発生しています -

ここに画像の説明を入力

これを解決する方法について2つの理論があります-

  1. メソッド アクセサーの変更
  2. モノビヘイビアからスクリプトを派生させない

私は現在それらをテストしていますが、これを解決する方法についてのアドバイスは非常に役に立ちます。5.4 用に更新されていると言う Unity ドキュメントの間違った例のように思われるので、これを unity に報告する必要があるかどうか疑問に思います。ありがとう。

問題 2

このスクリプトを作成し、単一のネットワーク マネージャーを使用して空のゲーム オブジェクトに接続されたエディターで実行しました。コンパイラ エラーは発生しませんが、実行すると「エラー: 一致検索の失敗」がデバッグされます。これは、listmatches 関数が失敗したことを意味します。以下です -

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

public class MyMatchMaker : MonoBehaviour {
    bool done;
    // Use this for initialization
    void Start () {
        NetworkManager.singleton.StartMatchMaker();
        NetworkManager.singleton.matchMaker.ListMatches(0, 20, "Match", false, 0, 1, OnMatchList);
        Debug.Log("Searching");
    }

    public virtual void OnMatchList(bool success, string extendedInfo, List<MatchInfoSnapshot> matchList)
    {
        if (success)
        {
            if (matchList.Count != 0)
            {
                Debug.Log("Matches Found");
                NetworkManager.singleton.matchMaker.JoinMatch(matchList[0].networkId, "", "", "", 0, 1, OnMatchJoined);
            }
            else
            {
                Debug.Log("No Matches Found");
                Debug.Log("Creating Match");
                NetworkManager.singleton.matchMaker.CreateMatch("Match", 2, true, "", "", "", 0, 1, OnMatchCreate);
            }
        }
        else
        {
            Debug.Log("ERROR : Match Search Failure");
        }
    }

    public virtual void OnMatchJoined(bool success, string extendedInfo, MatchInfo matchInfo)
    {
        if (success)
        {
            Debug.Log("Match Joined");
            MatchInfo hostInfo = matchInfo;
            NetworkManager.singleton.StartClient(hostInfo);

            OnConnect();
        }
        else
        {
            Debug.Log("ERROR : Match Join Failure");
        }

    }

    public virtual void OnMatchCreate(bool success, string extendedInfo, MatchInfo matchInfo)
    {
        if (success)
        {
            Debug.Log("Match Created");

            MatchInfo hostInfo = matchInfo;
            NetworkServer.Listen(hostInfo, 9000);
            NetworkManager.singleton.StartHost(hostInfo);

            OnConnect();
        }
        else
        {
            Debug.Log("ERROR : Match Create Failure");
        }
    }

    void OnConnect ()
    {
        if (Network.isServer)
        {
            Debug.Log("You are Server");
        }
        else if (Network.isClient)
        {
            Debug.Log("You are Client");
        }
        else
        {
            Debug.Log("ERROR : MatchMaking Failed, Peer type is neither Client nor Server");
        }
    }
}

ありがとうございます。

@プログラマー

4

1 に答える 1