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!