Unity3d的ios外掛程式開發

來源:互聯網
上載者:User

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);        }    }}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.