如何将使用 GKAchievement 的简单方法从 Objective-C 转换为 C#?

How to translate a simple method that uses GKAchievement from Objective-C to C#?

Apple 开发者教程网站有此页面显示了如何为本地播放器报告多个成就的示例。这个方法写在Objective-C.

很遗憾,我无法理解Objective-C,我正在使用C#和Xamarin开发iOS游戏。你能把这个方法从 Objective-C 翻译成 C# 吗?

   - (void) completeMultipleAchievements
{
    GKAchievement *achievement1 = [[GKAchievement alloc] initWithIdentifier: @"DefeatedFinalBoss"];
    GKAchievement *achievement2 = [[GKAchievement alloc] initWithIdentifier: @"FinishedTheGame"];
    GKAchievement *achievement3 = [[GKAchievement alloc] initWithIdentifier: @"PlayerIsAwesome"];
    achievement1.percentComplete = 100.0;
    achievement2.percentComplete = 100.0;
    achievement3.percentComplete = 100.0;

    NSArray *achievementsToComplete = @[achievement1,achievement2,achievement3];
    [GKAchievement reportAchievements: achievementsToComplete withCompletionHandler:^(NSError *error)
             {
                  if (error != nil)
                  {
                      NSLog(@"Error in reporting achievements: %@", error);
                  }
             }];
    }
}

============================

这是 Apple 网站上该教程网页的link:

https://developer.apple.com/library/ios/documentation/GameKit/Reference/GKAchievement_Ref/#//apple_ref/occ/clm/GKAchievement/reportAchievements:withCompletionHandler:

非常感谢。

这应该让你开始:

GK成就:

//GKAchievement* achievement1 = [[GKAchievement alloc] initWithIdentifier: @"DefeatedFinalBoss"];
var achievement1 = new GKAchievement("DefeatedFinalBoss");
achievement1.PercentComplete = 100.0;

GK成就数组:

// NSArray* achievementsToComplete = @[achievement1, achievement2, achievement3];
// Using a strongly type C# Array vs. a loose typed NSArray
var achievementsToComplete = new GKAchievement[] { achievement1 };

GKAchievement.ReportAchievements 可以使用完成处理程序以 ObjC 样式处理:

//[GKAchievement reportAchievements: achievementsToComplete withCompletionHandler:^ (NSError * error)
GKAchievement.ReportAchievements(achievementsToComplete, (NSError error) =>
{
    if (error != null)
    {
        Console.WriteLine($"Error in reporting achievements: {error}");
    }
    else
    {
        // Continue on a success report code path 
    }
});

或通过 Xamarin.iOS 扩展异步方法的 C# 异步样式:

//[GKAchievement reportAchievements: achievementsToComplete withCompletionHandler:^ (NSError * error)
try
{
    await GKAchievement.ReportAchievementsAsync(achievementsToComplete);
}
catch (NSErrorException error)
{
    Console.WriteLine($"Error in reporting achievements: {error}");
}

我想你可以这样读:

public void reportAchievement(string identifier, float percentComplete)
{
    var achievement;
    try
    {
        achievement = new GKAchievement(identifier);
    }
    finally
    {
       // do nothing
    }

    if(achievement != null)
    {
        achievement.percentComplete = percentComplete;
        GKAchievement.reportAchievements( new GKAchievement[]{achivement}, (e) => {
            if (error != nil)
            {
                Console.WriteLine("Error in reporting achievements: %0", error);
            }
        });
    }
}