4

不和ボットで使用したいので、Steamworks.NET C#ラッパーを適切に使用する方法を理解しようとしています。これで、通常のコールバック メソッドを使用するほとんどの関数が動作します。同じコールバック インターフェイスを持つ 3 つのメソッドを使用しようとしたとき、壁にぶつかりました。どのメソッドもコールバックをトリガーしません。そのため、ISteamMatchmakinServersインターフェイスには、使用したい 3 つのメソッドがあります。PlayerDetails, PingServer, ServerRules応答を取得するには、これらのインターフェイスを使用する必要がありますISteamMatchmakingPingResponse, ISteamMatchmakingPlayersResponse, ISteamMatchmakingRulesResponse。Steamworks の公式ドキュメントには次のように記載されています。

You must inherit from the ISteamMatchmakingRulesResponse object to receive this callback.

Callback interface for receiving responses after pinging an individual server.

If you are destructing an object that implements this interface then you should
call CancelServerQuery passing in the handle to the query which is in progress.
Failure to cancel in progress queries when destructing a callback handler may
result in a crash when a callback later occurs.

現在、Unity を Mono スクリプトで使用し、メソッドを継承する OnEnable メソッドにインターフェイスを配置すると、これらのインターフェイスがトリガーされます。

    public void OnEnable() {
        m_ServerListRequest = HServerListRequest.Invalid;
        m_ServerQuery = HServerQuery.Invalid;

        m_ServerListResponse = new ISteamMatchmakingServerListResponse(OnServerResponded, 
                                OnServerFailedToRespond, OnRefreshComplete);
        m_PingResponse = new ISteamMatchmakingPingResponse(OnServerResponded,
                                OnServerFailedToRespond);
        m_PlayersResponse = new ISteamMatchmakingPlayersResponse(OnAddPlayerToList, OnPlayersFailedToRespond,
                                OnPlayersRefreshComplete);
        m_RulesResponse = new ISteamMatchmakingRulesResponse(OnRulesResponded,
                             OnRulesFailedToRespond, OnRulesRefreshComplete);

    }

ここで、ユーザーがコマンドを使用する場合にのみこれらのメソッドが必要になるという考えがある.serverため、上記と同じように、コマンド呼び出しの開始時に継承を配置するだけです。次に、メソッドをトリガーして応答を取得しますが、今回はコールバックが呼び出されないため、情報にアクセスできません。私のコード:

public class Commands : ModuleBase {
        CSteamID m_Lobby;
        private HServerQuery m_ServerQuery;
        private ISteamMatchmakingPingResponse m_PingResponse;
        private ISteamMatchmakingPlayersResponse m_PlayersResponse;
        private ISteamMatchmakingRulesResponse m_RulesResponse;

メソッド:

[Command("server")]
        public async Task Server(int serverNumber)
        {
            m_ServerListRequest = HServerListRequest.Invalid;
            m_ServerQuery = HServerQuery.Invalid;

            m_ServerListResponse = new ISteamMatchmakingServerListResponse(OnServerResponded, 
                                OnServerFailedToRespond, OnRefreshComplete);
            m_PingResponse = new ISteamMatchmakingPingResponse(OnServerResponded,
                                OnServerFailedToRespond);
            m_PlayersResponse = new ISteamMatchmakingPlayersResponse(OnAddPlayerToList, OnPlayersFailedToRespond,
                                OnPlayersRefreshComplete);
            m_RulesResponse = new ISteamMatchmakingRulesResponse(OnRulesResponded,
                             OnRulesFailedToRespond, OnRulesRefreshComplete);

            if (serverNumber == 422) {
                m_Lobby = (CSteamID)90130468311942151;
            }

コールバックはコマンド クラスにあります

private void OnServerResponded(HServerListRequest hRequest, int iServer) {
        Debug.Log("OnServerResponded: " + hRequest + " - " + iServer);
    }

    private void OnServerFailedToRespond(HServerListRequest hRequest, int iServer) {
        Debug.Log("OnServerFailedToRespond: " + hRequest + " - " + iServer);
    }

    private void OnRefreshComplete(HServerListRequest hRequest, EMatchMakingServerResponse response) {
        Debug.Log("OnRefreshComplete: " + hRequest + " - " + response);
    }

    // ISteamMatchmakingPingResponse
    private void OnServerResponded(gameserveritem_t gsi) {
        Debug.Log("OnServerResponded: " + gsi + "\n" + GameServerItemFormattedString(gsi));
    }

    private void OnServerFailedToRespond() {
        Debug.Log("OnServerFailedToRespond");
    }

    // ISteamMatchmakingPlayersResponse
    private void OnAddPlayerToList(string pchName, int nScore, float flTimePlayed) {
        Debug.Log("OnAddPlayerToList: " + pchName + " - " + nScore + " - " + flTimePlayed);
    }

    private void OnPlayersFailedToRespond() {
        Debug.Log("OnPlayersFailedToRespond");
    }

    private void OnPlayersRefreshComplete() {
        Debug.Log("OnPlayersRefreshComplete");
    }

    // ISteamMatchmakingRulesResponse
    private void OnRulesResponded(string pchRule, string pchValue) {
        Debug.Log("OnRulesResponded: " + pchRule + " - " + pchValue);
    }

    private void OnRulesFailedToRespond() {
        Debug.Log("OnRulesFailedToRespond");
    }

    private void OnRulesRefreshComplete() {
        Debug.Log("OnRulesRefreshComplete");
    }
4

1 に答える 1