Unity和iOS 数据交互(照相机)

最近公司用Unity开发项目,需要与iOS进行交互,主要是照相和验证码交互,所以写下心得,与大家互相学习。

照相机部分

unity代码:

#if UNITY_IPHONE
    [DllImport("__Internal")]
    private static extern void takePhone (int tag);


对照相方法进行声明,这里我需要传给iOS那边一个tag的参数。

#elif UNITY_IPHONE && !UNITY_EDITOR//苹果拍照
        takePhone(2);

然后再需要的位置调用苹果的拍照

*使用 [DllImport("__Internal")]需要加入命名空间

using System.Runtime.InteropServices;        //[DllImport]特性的命名空间。

当苹果拍照完成后,Unity接收图片地址方法 

public void UploadingImage(string pathFile)
    {

    }

Xcode代码:

将unity编译成iOS平台之后,我们需要添加照相机的代码

1.创建文件


由于会用到C语言,所以创建的文件需要修改成.mm结尾。

2.接收unity照相机调用方法

extern "C"{

    void takePhone(int tag)

    {

        CamerCTL *app = [[CamerCTL alloc] init];

        app.tag = tag;

        UIViewController *vc = UnityGetGLViewController();

        [vc.view addSubview:app.view];

        [app cameraOpen];

    }

}

//打开摄像头

- (void)cameraOpen{

  UIImagePickerController *imagePickerCtl = [[UIImagePickerController alloc] init];

    imagePickerCtl.delegate = self;

//    imagePickerCtl.allowsEditing = YES;//允许编辑

    [self cameraLimit];

    //判断是否可以打开摄像头

    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        imagePickerCtl.sourceType = UIImagePickerControllerSourceTypeCamera;

        imagePickerCtl.cameraDevice = UIImagePickerControllerCameraDeviceFront;//默认前置摄像头

         imagePickerCtl.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;//闪光灯默认关闭

        [self presentViewController:imagePickerCtl animated:YES completion:nil];

    }else{

        NSLog(@"摄像头打开异常");

    }

}

添加摄像头的代理方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    dispatch_queue_t queue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue, ^{

        NSString *imageDocPath = [self getImageSavePath];//保存

        UIImage *image = info[UIImagePickerControllerOriginalImage];

        image = [self OriginImage:image];

        [self FileToDoc:image path:imageDocPath];

    });

    [picker dismissViewControllerAnimated:YES completion:NULL];

}

//当用户取消相册时, 调用该方法

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

    [picker dismissViewControllerAnimated:YES completion:nil];

}

*由于在保存图片的过程中,会出现线程阻塞的情况,所以我这里使用了异步线程

//在这里创建一个路径,用来在照相的代理方法里作为照片存储的路径

-(NSString *)getImageSavePath{

//获取存放的照片

//获取Documents文件夹目录

NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentPath = [path objectAtIndex:0];

//指定新建文件路径

NSString *imageDocPath = [documentPath stringByAppendingPathComponent:@"photo.jpg"];

return imageDocPath;

}
- (void)FileToDoc:(UIImage *)image path:(NSString *)path{

    NSData *data = UIImageJPEGRepresentation(image,0.5);

    [data writeToFile:path atomically:YES];

    [self sendUnityMessage:_tag path:path];

}

//传递回Unity方法

- (void)sendUnityMessage:(int)imageType path:(NSString *)path{

    NSLog(@"图片类型为:%d",imageType);

    NSLog(@"图片地址为:%@",path);

    if (imageType == 1) {//舌头

        UnitySendMessage("MainUI", "UploadingImage", [path UTF8String]);

    }else if (imageType == 2){//舌根

    }else if (imageType == 3){//眼睛

    }else if (imageType == 4){//手

    }

}

//注解

 UnitySendMessage("MainUI", "UploadingImage", [path UTF8String]);

"MainUI"为所挂主键的名称

"UploadingImage"为unity接收的方法

[path UTF8String]为该方法的参数

这样unity和iOS的相互交互就简单的完成了

//注意

1.调用苹果照相机需要添加权限

Privacy - Camera Usage Description

2.苹果照相机可以换成中文

将Localization native development region的EN改成China

猜你喜欢

转载自blog.csdn.net/small_cap/article/details/81185563