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文件,加一個相冊權限,之后就能真機測試了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM