Unity3d的ios插件开发

Unity3D是一个非常强大的跨平台游戏引擎,但还是也免不了需要访问平台本身的一些功能。Unity3D并没有将平台方方面面都创建对应的API,尤其是比较新的一些功能。这时需要我们自己编写本地插件来解决,本文主要介绍如何开发Unity3D的iOS本地相册插件GlobalBrowser(能够自动扫描Documents目录,并且使用照片墙展示,其中展示功能使用了一个Objective-C的开源控件MWPhotoBrowser)。

准备工作

本文使用Unity 5和Xcode 6.2进行开发,目前只有Unity 4.6和Unity 5支持arm64,并且只有Unity 5支持在插件中使用子目录。我们有三种使用Objective-C代码的方式:源码、静态库(.a)和框架(iOS 8),这一次我们选择纯源码的方式。

本地代码编写

1、新建iOS的项目PhotoBrowser,在项目目录下创建Library文件夹。

2、将MWPhotoBrowser以及所使用的其它开源代码复制到Library,并添加到Xcode项目中。

3、创建GlobalBrowser目录,然后创建DVIGlobalBrowser类。我们在这个类中实现图片浏览插件的本地代码。为了简单起见,我们只实现了几个类方法,然后使用一个静态变量保存对象。

#import <Foundation/Foundation.h>

@interface DVIGlobalBrowser : NSObject
+ (void)show;
+ (void)dismiss;
@end

/////////////实现代码////////////////////////

#import "DVIGlobalBrowser.h"

#import <UIKit/UIKit.h>

#import "MWPhotoBrowser.h"
#import "MWPhoto.h"

static DVIGlobalBrowser *sharedInstance = nil;

@interface DVIGlobalBrowser () <MWPhotoBrowserDelegate>
{
    NSArray *_photosArray;
    NSString *_photoDir;
}
@property (nonatomic, strong) MWPhotoBrowser *photoBrowser;
@end

@implementation DVIGlobalBrowser

+ (void)initialize {
    sharedInstance = [[DVIGlobalBrowser alloc] init];
    sharedInstance.photoBrowser = [[MWPhotoBrowser alloc] initWithDelegate:sharedInstance];
    sharedInstance.photoBrowser.displayActionButton = YES;
    sharedInstance.photoBrowser.displayNavArrows = YES;
    sharedInstance.photoBrowser.displaySelectionButtons = NO;
    sharedInstance.photoBrowser.alwaysShowControls = NO;
    sharedInstance.photoBrowser.zoomPhotosToFill = YES;
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
    sharedInstance.photoBrowser.wantsFullScreenLayout = YES;
#endif
    sharedInstance.photoBrowser.enableGrid = YES;
    sharedInstance.photoBrowser.startOnGrid = YES;
    sharedInstance.photoBrowser.enableSwipeToDismiss = YES;
//    [sharedInstance.photoBrowser setCurrentPhotoIndex:0];
}

+ (void)show {
    [sharedInstance loadPhotos];

    UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sharedInstance.photoBrowser];
    nc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

    UIWindow *appWin = [UIApplication sharedApplication].keyWindow;
    [appWin.rootViewController presentViewController:nc animated:YES completion:nil];

    [sharedInstance.photoBrowser reloadData];
}

+ (void)dismiss {
    [sharedInstance.photoBrowser dismissViewControllerAnimated:YES completion:nil];
}

- (void)loadPhotos {
    if (_photoDir == nil) {
        _photoDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

    }
    NSArray *array = [[NSFileManager defaultManager] subpathsAtPath:_photoDir];

    _photosArray = array;
}

- (NSUInteger)numberOfPhotosInPhotoBrowser:(MWPhotoBrowser *)photoBrowser {
    return _photosArray.count;
}

- (id <MWPhoto>)photoBrowser:(MWPhotoBrowser *)photoBrowser photoAtIndex:(NSUInteger)index {
    NSString *filename = _photosArray[index];
    NSString *path = [_photoDir stringByAppendingPathComponent:filename];

    MWPhoto *photo = [MWPhoto photoWithURL:[NSURL fileURLWithPath:path]];
    return photo;
}

- (id <MWPhoto>)photoBrowser:(MWPhotoBrowser *)photoBrowser thumbPhotoAtIndex:(NSUInteger)index {
    NSString *filename = _photosArray[index];
    NSString *path = [_photoDir stringByAppendingPathComponent:filename];

    MWPhoto *photo = [MWPhoto photoWithURL:[NSURL fileURLWithPath:path]];
    return photo;}

@end

4、由于Unity3D那边只支持C/C++的函数,我们需要再进一步封装上面的代码,并且用extern "C"导出必要的函数。

//.h文件中
extern "C" void showPhotoBrowser(void);

//.m文件中
void showPhotoBrowser(void) {
    [DVIGlobalBrowser show];
}

void dismissPhotoBrowser(void) {
    [DVIGlobalBrowser dismiss];
}

5、在iOS项目中测试DVIGlobalBrowser

接口代码编写

在Unity3d中调用Objective-C代码,最终要的是编写C#的接口。在GlobalBrowser文件夹中创建C#接口文件PhotoBrowser.cs。

public class PhotoBrowser  {
    //引入C语言中的函数
    [DllImport ("__Internal")]
    private static extern void showPhotoBrowser();

