در این پست در مورد ساخت پلاگین نیتیو اندروید در یونیتی صحبت می‌کنیم. از موارد استفاده‌ی آن می‌توان به پلاگین‌هایی که به صورت third-party به یونیتی اضافه می‌کنیم اشاره کرد. برای مثال پلاگین پرداخت اندروید کافه بازار، یا سیستم لاگین گوگل و امثالهم.

آموزش ویدئویی:

روند کلی این است که، شما ابتدا کد‌هایتان را در محیط توسعه اندروید (اندروید استودیو) پیاده می‌کنید. و سپس با کمک یک پل (Bridge) که در یونیتی به شکل پیشفرض قابلیت آن تعبیه شده است، از کد‌های نیتیو نوشته شده استفاده می‌کنید.

این قابلیت در یونیتی هم برای اندروید و هم برای IOS فراهم است.

برای شروع، پروژه ای در اندروید استودیو ایجاد می‌کنیم و نام آن را NativePluginTest می‌گذاریم.

در هنگام ساخت پروژه، نوعِ آن را NoActivity انتخاب می‌‌‌‌‌‌کنیم چون تمایلی به وجود Activity در این پلاگین نداریم.

برای آماده سازی پروژه‌ی خود برای استفاده به عنوان پلاگین، ابتدا لازم است این چند مرحله انجام شود:

1- به  build.gradle در ماژول اپ رفته و اولین خط کد یعنی apply plugin: ‘com.android.application’  را به apply plugin: ‘com.android.library’ تغییر می‌دهیم. با این کار به اندروید استودیو گفته‌ایم، این ماژول، دیگر یک اپلیکیشن ساده نیست و به عنوان پلاگین استفاده می‌شود.

2- در همین فایل، خط مربوط به مشخص کردن applicationId را به صورت کامل پاک می‌‌کنیم چون پلاگین نیاز به مشخص شدنِ آن ندارد.

3- از فولدر res و در بخش values، فایل colors.xml را پاک کرده و به فایل styles.xml رفته و محتویاط داخل تگ resources را پاک می‌کنیم.

همین، حالا آماده شروع به کار هستیم. برای شروع کلاسی به نام Helper می‌نویسیم تا عملیاتمان را آنجا انجام دهیم:

public class Helper {

    public static void TestPlugin(){
        Log.e("HI" , "This Is From Native");
    }

    public static void ShowToast(Activity context){
        Toast.makeText(context, "This is a Toast :) ", Toast.LENGTH_SHORT).show();
        Log.e("HI","Show TOast has been called");
    }
}

این کلاس درواقع واسط بینِ یونیتی و اندروید خواهد بود، کارِ ما فراخوانی دو تابع نوشته شده در این کلاس، در یونیتی است.

برای گرفتن خروجی از کارمان تا اینجا، از بخشِ راست اندروید اسوتدیو،  پنجره Gradle را باز کرده و در بخش مربوط به ماژولِ خود و زیربخش build، روی build کلیک می‌کنیم (دابل کلیک) تا عملیات بیلد انجام بگیرد.

پس از انجامِ بیلد، فایل پلاگین با پسوند aar در فولدر outputs در دسترس است. این فایل را کپی کرده و در جایی در فولدر assets در یونیتی قرار می‌دهیم.

کار ما در این بخش تمام است و حالا به سراغ یونیتی می‌رویم. در یونیتی کلاسی ایجاد می‎کنیم به نام TestPlugin تا کدهای ارتباط با پلاگین را داخلِ آن بنویسیم.

کد کامل این کلاس به این صورت است:

public class TestPlugin : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var androidJavaClass = new AndroidJavaClass("ir.amulay.nativeplugintest.Helper");

        androidJavaClass.CallStatic("TestPlugin");
        Debug.Log("Plugin has been called...");


        var unityJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

        var unityJavaObject = unityJavaClass.GetStatic<AndroidJavaObject>("currentActivity");

        androidJavaClass.CallStatic("ShowToast", unityJavaObject);



    }


}

با کمکِ آبجکت AndroidJavaClass می‌توانیم به لایبراری خود دسترسی پیدا کنیم، ورودی تابع سازنده‌ی این شیء، امضایِ پروژه پلاگین ماست که در آخر هم نامِ کلاس آورده می‌شود. (درواقع امضایِ کامل کلاس مورد نظرمان).

سپس از این شیء ایجاد شده می‌توان توابع مورد نظرمان را فراخوانی کنیم. با توجه به اینکه توابعی که نوشتیم static هستند، بنابراین از تابع CallStatic برای فراخوانی توابع استفاده می‌کنیم.

همانطور که قابل مشاهده است، برای نمایش Toast نیاز به یک Context داریم، که این context را باید از خود یونیتی گرفته و به پلاگین به عنوان ورودی ارسال کنیم (از آنجا که خودِ پلاگین کانتکستی ندارد). می‌توان از همین تابع CallStatic برای ارسال ورودی هم به تابع مورد نظر استفاده کرد.

برای گرفتن کانکست از یونیتی، ابتدا کلاس مرتبط با اندروید را از یونیتی دریافت می‌کنیم:

var unityJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");

سپس از این کلاس، متغیر استاتیک currentActivity که همواره آن اکتیویتی که در حال اجراست را در خود ذخیره می‌کند گرفته و سپس به تابع مورد نظرمان در پلاگین ارسال می‌کنیم:

var unityJavaObject = unityJavaClass.GetStatic<AndroidJavaObject>("currentActivity");

        androidJavaClass.CallStatic("ShowToast", unityJavaObject);

منابع:

https://docs.unity3d.com/Manual/PluginsForAndroid.html

Steps to create a native Android plugin for Unity in Java using Android Studio – Part 1 (of 2)

Step-by-Step guide for developing Android Plugin for Unity3D (I)

HowTo: native Android plugins for Unity3D