最近公司用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