你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> Unity3d的ios插件開發

Unity3d的ios插件開發

編輯: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.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);
        }
    }
}

 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved