Unity和ios进行相册的一些交互
来源:互联网 发布:电脑必学软件 编辑:程序博客网 时间:2024/06/09 00:36
关于unity和相册交互,其实很多人写过,包括大神雨松,但小妹我的这篇绝对也是原创,由于最近这个项目中搞了好久的这东西,所以打算写出来给大家分享一下,希望对大家有所帮助。
说说ios的大概的思路吧,首先在unity打开相册也就是调用_iosOpenPhotoAlbums,然后到ios判断自己的这个应用程序是否有权限打开相册,如果没有权限,就直接调用unity这边的PickImageCallBackJPG_Base64方法,这边可以自行进行处理比如可以提示下你没权限啊去设置一下吧,当然如果你oc出身的话,可以直接在原生处理,比如跳转到设置界面,这样更友好,原谅我有限的oc知识,只能这样实现,如果有权限就要打开相册了,具体的这个方法showPicker,然后再打开相册的方法里面要初始化一些数据,选中某个视频或者图片就走imagePickerController这个方法了,info里面有选中内容,并且可以把一些数据回调给unity,比如地址等等,传回unity的只能是字符串,如果有很多个数据可以自己拼一下,或者是用jason,如果想返回的不是字符串的就要想办法变通一下了,如果不选择任何内容而是点击取消的话会走这个方法imagePickerControllerDidCancel,就关闭相册了。
我这个选中了图片的话会把数据流传到unity那边可以直接进行显示,或者保存到沙盒里面,如果选中的是视频的话,直接把路径传回到unity,可以复制到沙盒,然后进行播放或者是直接按路径把视频上传上去,这个看你具体的需求,得到路径之后,到c#这边应该很好处理了。
抱怨下oc的语法很奇怪,需要有一个.h文件具体内容如下:
@interface IOSAlbumCameraController :
UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@end
然后创建.mm文件,具体内容如下:
#import "IOSAlbumCameraController.h"
@implementation IOSAlbumCameraController
//打开相册
- (void)showPicker:
(UIImagePickerControllerSourceType)type
{
//为什么这么写呢?按照网上其他例子的写法,在打开相册之后,unity的多点触碰会被关掉,如果遇到同样问题的同学可以参考下
UIViewController *vc = UnityGetGLViewController();
IOSAlbumCameraController*picker = [[IOSAlbumCameraController alloc] init];
picker.delegate = self;
picker.sourceType = type;
picker.allowsEditing = NO;
//显示视频不写这句就不显示视频只显示图片看你自己的需求
picker.mediaTypes = [ImageTestController
availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
[self presentViewController:picker animated:YES completion:nil];
}
// 打开相册后选择照片时的响应方法
- (void)imagePickerController:(IOSAlbumCameraController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
UIViewController *vc = UnityGetGLViewController();
[self dismissViewControllerAnimated:YES completion:^{
[vc.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
}];
//获取选中类型
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
//如果选择的是视频的话
if([mediaType isEqualToString:@"public.movie"])
{
//应该就算是地址了
NSURL *VIDEOURL = [info objectForKey:UIImagePickerControllerReferenceURL];
NSString *path = [VIDEOURL absoluteString];
//返回unity了
UnitySendMessage( "_ImmortalObjects", "PickImageCallBackMOV_Base64", "100");
}
//如果选择的是图片的话
else if([mediaType isEqualToString:@"public.image"])
{
UIImage *image;
image = [info objectForKey:UIImagePickerControllerOriginalImage];
// 得到了image,然后用你的函数传回u3d
NSData *imgData;
if(image!=nil)
{
imgData= UIImageJPEGRepresentation(image,1);
NSString *_encodeImageStr = [imgData base64Encoding];
UnitySendMessage( "_ImmortalObjects", "PickImageCallBackJPG_Base64", _encodeImageStr.UTF8String);
}
}
// 关闭相册
[picker dismissViewControllerAnimated:YES completion:^{
[vc.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
}];
vc.view.multipleTouchEnabled = YES;
}
// 打开相册后点击“取消”的响应
- (void)imagePickerControllerDidCancel:(IOSAlbumCameraController*)picker
{
NSLog(@ " --- imagePickerControllerDidCancel !!");
UIViewController *vc = UnityGetGLViewController();
[self dismissViewControllerAnimated:YES completion:^{
[vc.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
}];
vc.view.multipleTouchEnabled = YES;
}
#if defined (__cplusplus)
extern "C" {
#endif
// 打开相册
void _iosOpenPhotoAlbums()
{
//判断权限
ALAuthorizationStatus author =[ALAssetsLibrary authorizationStatus];
if (author == ALAuthorizationStatusRestricted || author==ALAuthorizationStatusDenied)
{
UnitySendMessage( "_ImmortalObjects", "PickImageCallBackJPG_Base64", "没权限");
}
Else if([IOSAlbumCameraController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{
IOSAlbumCameraController * app = [[IOSAlbumCameraController alloc] init];
UIViewController *vc = UnityGetGLViewController();
[vc.view addSubview: app.view];
[app showPicker:UIImagePickerControllerSourceTypePhotoLibrary ];
}
}
#if defined (__cplusplus)
}
#endif
在unity中
Void OpenAlum()
{
_iosOpenPhotoAlbums();
}
[DllImport("__Internal")]
private static extern void _iosOpenPhotoAlbums();
void PickImageCallBackJPG_Base64(string base64)
{
if (base64 == "没权限")
{
Debug.log(“没权限”)
}
else
{
//这个t就是选中的图片了
Texture2D t = Base64StringToTexture2D(base64);
byte[] byt = t.EncodeToJPG();
}
}
void PickImageCallBackMOV_Base64(string base64)
{
//base64就是视频的地址
}
- Unity和ios进行相册的一些交互
- Unity与IOS交互,调用IOS系统相机和相册
- iOS和JS的一些交互
- {Unity} c#和iOS Objective-C交互
- Unity和iOS原生界面交互示例
- <iOS和Unity交互>之参数传递
- <iOS和Unity交互>之界面跳转
- <iOS和Unity交互>之界面跳转
- Unity和Android的交互
- unity与iOS之间的简单交互
- unity与ios交互
- iOS与Unity交互
- Unity与ios交互
- Unity与iOS交互
- [IOS]从相册获取图片和视频进行上传
- c和lua进行的一些基础交互和处理,这里留用lua5.1
- Unity和PHP的Http数据交互
- Unity和android的交互流程
- Oracle层次化查询
- Android应用性能优化之使用SparseArray替代HashMap
- s2-045漏洞分析
- 解决Installation failed with message failed to establish session
- SSM框架——使用MyBatis Generator自动创建代码
- Unity和ios进行相册的一些交互
- java WebSocket实现简单的聊天室(包括群发和点对点聊天)
- Gradient descent --梯度下降(to be continued)
- 狡猾的商人 bzoj 1202 差分约束系统
- iOS10--消息通知的基本使用
- 最佳旅游线路
- bzoj1635
- Java_常见排序算法整理
- hive与elasticsearch的数据交互