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
@interface DVIGlobalBrowser : NSObject
+ (void)show;
+ (void)dismiss;
@end
/////////////實現代碼////////////////////////
#import DVIGlobalBrowser.h
#import
#import MWPhotoBrowser.h
#import MWPhoto.h
static DVIGlobalBrowser *sharedInstance = nil;
@interface DVIGlobalBrowser ()
{
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 )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 )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);
}
}
}