Unity调IOS相册

相对来讲,IOS 的实现比Android要简单得多,可是重点是IOS很差测试,要macOS,要相应版本的xcode,建议你们不要搞虚拟机了,我搞了两天,头发一把一把的拖,最后直接放弃ios

找公司的IOS配合或者看谁有mac的借来用用都比虚拟机强,话很少说,言归正传xcode

Unity调用IOS 的相册只须要在Unity的Plugins-IOS文件夹里放两个文本文件,而后改后缀,一个改为.h  一个改为.m   名字同样不要紧,咱后缀不同,一个是C++  一个OCapp

 

 

 

.h是头文件 至关于引入 接口 直接复制一下代码函数

1 #import<QuartzCore/CADisplayLink.h>
2 @interface IOSCameraController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIPopoverPresentationControllerDelegate>
3 @end

.m是实现文件,功能在这写测试

 1 #import "IOSCameraController.h"
 2 
 3 @implementation IOSCameraController  4 -(void)OpenCamera:(UIImagePickerControllerSourceType)type{  5     //建立UIImagePickerController实例
 6     UIImagePickerController *picker;  7     picker= [[UIImagePickerController alloc]init];  8     //设置代理
 9     picker.delegate = self;  10     //是否容许编辑 (默认为NO)
 11     picker.allowsEditing = YES;  12     //设置照片的来源
 13     picker.sourceType = type;  14     //展现选取照片控制器
 15     if (picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary &&[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {  16         picker.modalPresentationStyle = UIModalPresentationPopover;  17         UIPopoverPresentationController *popover = picker.popoverPresentationController;  18         //picker.preferredContentSize = [UIScreen mainScreen].bounds.size;
 19         popover.delegate = self;  20         popover.sourceRect = CGRectMake(0, 0, 0, 0);  21         popover.sourceView = self.view;  22         popover.permittedArrowDirections = UIPopoverArrowDirectionAny;  23  [self presentViewController:picker animated:YES completion:nil];  24     } else {  25         [self presentViewController:picker animated:YES completion:^{}];  26  }  27    
 28 }  29 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{  30     [picker dismissViewControllerAnimated:YES completion:^{}];  31     UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];  32     if (image == nil) {  33         image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];  34  }  35     //图片旋转
 36     if (image.imageOrientation != UIImageOrientationUp) {  37     //图片旋转
 38         image = [self fixOrientation:image];  39  }  40     NSString *imagePath = [self GetSavePath:@"Temp.jpg"];  41  [self SaveFileToDoc:image path:imagePath];  42 }  43 -(NSString*)GetSavePath:(NSString *)filename{  44     NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  45     NSString *docPath = [pathArray objectAtIndex:0];  46     return [docPath stringByAppendingPathComponent:filename];  47 }  48 -(void)SaveFileToDoc:(UIImage *)image path:(NSString *)path{  49     NSData *data;  50     if (UIImagePNGRepresentation(image)==nil) {  51         data = UIImageJPEGRepresentation(image, 1);  52     }else{  53         data = UIImagePNGRepresentation(image);  54  }  55  [data writeToFile:path atomically:YES];  56     UnitySendMessage("Canvas", "Message", "Temp.jpg");  57 }  58 #pragma mark 图片处理方法
 59 //图片旋转处理
 60 - (UIImage *)fixOrientation:(UIImage *)aImage {  61     CGAffineTransform transform = CGAffineTransformIdentity;  62     
 63     switch (aImage.imageOrientation) {  64         case UIImageOrientationDown:  65         case UIImageOrientationDownMirrored:  66             transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);  67             transform = CGAffineTransformRotate(transform, M_PI);  68             break;  69             
 70         case UIImageOrientationLeft:  71         case UIImageOrientationLeftMirrored:  72             transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);  73             transform = CGAffineTransformRotate(transform, M_PI_2);  74             break;  75             
 76         case UIImageOrientationRight:  77         case UIImageOrientationRightMirrored:  78             transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);  79             transform = CGAffineTransformRotate(transform, -M_PI_2);  80             break;  81         default:  82             break;  83  }  84     
 85     switch (aImage.imageOrientation) {  86         case UIImageOrientationUpMirrored:  87         case UIImageOrientationDownMirrored:  88             transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);  89             transform = CGAffineTransformScale(transform, -1, 1);  90             break;  91             
 92         case UIImageOrientationLeftMirrored:  93         case UIImageOrientationRightMirrored:  94             transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);  95             transform = CGAffineTransformScale(transform, -1, 1);  96             break;  97         default:  98             break;  99  } 100     
