Unity iOS保存截图到iOS相册



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!

Unity iOS保存截图到iOS相册_第1张图片


你可能感兴趣的:(Unity iOS保存截图到iOS相册)