使用Steamworks.NET包装器时不会触发回调 - c#

我想了解如何正确使用Steamworks.NET C#包装程序,因为我想将它与不和谐的bot一起使用。现在,大多数功能都可以使用常规的回调方法。当我尝试使用具有相同回调接口的三个方法时,我陷入困境,没有一个方法触发回调。因此,在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.

现在,如果我在其Mono脚本中使用Unity并将这些接口放在继承该方法的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");
    }

c#参考方案

通过每隔50毫秒创建另一个调用SteamAPI.RunCallbacks();的方法使其工作,现在可以正确调用回调

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

Mongo汇总 - javascript

我的收藏中有以下文件{ "_id": ObjectId("54490b8104f7142f22ecc97f"), "title": "Sample1", "slug": "samplenews", "cat": …

jQuery DataTable TableTool在IE和Firefox中不起作用 - c#

我在MVC4 ASP.NET Web应用程序中使用Jquery DataTable TableTool。导出到Excel和PDF可以与Chrome完美配合。但是不能在IE和FireFox中使用。我的代码如下 dom: 'T<"clear">lfrtip', tableTools: { "sSwfP…

使用Json.NET反序列化复杂对象 - c#

我需要反序列化从grogle maps api返回的json:{ "destination_addresses": [ "Via Medaglie D'Oro, 10, 47121 Forlì FC, Italia", "Via Torino, 20123 Milano, Italia",…

提交表单后显示模式对话框 - php

提交下载文件后,我有一张表格。我要自动而不是自动下载文件..以显示模态对话框并显示下载链接。<form name="softwareform" id="softwareform" action="../downloadlink.php" method="POST" alig…