101     // Now we draw the underlying CGImage into a new context, applying the transform 102     // calculated above.
103     CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height, 104                                              CGImageGetBitsPerComponent(aImage.CGImage), 0, 105  CGImageGetColorSpace(aImage.CGImage), 106  CGImageGetBitmapInfo(aImage.CGImage)); 107  CGContextConcatCTM(ctx, transform); 108     switch (aImage.imageOrientation) { 109         case UIImageOrientationLeft: 110         case UIImageOrientationLeftMirrored: 111         case UIImageOrientationRight: 112         case UIImageOrientationRightMirrored: 113             // Grr...
114             CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage); 115             break; 116             
117         default: 118             CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage); 119             break; 120  } 121     // And now we just create a new UIImage from the drawing context
122     CGImageRef cgimg = CGBitmapContextCreateImage(ctx); 123     UIImage *img = [UIImage imageWithCGImage:cgimg]; 124  CGContextRelease(ctx); 125  CGImageRelease(cgimg); 126     return img; 127 } 128 @end
129 #if defined(__cplusplus)
130 extern "C" { 131 #endif
132     void IOS_OpenCamera(){ 133         IOSCameraController *app = [[IOSCameraController alloc]init]; 134         UIViewController *vc = UnityGetGLViewController(); 135  [vc.view addSubview:app.view]; 136  [app OpenCamera:UIImagePickerControllerSourceTypeCamera]; 137  } 138     void IOS_OpenAlbum(){ 139         IOSCameraController *app = [[IOSCameraController alloc]init]; 140         UIViewController *vc = UnityGetGLViewController(); 141  [vc.view addSubview:app.view]; 142  [app OpenCamera:UIImagePickerControllerSourceTypePhotoLibrary]; 143  } 144 #if defined(__cplusplus)
145 } 146 #endif

IOS就是这么简单粗暴atom

而后测试脚本,重点看怎么调用spa

 1 using System.Collections;  2 using System.Collections.Generic;  3 using UnityEngine;  4 using UnityEngine.UI;  5 using System.IO;  6 using System.Runtime.InteropServices;  7 using UnityEngine.SceneManagement;  8 
 9 public class TestWWWTex : MonoBehaviour { 10 
11     [SerializeField] private Button _openCamera; //打开相机按钮
12     [SerializeField] private Button _openAlbum; //打开相册按钮
13     [SerializeField] private RawImage _image; //用于显示的图片 14     //引入在oc中定义的那两个方法
15     [DllImport("__Internal")] 16     private static extern void IOS_OpenCamera(); 17     [DllImport("__Internal")] 18     private static extern void IOS_OpenAlbum(); 19 
20     void Awake() 21  { 22         //为两个button添加点击事件
23  _openCamera.onClick.AddListener(IOS_OpenCamera); 24  _openAlbum.onClick.AddListener(IOS_OpenAlbum); 25  } 26 
27     //ios回调unity的函数
28     void Message(string filenName) 29  { 30         31         
32         string filePath = Application.persistentDataPath + "/" + filenName; 33         34        
35  TestFileFunc(filePath); 36  } 37 
38     void TestFileFunc(string path) 39  { 40         FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read); 41         fileStream.Seek(0, SeekOrigin.Begin); 42         byte[] bye = new byte[fileStream.Length]; 43         fileStream.Read(bye, 0, bye.Length); 44  fileStream.Close(); 45 
46         Texture2D texture2D = new Texture2D(240, 144); 47  texture2D.LoadImage(bye); 48 
49         _image.texture = texture2D; 50 
51  } 52 }

这里说一下,www加载会找不到照片,http加载,xcode会报错,看不懂报了什么错,好像是没给权限,xcode建议用https,我就懒得搞了,直接用文件流加载吧代理

接下来就是打xcode工程 在xcode里找到info.plist文件,加一个相册权限,以后就能真机测试了code

相关文章
相关标签/搜索