Hướng dẫn tạo plugin native trong Unity (P1)
I - Giới thiệu Unity là 1 game engine rất mạnh, có nhiều công cụ hỗ trợ cho nhà phát triển, và có nhiều thư viện, tài nguyên (gọi là các plugins) hỗ trơ, giúp cho việc phát triển game trở nên dễ dàng rất nhiều so với các game engine hiện nay. Bên cạnh đó Unity còn hỗ trợ việc xuất ra đa số ...
I - Giới thiệu
Unity là 1 game engine rất mạnh, có nhiều công cụ hỗ trợ cho nhà phát triển, và có nhiều thư viện, tài nguyên (gọi là các plugins) hỗ trơ, giúp cho việc phát triển game trở nên dễ dàng rất nhiều so với các game engine hiện nay.
Bên cạnh đó Unity còn hỗ trợ việc xuất ra đa số các nền tảng chơi game hiện nay (iOS, android, PC/Mac, PS4/Xbox One ...) nên giúp nhà phát triển tiết kiệm được tối đa chi phí, thời gian phát triển cho 1 game định hướng đa nền (multiplatform).
Bộ thư viện lõi của Unity (Unity Framework) chủ yếu tập trung quanh các component cơ bản của Unity như Transform, Renderer, Animation, Particles, AI ... nhưng một game hiện đại hiện nay thường kèm theo 1 số tính năng ví dụ như social, in-app purchase hay scoreboard (xếp hạng) .. những tính năng này các hệ điều hành android, ios và các mạng xã hôi (fb, gg, tw) đều đã xây dựng các bộ thư viện chuẩn. Để tận dụng điều này Unity không phát triển các thư viện làm việc đó nữa mà họ để cho các hãng thứ 3 tự phát triển các plugin để tận dụng các thư viện có sẵn như facebook sdk, google+ sdk ... và còn rất nhiều plugin khác sử dụng đến thư viện của android, iOS
Bài viết này sẽ giới thiệu, hướng dẫn những điều căn bản nhất để gọi một thư viện android trong Unity, giúp chúng ta có thể tận dụng được các thư viện của android trong quá trình tạo game.
II - Tiến hành
Trước chúng ta sẽ đề cập tới vấn đề lý thuyết để thực hiện việc gọi thư viện android trong Unity.
Unity cung cấp thư viện để có thể gọi tới 1 method của activity thông qua JNI (Java Native Interface) - một thư viện để các ứng dụng native (c/c++) có thể gọi đến code java chạy trên jvm Trước hết bạn cần có 1 thư viện android có sẵn, dưới dạng file .jar Để demo chúng ta tạo 1 project android bằng eclipse với 1 empty activity
Để Unity có thể sử dụng thư viện, chúng ta cần định nghĩa project như 1 thư viện java và nén thành tập tin .jar Bạn sử dụng eclipse để làm việc này như sau click chuột phải -> chọn properties, trong tab android chọn tick vào ô Is Library:
click chuột phải -> chọn exportexport, trong thư mục java chọn Jar file:
Xong bước này chúng ta đã có 1 thư viện android sẵn sàng để sử dụng trong Unity
Về phía Unity, để sử dụng được thư viện android, ta cần phải đưa thư viện vào thư mục đặc biệt đó là /Assets/Plugins/Android trong project Unity để unity có thể load thư viện và sẵn sàng tạo liên kết đến thư viên trong quá trình runtime. Tạo thư mục tên /Assets/Plugins/Android trong project Unity và copy file .jar vừa tạo ở eclipse vào:
Lúc này Unity đã nhận diện file .jar như một thư viện cần thiết, nó được load trước trong quá trình khởi chạy game.
Ta có thể tạo 1 scene để test thử việc gọi đến thư viện. Ở phần này ta sẽ thử gọi một đến method ngầm định của activity, việc tạo activity mở rộng và gọi các methods tự tạo người viết sẽ trình bày cụ thể ở phần 2 của Blog này.
Tạo 1 scene đơn giản như sau, ở đây sử dụng Unity version 4.6
Scene có 1 button và 1 textfield, khi click vào button thì ta sẽ set text cho text field ví dụ như gọi method activity.getCacheDir().getCanonicalPath() để lấy đường dẫn thư mục cache hiện tại của ứng dụng.
Tạo 1 script C# cho việc thực hiện lời gọi (AndroidCaller.cs)
void OnEnable () { btnCall.onClick.AddListener (() => tryCall ()); } void Disable () { btnCall.onClick.RemoveListener (() => tryCall ()); } private void tryCall () { AndroidJNIHelper.debug = true; #if UNITY_ANDROID && !UNITY_EDITOR AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic("currentActivity"); textField.text = jo.Call("getCacheDir").Call("getCanonicalPath"); #endif } public Button btnCall; public InputField textField; private AndroidJavaObject jo;
Các method OnEnable, OnDisable chạy khi một object chuyển sang trạng thái active hoặc deactive, chỉ thực hiện nhiệm vụ là đăng ký việc lắng nghe sự kiện onclick ở button Call (btnCall) và uỷ nhiệm xử lý cho hàm tryCall() ở trên. khi button Call được click, method tryCall được gọi thực hiện.
AndroidJavaClass đại diện cho 1 class java ở đây là class thuộc package com.unity3d.player.UnityPlayer 1 class thuộc package được unity tạo ra mỗi khi build project unity trên android.
AndroidJavaObject đại diện cho 1 object java (non-primitives) ở đây ta sử dụng hàm GetStatic để gọi tới 1 thuộc tính static của UnityPlayer có tên là currentActivity, trả về activity đang chạy trên android. công việc cuối cùng là sử dụng hàm call của AndroidJavaObject để gọi tới các hàm thành viên Call("getCacheDir") nghĩa là gọi hàm getCacheDir với kiểu trả về là object (non-primitives) Call("getCanonicalPath") thực hiên lời gọi hàm getCanonicalPath với kiểu trả về là String
Kết quả trả về của "getCanonicalPath" được đưa lên trên textfield bằng việc assign thuộc tính text.
Cần chú ý là việc gọi các method có sẵn của activity như 'getCacheDir, 'getCanonicalPath' không yêu cầu tạo file thư viện, việc tạo thư viện android và mở rộng, người viết sẽ trình bày cụ thể ở phần 2 của blog.
Phần 2
http://viblo.framgia.vn/TienNM87/posts/n157G5AoGAje