Получить всю информацию о матчах TurnBased из GooglePlayServices, плагин Unity

Я использую код TicTacToss в качестве основы для пошаговой игры на Android в Unity, используя это: https://github.com/playgameservices/play-games-plugin-for-unity

Все работает отлично, но нет функциональности для возврата списка игр, в которых участвует текущий пользователь, активных и завершенных. Мне это нужно для основного пользовательского интерфейса, чтобы я мог показать пользователю, в какие игры он играет, против кого и т. д. Без этого API кажется довольно недостаточным.

Кто-нибудь смог добиться этого? Мне кажется, что функциональность может присутствовать, поскольку есть функция GetAllTurnbasedMatches(), но мой C# недостаточно силен, чтобы понять, как она работает. (см. в https://github.com/playgameservices/play-games-plugin-for-unity/blob/master/source/PluginDev/Assets/GooglePlayGames/Platforms/Native/PInvoke/TurnBasedManager.cs)


person Amir Latif    schedule 18.02.2015    source источник


Ответы (1)


(дополнительная информация @ https://github.com/playgameservices/play-games-plugin-for-unity/issues/414)

Мне удалось вернуть эту работу, добавив в NativeTurnBasedMultiplayerClient.cs следующее:

public void GetAllTBMatches(Action<TurnBasedMatch, TurnBasedMatch.MatchTurnStatus> callback)
{
    mTurnBasedManager.GetAllTurnbasedMatches(allMatches =>
    {
        foreach (var match in allMatches.MatchesMyTurn())
        {
            var converted = match.AsTurnBasedMatch(mNativeClient.GetUserId());
            Logger.d("MY turn : Passing converted match to user callback:" + converted);
            callback(converted, TurnBasedMatch.MatchTurnStatus.MyTurn);
        }
        foreach (var match in allMatches.MatchesTheirTurn())
        {
            var converted = match.AsTurnBasedMatch(mNativeClient.GetUserId());
            Logger.d("Their Turn : Passing converted match to user callback:" + converted);
            callback(converted, TurnBasedMatch.MatchTurnStatus.TheirTurn);
        }
        foreach (var match in allMatches.MatchesCompleted())
        {
            var converted = match.AsTurnBasedMatch(mNativeClient.GetUserId());
            Logger.d("Completed : Passing converted match to user callback:" + converted);
            callback(converted, TurnBasedMatch.MatchTurnStatus.Complete);
        }

        callback(null, TurnBasedMatch.MatchTurnStatus.Unknown);
    });
}

public void GetAllTBInvitations(Action<Invitation> callback)
{
    mTurnBasedManager.GetAllTurnbasedMatches(allMatches =>
    {
        foreach (var invitation in allMatches.Invitations())
        {
            var converted = invitation.AsInvitation();
            Logger.d("Passing converted invitation to user callback:" + converted);
            callback(converted);
        }

        callback(null);
    });
}

Вам также необходимо отредактировать следующее в TurnBasedManager.cs

internal class TurnBasedMatchesResponse : BaseReferenceHolder {
    internal TurnBasedMatchesResponse(IntPtr selfPointer) : base(selfPointer) {
    }

    protected override void CallDispose(HandleRef selfPointer) {
        C.TurnBasedMultiplayerManager_TurnBasedMatchesResponse_Dispose(SelfPtr());
    }

    internal CommonErrorStatus.MultiplayerStatus Status() {
        return C.TurnBasedMultiplayerManager_TurnBasedMatchesResponse_GetStatus(SelfPtr());
    }

    internal IEnumerable<MultiplayerInvitation> Invitations()
    {
        return PInvokeUtilities.ToEnumerable(
            C.TurnBasedMultiplayerManager_TurnBasedMatchesResponse_GetInvitations_Length(SelfPtr()),
            index => new MultiplayerInvitation(C.TurnBasedMultiplayerManager_TurnBasedMatchesResponse_GetInvitations_GetElement(SelfPtr(), index)));
    }

    internal IEnumerable<NativeTurnBasedMatch> MatchesMyTurn()
    {
        return PInvokeUtilities.ToEnumerable(
            C.TurnBasedMultiplayerManager_TurnBasedMatchesResponse_GetMyTurnMatches_Length(SelfPtr()),
            index => new NativeTurnBasedMatch(C.TurnBasedMultiplayerManager_TurnBasedMatchesResponse_GetMyTurnMatches_GetElement(SelfPtr(), index)));
    }

    internal IEnumerable<NativeTurnBasedMatch> MatchesTheirTurn()
    {
        return PInvokeUtilities.ToEnumerable(
            C.TurnBasedMultiplayerManager_TurnBasedMatchesResponse_GetTheirTurnMatches_Length(SelfPtr()),
            index => new NativeTurnBasedMatch(C.TurnBasedMultiplayerManager_TurnBasedMatchesResponse_GetTheirTurnMatches_GetElement(SelfPtr(), index)));
    }

    internal IEnumerable<NativeTurnBasedMatch> MatchesCompleted()
    {
        return PInvokeUtilities.ToEnumerable(
            C.TurnBasedMultiplayerManager_TurnBasedMatchesResponse_GetCompletedMatches_Length(SelfPtr()),
            index => new NativeTurnBasedMatch(C.TurnBasedMultiplayerManager_TurnBasedMatchesResponse_GetCompletedMatches_GetElement(SelfPtr(), index)));
    }

    internal static TurnBasedMatchesResponse FromPointer(IntPtr pointer)
    {
        if (PInvokeUtilities.IsNull(pointer)) {
            return null;
        }

        return new TurnBasedMatchesResponse(pointer);
    }
}
person Amir Latif    schedule 03.03.2015