Hướng dẫn tạo plugin Android Native trong Unity (P2)
Tóm lược: Unity là một engine rất mạnh với các tools và framework hỗ trợ đa nền tảng (smartphones, console, Web...) Trong quá trình làm game nhiều khi chúng ta cần sử dụng các thư viện, các classes mà SDK của nên tảng cung cấp, ví dụ Android SDK để làm việc sâu hơn với hệ điều hành, điểu này ...
Tóm lược:
Unity là một engine rất mạnh với các tools và framework hỗ trợ đa nền tảng (smartphones, console, Web...)
Trong quá trình làm game nhiều khi chúng ta cần sử dụng các thư viện, các classes mà SDK của nên tảng cung cấp, ví dụ Android SDK để làm việc sâu hơn với hệ điều hành, điểu này thúc đẩy sự ra đời của các plugins viết bằng native cho Unity.
Trong phần này chúng ta sẽ cùng tìm hiểu về cách tạo plugin Android Native đối với phiên bản Unity từ 4.0 trở lên.
Thực hiện:
Trước hết ta cần phải chuẩn bị file .jar trong đó có chứa class thư viện. Chúng ta có thể tạo 1 project android của eclipse như sau:
Chúng ta cần add thư viện của Unity cho android vào để tạo được file thư viện theo yêu cầu của Unity, thư viện đó có thể tìm thấy trong thư mục cài đặt Unity
Đối với Windows: C:Program Files (x86)UnityEditorDataPlaybackEnginesandroiddevelopmentplayerinclasses.jar
Đối với Mac OS: /Applications/Unity/Contents/PackageEngines/AndroidPlayer/development/bin/classes.jar
Copy thư viện đó vào thư mục libs của project android và add vào như sau:
Sau khi add thư viện chúng ta đã có thể làm việc với các đối tượng mà Unity cung cấp
Chúng ta cần định nghĩa 1 activity để làm việc như sau:
package com.example.hellounity; import android.os.Build; import com.unity3d.player.UnityPlayerActivity; public class HelloUnity extends UnityPlayerActivity { public static String getInforString(String name){ return "Hello "+name+" System Info:"+getDeviceInforString(); } public static String getDeviceInforString() { StringBuilder infor = new StringBuilder(); String manufacturer = Build.MANUFACTURER; String model = Build.MODEL; if (model.startsWith(manufacturer)) { infor.append("MODEL: " + capitalize(model)); } else { infor.append("MODEL: " + capitalize(manufacturer) + " " + model); } infor.append(' '); infor.append("CPU ID: "+Build.CPU_ABI); infor.append(' '); infor.append("DISPLAY TYPE: "+Build.DISPLAY); infor.append(' '); infor.append("VERSION OS:"+Build.VERSION.RELEASE); infor.append(' '); infor.append("BOOTLOADER: "+ Build.BOOTLOADER); return infor.toString(); } private static String capitalize(String s) { if (s == null || s.length() == 0) { return ""; } char first = s.charAt(0); if (Character.isUpperCase(first)) { return s; } else { return Character.toUpperCase(first) + s.substring(1); } } }
Method getInforString(String name) nhận vào tham số name, mà ta sẽ truyền xuống từ chương trình Unity, và lấy được một số thông tin về cấu hình device trả về kết quả là string, kết quả này sẽ được trả lại cho chương trình Unity.
Kết thúc quá trình chuẩn bị thư viện bằng việc export file .jar Chọn file Activity -> chọn export -> chọn Jar để tạo ra 1 file thư viện như sau:
Về phía Unity, tạo 1 project empty với options trên bản 5.0 là 2D
Cần tạo 1 thư mục có tên là Plugins trong thư mục Assets, tiếp tục tạo 1 thư mục tên Android trong thư mục Plugins như sau:
Đây sẽ là nơi chứa thư viện android vừa tạo, chúng ta copy file thư viện .jar vừa tạo vào thư mục Android, tuy nhiên để Unity có thể build được activity class chúng ta cần định nghĩa 1 file AndroidManifest.xml tương tự như trong eclipse, có thể copy từ eclipse và chỉnh sửa lại 1 chút như sau, cần copy file này vào cùng thư mục với file thư viện:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.hellounity" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="19" /> <application android:label="@string/app_name" > <activity android:name=".HelloUnity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Trong thư mục Android sẽ có 2 file gồm 1 file thư viện và 1 file AndroidManifest.xml như sau:
như vậy là kết thúc việc chuẩn bị, bươc tiếp theo chúng ta cần phải tạo 1 scene để test việc gọi đến thư viện. Có thể tạo 1 scene như sau, ở đây người viết sử dụng Unity phiên bản 5.0, với Unity 4.6 hoàn toàn tương tự:
Scene gồm 3 đối tượng đối tương Text để hiển thị kết quả thư viện trả về, ở đây là thông tin về device do method geInfoString cung cấp đối tượng InputField để nhập tên người dùng đối tượng Button để gọi đến thư viện
Việc tạo ra các đối tượng này băng editor khá trực quan các bạn có thể tham khảo trong mục UI trên trang chủ của Unity. Bước tiếp theo cần viết script để gọi thư viện Chúng ta tạo 1 script C# như sau:
using UnityEngine; using System.Collections; using UnityEngine.UI; public class HelloAndroid : MonoBehaviour { public InputField inputField; public Button sendButton; public Text text; #if UNITY_ANDROID AndroidJavaClass androidClass; #endif // Use this for initialization void Start () { #if UNITY_ANDROID AndroidJNI.AttachCurrentThread(); androidClass = new AndroidJavaClass("com.example.hellounity.HelloUnity"); #endif sendButton.onClick.AddListener(()=>HandleSendButton()); } private void HandleSendButton(){ string text = inputField.text; //send it to device #if UNITY_ANDROID string infor = androidClass.CallStatic<string>("getInforString", text); this.text.text = infor; #endif } // Update is called once per frame void Update () { } }
Method HandleSendButton xử lý sự kiện khi click vào nút Send. Chúng ta cần tạo đối tượng AndroidJavaClass để làm cầu nối gọi từ object của Unity đến thư viện qua 2 methods là Call và CallStatic.
Method CallStatic truyền vào 2 tham số là 'method_name' và args Kết quả trả về của lời gọi được hiển thị lên màn hình thông qua đối tượng text. Gắn script trên vào đối tượng bất kỳ nằm trên scene, tạo reference đến các đối tượng tex, inputfield và button nằm trên scene.
Nhấn chọn build & run trên thiết bị và ta sẽ có được kết quả như sau:
Như vậy là chương trình Unity đã thực sự gọi đến thư viện native của chúng ta. Quá trình tạo ra 1 plugin android native được hoàn tất.
link source code projects
https://github.com/TienHP/techblog201503
Link blog phần 1
http://viblo.framgia.vn/TienNM87/posts/KE7bGoaZR5e2