3

Unity3dGREEAPIを使用してゲームを作成していc#ます。私はActionリーダーボードのすべて(ユーザー名、スコア)を実行しようとしています。

コードは次のとおりです。

public static void LoadBestScoreFromFriends(Action<FriendAndScore> onComplete)
{
    Gree.Leaderboard.LoadScores(LEADERBOARD_ID,
        UnityEngine.SocialPlatforms.UserScope.FriendsOnly,
        UnityEngine.SocialPlatforms.TimeScope.AllTime,
        1,
        100,
        (IScore[] scores) => {

        foreach (IScore iscore in scores)
        {
            // Since the username is needed, a second
            // call to the API must be done
            Gree.User.LoadUser(iscore.userID, 
            (Gree.User guser) => {
                FriendAndScore friend = new FriendAndScore();
                friend.Name = guser.nickname;
                friend.Score = "" + iscore.value;

                // Run the action for every (nickname, score value)
                onComplete(friend);
            }, (string error) => {
                Debug.Log("Couldn't fetch friend! error: " + error);
            });
        }
    });
}

ここでの問題は、iscore.valueそれが常に同じであるということです。これはの最後の要素ですforeach。ループが終了しLoadUser()た後に終了するため、これは理にかなっています。foreach

そこで呼び出しを行うための2番目のメソッドを作成することを考えました。何かのようなもの:

private void GetTheUserAndCallTheAction(Action<FriendAndScore> onComplete, string userID, string score)
{
    Gree.User.LoadUser(userID, 
            (Gree.User guser) => {
                FriendAndScore friend = new FriendAndScore();
                friend.Name = guser.nickname;
                friend.Score = score;
                onComplete(friend);
            }, (string error) => {
                Debug.Log("Couldn't fetch friend! error: " + error);
            });
}

私はC#初心者なので、これを処理するより良い方法があるかどうか知りたいと思いました。

4

1 に答える 1

3

設計上 - foreach ループでラムダ式を構築し、後でこのラムダを実行するときにキャプチャがどのように機能するかを示します。

修正 - のローカル コピーを宣言IScore iscore:

foreach (IScore eachScore in scores)
{
   IScore iscore = eachScore;

And Closing over the loop variable... by Eric Lippert では、動作と関連する問題について詳しく説明しています。

于 2012-11-05T22:40:31.670 に答える