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

时间:2016-08-30 07:00:01

标签: c# ios xamarin xamarin.ios game-center

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网站上该教程网页的链接:

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

非常感谢。

2 个答案:

答案 0 :(得分:1)

这应该让你开始:

GKAchievement:

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

GKAchievement数组:

// 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}");
}

答案 1 :(得分:1)

我猜ypu可以这样读:

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);
            }
        });
    }
}