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