    //暴露给C#的函数
    public static void showPhotoBrowserEx() {
        //平台判断
        if (Application.platform == RuntimePlatform.IPhonePlayer) {
            showPhotoBrowser();
        }
    }
}

测试项目

在Unity3d的一个场景中加入按钮。没有使用过截屏功能的,需要注意存储路径。

using UnityEngine;
using System.Collections;

public class MyFile : MonoBehaviour {

    // Use this for initialization
    void Start () {
//      print ("Start...");
    }

    // Update is called once per frame
    void Update () {
//      print ("Update...");
    }

    void OnGUI () {
//      print ("onGUI...");

        //创建按钮,用来显示相册
        if (GUI.Button (new Rect (100, 100, 100, 100), "Button")) {
            PhotoBrowser.showPhotoBrowserEx();
        }

        //创建截屏按钮
        if (GUI.Button(new Rect(100, 220, 100, 100), "Save")) {
            var savePath = Application.persistentDataPath + "/" + (Random.value * 100) + "image.png";

            print (savePath + "<--->Capture");

            //截屏并保存图片到Documents目录
            Application.CaptureScreenshot((Random.value * 100) + "image.png");
        }
    }
}

本文档由长沙戴维营教育整理。

时间: 2024-08-26 05:59:54

Unity3d的ios插件开发的相关文章

UNITY3D与iOS交互解决方案

原地址:http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,将进酒 于 2014-2-27 11:17 编辑 "授人以鱼,不如授人以渔",以UNITY3D调用iOS版的91SDK为例,利用C# / C / OBJ-C 交互原理,本文将详细介绍UNITY3D与iOS之间交互的解决方案. 首先,打开XCODE新建一个空项目,参照91SDK开发文档将91SDK引入并进行环境配置. 配置完毕后创建一个名为"LsSdkConector

Unity3d与iOS交互开发——接入平台SDK必备技能

原地址:http://www.2cto.com/kf/201401/273337.html# 前言废话:开发手机游戏都知道,你要接入各种平台的SDK.那就需要Unity3d与iOS中Objective-C的函数有交互,所以你就需要用到如下内容: 一.Unity3d To iOS: 1.创建一个C#文件 SdkToIOS.cs 这是调用iOS函数的接口: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class SdkToIOS: Mo

Unity3D for iOS初级教程:Part 2/3

转自:http://www.cnblogs.com/alongu3d/archive/2013/06/01/3111736.html 这篇教材是来自教程团队成员 Christine Abernathy, 他是Facebook的开发支持团队的工程师.欢迎来到Unity3D for iOS系列教程的第二部分!在这个系列的第一部分中,你已经学习了Unity的一些基本技能来构建一个非常简单的项目,并把它部署到iOS设备上.在继续这篇教程之前,你要确认已阅读过第一部分.现在进入第二部分,你要添加一些功能来

Unity3D与iOS的交互设计&lt;ViewController 的跳转&gt;

原地址:http://www.aichengxu.com/article/%CF%B5%CD%B3%D3%C5%BB%AF/28797_12.html Unity3D与iOS的交互设计<ViewController 的跳转>,有需要的朋友可以参考下. 这也是第一次做这样的需求,也是公司的需要呀.做出这个真是一言难尽呀... 小弟主要不是搞iOS开发的,一直以来都是开发Android开发,只是昨天被老大叫过去做一下iOS的二维码扫描.有点iOS基础的我,只好到处搜索了.然后,二维码扫描做好了,遇

Unity3d与iOS交互开发

一.Unity3d  To  iOS: 最近要做一个商品和人体模型T台秀相关的功能,要用到Unity3D,搜集了一些资料先保存下来. 1.创建一个C#文件 SdkToIOS.cs 这是调用iOS函数的接口: [csharp] view plain copy print? public class SdkToIOS: MonoBehaviour { //平台接入开关 public static bool isOpenPlatform = false; //导入定义到.m文件中的C函数 [DllIm

Ios插件开发

Ios插件开发 http://www.exmobi.cn/course/course_26.html Android插件开发 http://www.exmobi.cn/course/course_25.html

unity3d优化IOS

1. using UnityEngine; class GarbageCollectManager : MonoBehaviour { public int frameFreq = 30; void Update()   { if (Time.frameCount % frameFreq == 0) System.GC.Collect(); } 2. 使用Strict 在你全部脚本的顶部使用 #pragma ,脚本将是强类型的,避免写代码的时候错误的类型赋值. 避免Object.Instanti

Cordova+ ios 插件开发

//ios 插件开发 //Echo iOS Plugin Example //配置 在config.xml中 <platform name="ios"> <config-file target="config.xml" parent="/*"> <feature name="Echo"> <param name="ios-package" value="C

Unity3d 与IOS 相互调用

转自:http://www.cnblogs.com/alongu3d/p/3279277.html 我用的Unity3d 4.2版本,这一节说一下IOS与U3D的交互! 首先在U3D中写个方法:这个时候导出为ios代码必须是真机,模拟器是无法调用的,转化为IOS代码后,可以看这里, 这个图只是说明我们定义的CallU3D()方法,但是返回值确并不是string类型,而是void我很奇怪,呵呵! 下面是实现这个方法, 这个实现方法写在.mm文件中就行,不一定非要在这个类中,也可以新建一个类,也行的