価格が理由で Photon 経由で Unity を介してネットワーキングを行うことに決めました (ネットワーキングのより良い方法があれば教えてください)。ユーザーがゲームに入ると最初に他のマッチ ( AKA ルーム / ゲーム) がある場合は参加し、ない場合は作成します。しかし、ユニティマッチメーカーの使用方法の明確な説明を見つけるのに苦労しているので、最近の更新でユニティがネットワークシステムを大幅に変更しているように見えるので、コードを開発して目的の動作を取得することができます。 5.4 は現在古くなっています。私が見つけた唯一の有用なものはこのサンプルコードですが、システムをもっと理解したいので、重要な概念を見逃すことはありません。
今日私があなたに尋ねているのは、現在の統一に関連するマッチメイキング システム (スクリプトを含む) の明確な説明に私を導くことができるか、それとも、明らかにはるかに難しく、より時間がかかることですが、自分でやってみることができますか?私のような他の人の今後の参考になります。
読んでいただきありがとうございます。もちろん、どんな回答でも大歓迎です。
[私はC#で働いています]
編集:
私の質問に答えるのが非常に難しいことは理解しています。そのため、目的の動作が得られるまでサンプル コードをテストし、解決できないエラーを投稿します。
問題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");
}
}
}
ありがとうございます。
@プログラマー