http://fairwoodgame.com/blog/archives/22今天开发了一个在Unity里将屏幕截图保存到iOS照片应用的功能,非常简单,当然,读者最好对Unity和iOS的集成有过至少一次实践经验。
首先,还是将工程分为两层——Unity层、iOS层,两者靠extern的方法(Unity→iOS)和UnitySendMessage方法(iOS→Unity)进行通信。
在iOS层,使用UIImageWriteToSavedPhotosAlbum()方法将图片保存到相册。一个应用第一次调用这个方法时会询问用户是否允许访问相册。
iOS层的代码如下
PhotoManager.h
#import <Foundation/Foundation.h> @interface PhotoManager : NSObject - ( void ) imageSaved: ( UIImage *) image didFinishSavingWithError:( NSError *)error contextInfo: ( void *) contextInfo; @end
PhotoManager.m
#import "PhotoManager.h" @implementation PhotoManager - ( void ) imageSaved: ( UIImage *) image didFinishSavingWithError:( NSError *)error contextInfo: ( void *) contextInfo { NSLog(@"保存结束"); if (error != nil) { NSLog(@"有错误"); } } void _SavePhoto(char *readAddr) { NSString *strReadAddr = [NSString stringWithUTF8String:readAddr]; UIImage *img = [UIImage imageWithContentsOfFile:strReadAddr]; NSLog([NSString stringWithFormat:@"w:%f, h:%f", img.size.width, img.size.height]); PhotoManager *instance = [PhotoManager alloc]; UIImageWriteToSavedPhotosAlbum(img, instance, @selector(imageSaved:didFinishSavingWithError:contextInfo:), nil); } @end
注意UIImageWriteToSavedPhotosAlbum()的用法,其中有一个method selector用来异步地返回结果,如例子中所示的,即是在保存完成时调用PhotoManager的实例instance上的imageSaved方法,在这个方法里可以得到结果,更可以用UnitySendMessage将结果发送回Unity层。当然如果不需要结果,则只需要_SavePhoto这一个方法就足够了,甚至不需要头文件以及PhotoManager类,这个类派生自NSObject,作用只是为了承接UIImageWriteToSavedPhotosAlbum的结果回调。
再看Unity层。
using UnityEngine; using System.Runtime.InteropServices; public class TestSavePhoto : MonoBehaviour { [DllImport("__Internal")] private static extern void _SavePhoto(string readAddr); private string _cptrAddr; private void OnGUI() { if (GUILayout.Button("_SavePhoto!", GUILayout.Height(50), GUILayout.Width(200))) { Debug.Log("_SavePhoto"); var readAddr = Application.persistentDataPath + "/" + _cptrAddr; _SavePhoto(readAddr); } if (GUILayout.Button("TakePhoto", GUILayout.Height(50), GUILayout.Width(200))) { Debug.Log("TakePhoto"); var cptrAddr = "testpic"; //捕捉地址 var readAddr = Application.persistentDataPath + "/" + cptrAddr;//读取地址,这两个地址在iOS里不一样 Debug.Log("cptr:" + cptrAddr + ", read:" + readAddr); Application.CaptureScreenshot(cptrAddr); _cptrAddr = cptrAddr; } } }
注意其中用到的两个地址(捕捉地址、读取地址,两者在iOS中不一样,其他平台的情况会在另外的文章中详述),将读取地址传到iOS层即可。
总结下来就是:
1、Unity层用Application.CaptureScreenshot()截图
2、将读取地址传给iOS层
3、iOS层用UIImageWriteToSavedPhotosAlbum保存到相册
4、处理保存结果
So easy!