در این پست در مورد ساخت پلاگین نیتیو اندروید در یونیتی صحبت میکنیم. از موارد استفادهی آن میتوان به پلاگینهایی که به صورت 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)
خیلی ممنون
خواهش میکنم دوست عزیز.
انشاألله مورد استفاده تون قرار بگیره.
خیلی عالی بود ممنون
ارادت
سلام آقا علیرضا
چند سوال داشتم اگر پاسخ بدی ممنون می شوم
1- اگر بخواهیم از طریق فایل جاوا داده ای را در یونتی توسط سی شاپ دریافت کنیم مثلا من می خوام در کلاس helper کدی را بصورت رندوم به من برگرداند و من در محیط بازی آنرا به نمایش بگزارم
2- چطوری میشه چیزی های مثل لایو والپپیر و یا سرویس های دیگه رو بصورت پلاگین به یونیتی اضافه کرد ؟
3- اگر بخواهیم فایلی را در Template.gradle یونتی مشخص کنیم در کجا کپی شود چه باید بکنیم
سلام در مورد سوال 1 این لینک رو مطالعه کنید:
https://docs.unity3d.com/Manual/AndroidUnityPlayerActivity.html
بعد از اون با یک کدی شبیه به این:
UnityPlayer.UnitySendMessage(“GameManager”, “OnVoiceDetected”, errorMsg);
که برای مثال داره تابع OnVoiceDetected رو از توی GameManager با ورودی errorMsg فراخوانی میکنه استفاده کنید.
در مورد دو سوال دیگرتون متأسفانه دانشی ندارم.
تشکر همین که پاسخ دادی خیلی ممنون
با سلام و خسته نباشید
آموزش تون خیلی عالی بود
من اگه بخوام داده هایی رو از داخل پلاگین به برنامه یونیتی ارسال کنم چکار باید بکنم یا مثلا یه متدی از یونیتی رو بخوام از داخل پلاگین فراخوانی کنم ؟
مرسی
سلام و وقت بخیر. انشاألله که مفید بوده باشه. این خط کد رو مشاهده کنید:
UnityPlayer.UnitySendMessage("Main Camera","getMessage","Az Android be Unity");
این کد از نیتیو اندروید، میره توی گیم آبجکت Main Camera و تابع getMessage که یک ورودی رشتهای داره رو فراخوانی میکنه و مقدار An Android Be Unity رو بهش ارسال میکنه. این پاسخ تمام سوالهایی هست که مطرح فرمودید.
مرسی بسیار عالی
لطفا از این آموش های خوبتون بازم ارائه بدید
سلامت باشید. متأسفانه به دلیل مشغلههای مدیریتی از برنامهنویسی فاصله گرفتم. شاید روزی فرصت ادامه پیش بیاد. امیدورم استفاده کرده باشید.
سلام خسته نباشید ممنون از آموزش های خوبتون من دو سوال داشتم
۱_من هر کاری می کنم نمی تونم فضای نام Unity Player رو اضافه کنم انگار اصلا وجود نداره
۲_چطور باید کیبورد پیش فرض گوشی رو فراخانی کنم
سلام قربان وقت شما بخیر، پوزش میخوام دیر پاسخ میدم.
در مورد سوال دوم اگر سرچ کنید راهش گفته شده منم انجام داده بودم اینکار رو پس شدنیه.
در مورد سوال اول هم لطفا تمامی مراحل آموزش رو به درستی و از ابتدا انجام بدید