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

问题描述 投票:3回答:1

我正在尝试解决并了解如何正确使用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.

现在,如果我将Unity及其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");
    }

我正在尝试解决并了解如何正确使用Steamworks.NET C#包装程序,因为我想将它与不和谐的bot一起使用。现在,大多数功能都可以使用常规的回调方法。我...

c# callback steamworks-api
1个回答
0
投票

通过每隔50毫秒运行另一个方法来使它工作,它调用SteamAPI.RunCallbacks();,现在回调已正确调用

© www.soinside.com 2019 - 2024. All rights reserved.