Unity调IOS相册

相对来说,IOS 的实现比Android要简单得多,但是重点是IOS不好测试,要macOS,要相应版本的xcode,建议大家不要搞虚拟机了,我搞了两天,头发一把一把的拖,最后直接放弃

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

Unity调用IOS 的相册只需要在Unity的Plugins-IOS文件夹里放两个文本文件,然后改后缀,一个改成.h  一个改成.m   名字一样没关系,咱后缀不一样,一个是C++  一个OC

.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就是这么简单粗暴

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

 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文件,加一个相册权限,之后就能真机测试了

猜你喜欢

转载自www.cnblogs.com/shawnlen/p/11813353.html