12/08/2018, 00:20

Hướng dẫn tạo plugin Unity IOS

Trong bài viết này chúng ta sẽ tìm hiểu cách tạo plugin ios trong Unity qua việc tạo 1 demo nhỏ, gọi 1 phương thức của IOS và kết quẩ trả về hiển thị trong chương trình Unity. Bước 1 – Tạo thư viện Sử dụng Xcode tạo 1 file code Objective-C++ như sau: // // IDiskSpace.mm // # import ...

Trong bài viết này chúng ta sẽ tìm hiểu cách tạo plugin ios trong Unity qua việc tạo 1 demo nhỏ, gọi 1 phương thức của IOS và kết quẩ trả về hiển thị trong chương trình Unity. Bước 1 – Tạo thư viện Sử dụng Xcode tạo 1 file code Objective-C++ như sau:

//
//  IDiskSpace.mm
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

extern "C" {
	uint64_t _iDiskSpace_FreeSpece(const char *path) {
		NSDictionary *dict = [[NSFileManager defaultManager] fileSystemAttributesAtPath:[NSString stringWithUTF8String:path]];
		NSNumber *free = [dict valueForKey:@"NSFileSystemFreeSize"];
		return [free unsignedLongLongValue];
	}
}

Function _iDiskSpace_FreeSpece() trả về kết quả là số bytes dung lượng Disk trống (free space), method nhận đầu vào là path của Data Folder trên device. Khi sử dụng code Objective C++ cần thêm extern “C” để tránh vấn đề name mangling (http://en.wikipedia.org/wiki/Name_mangling).

Bước 2 - Tạo template để gọi thư viện Tạo 1 project Unity Empty (chọn project 2D) Để gọi được thư viện ios cần tạo cây thư mục trong thư mục assets của project Unity như sau

Assets
---------Plugins
-------------------IdiskSpace.mm
---------Scenes
-------------------TestScene

(Ảnh)

Screen Shot 2015-04-26 at 11.15.14 PM.png

Bước 3 – Xây dựng lớp trung gian để làm việc với thư viện Tạo 1 class C# để làm việc với thư viện, sử dụng Visual Studio hoặc MonoDevelop Để dễ dàng cho việc sửa chữa, thêm bớt các thư viện sau này ta đặt tên class “IOSLibrary.cs”

using UnityEngine;
using System;
using System.Collections;
using System.Runtime.InteropServices;

public class IOSLibrary {

    #if UNITY_EDITOR

    #elif UNITY_ANDROID

    #elif UNITY_IPHONE
        [DllImport("__Internal")]
        private static extern long _iDiskSpace_FreeSpece(string path);
    #endif

    public static long FreeSpece {
        get {
            #if UNITY_EDITOR
                System.IO.DriveInfo[] allDrives = System.IO.DriveInfo.GetDrives();
                foreach ( var d in allDrives ) {
                    if ( ! Application.persistentDataPath.StartsWith( d.Name )  ) {
                       continue;
                    }
                    Debug.Log ( "Name " + d.Name );
                    Debug.Log ( "AvailableFreeSpace " + d.AvailableFreeSpace );
                    Debug.Log ( "TotalFreeSpace " + d.TotalFreeSpace );
                    Debug.Log ( "TotalSize " + d.TotalSize );
                    return d.AvailableFreeSpace;
                }
            #elif UNITY_IPHONE
                return _iDiskSpace_FreeSpece(Application.persistentDataPath);
            #endif

            return -1;
        }
    }
}

Để sử dụng được thư viện IOS chúng ta cần gọi đến thư viện dll mà Unity sẽ tạo ra trong quá trình biên dịch thư viện nên cần sử dụng đoạn lệnh sau

    [DllImport("__Internal")]
    private static extern long _iDiskSpace_FreeSpece(string path);

Nếu chạy chương trình trên Editor, ta cần đảm bảo quá trình gọi method không gặp vấn để gì, do vậy ở đây trả về dung lượng disk lưu trữ chương trình trên máy.

Nếu method chạy trên iOS, thì gọi tới method _iDiskSpace_FreeSpece() thực hiện, tham số truyền vào Application.persistentDataPath cho biết data path của ứng dụng.

Copy class trên vào trong thư mục Plugins bên trên để tiện cho việc tổ chức project.

Bước 4 – Tạo Scene và gọi thư viện Tạo 1 scene làm nhiệm vụ hiển thị kết quả như sau

(Ảnh)

Screen Shot 2015-04-26 at 11.16.17 PM.png

Scene gồm 1 GameObject làm nhiệm vụ gọi thư viện và show kết quả Các đối tượng UI Canvas => Text hiển thị kết quả

Để gọi thư viện và show kết quả ta tạo 1 script C# là MainScript.cs

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class MainScript: MonoBehaviour {

    public Text text;

    // Use this for initialization
    void Start () {
        Debug.Log(DiskSpace.FreeSpece);
        text.text = (DiskSpace.FreeSpece/(1024*1024)).ToString()+"MB";
    }
}

Gắn script trên vào đối tượng GameObject bất kì & kéo đối tượng text trên cửa sổ inspector để tạo tham chiếu Build Project và chạy thử chúng ta sẽ thu được kết quả:

(Ảnh)

Như vậy quá trình tạo Plugin ios đã thành công. Việc tạo các plugin mở rộng rất hữu ích trong các trường hợp các tác vụ mà UnityEngine không hỗ trợ, ví dụ như kiểm tra dung lượng sd card, dung lượng memory, trạng thái wifi ... rất dễ dàng thực hiện với Unity Engine 5!

0