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!



  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值