#Unity – ajouter et appeler du code natif iOS facilement #ObjectiveC

Aujourd’hui j’ai fait de l’Objective C avec Constant pour me soutenir. Nous souhaitions proposer au joueur de partager un screenshot du jeu en utilisant les fonctionnalités de partage d’iOS. Le code est facile à trouver sur internet mais il reste à l’intégrer à Unity et notre utilisation du couple C#/Visual Studio.

 

Unity nous permet d’intégrer directement du code Objective-C dans le projet sous la forme d’un plugin. On ajoute le fichier dans le bon dossier, on déclare la signature dans le code C# avec un attribut DllImport et pouf, il n’y a plus qu’à appeler la méthode !

 

La procédure en bref

Voici la procédure à suivre en détail :

  1. Crééer un fichier avec l’extension “.mm”,
  2. Ajouter ce fichier dans le dossier Plugins/iOS. En réalité cela est facultatif depuis Unity5 mais cela permet d’éviter une configuration supplémentaire et c’'est plus propre.
  3. Ajouter le code voulu
  4. Dans votre code C#, déclarez la signature de la méthode exposée dans le code IOS,
  5. Appelez la méthode en utilisant les directives de pré-compilation pour ne le faire que sur iOS

 

La code en détail

Voici déjà quelques points pour que cela marche vraiment :) :

  • Bien penser à mettre les directives “@implementation ViewController : UIViewController” et “@end” dans le code iOS;
  • Sélectionner le fichier .mm et dans l’inspecteur, ajoutez cette valeur dans le champ “compile flag” : -fno-objc-arc (merci internet)

 

Dans le code iOS on remarquera qu’il y a  2 zones, le code “pur” (si l’on peut dire cela) et une partie visible de l’éxtérieur dans une zone “extern “C”. C’est uniquement cette partie qui sera utilisable depuis Unity et elle déclare une méthode sampleMethod.

// Partage concret de l'image
-(void) shareImageMethod: (const char *) path: (const char *) shareMessage
{
    NSString *path= [NSString stringWithUTF8String:path];
 
    UIImage *image = [UIImage imageWithContentsOfFile:path];
    NSString *message   = [NSString stringWithUTF8String:shareMessage];
    NSArray *posts= @[message,image];
 
    UIActivityViewController *activityVc =
         [[UIActivityViewController alloc]initWithActivityItems:posts applicationActivities:nil];
 
    if ( [activityVc respondsToSelector:@selector(popoverPresentationController)] ) {
 
    UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:activityVc];
 
        [popup presentPopoverFromRect:CGRectMake(
                      self.view.frame.size.width/2, 
                      self.view.frame.size.height/4, 0, 0)
                      inView:[UIApplication sharedApplication].keyWindow.rootViewController.view
                      permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
    else{
 
        [[UIApplication sharedApplication].keyWindow.rootViewController 
               presentViewController:activityVc animated:YES completion:nil];
    [activityVc release];
}
}
 
 
// visible dans Unity
extern "C"{
    void shareImage(const char * imagePath, const char * message){
        ViewController *vc = [[ViewController alloc] init];
        [vc shareImageMethod: path: message];
        [vc release];
    }

 

 

Dans le code C# on va donc devoir déclarer cette méthode et sa signature avec l’attribut DllImport :

[DllImport("__Internal")]
private static extern void shareImage(string imagePath, string message)

 

Et voila, Unity va se charger de tout pour la suite en intégrant le fichier source au projet xCode final qui sera utilisé lors de la compilation sur un MAC.

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus