要開發Android的App有許多的方法,目前以Android Studio與Unity最為多人使用,而兩者也都擁有完善的開發社群。剛好因為工作的關係,經常需要依照專案的屬性選擇開發的工具。例如 需要顯示3D、有大量動畫的專案會選擇使用Unity進行開發。而需要一些Native的工具(BLE、Toast、Boardcast......)則會使用Android studio。
優點:
-效能較佳
-有許多的Native API套件
-擁有龐大的Git library
缺點:
-視覺化界面較不完整
-開發時程相對較長
優點:
-較完整的視覺化界面
-對於3D的處理較容易
-Asset story提供許多工具
-跨平台
缺點:
-效能較差
礙於選擇開發環境時,經常因為Android的功能並未支援Unity導致只能使用Android Studio開發,於是開始找方法該如何寫Android plugins for Unity。這篇文章會用Unity呼叫Android Native的Toast作為範例。
廢話到這 ~ 切入主題
在建立的Module路徑下,新增一個新的JavaClass (這邊取名也叫做JavaClass)
這邊寫了一個function被呼叫時會把得到的訊息跟TAG一起print在log上
public class JavaClass
{
private final String TAG ="JavaClass";
public void logPrint (String message)
{
Log.i(TAG,message);
}
}
在路徑下會產生一個class.jar
如果找不到的話可以在資料夾內搜尋 .jar
在Unity Assets中 Create Plugins/Android 的資料夾並將class.jar複製進去
利用C# Script 的AndroidJavaObject呼叫
需要注意 Package Name跟function name就是前面使用Android studio定義的
void Start()
{
javaClass = new AndroidJavaObject("Android's package name");
javaClass.Call("Android function name","Hello Unity");
}
在adb shell 中輸入 logcat | grap JavaClass 可以看到前面寫的logPrint確實有被呼叫了
每次寫一次就要移動資料夾確實是很麻煩,因此只要在Module下的那個gradle加入下面幾行就可以自動把新build出來的Plugins import到Unity的路徑。(記得先把Unity舊的Classes.jar刪掉 因為這邊有把他改名)
因為許多的Android Native 元件都需要使用到Activity來創建,在這邊要使用Unity的Activity來創造。
如下圖 Unity的資料夾內找到classes.jar,複製到 Module路徑下的libs
然後因為我們上面再grandle中有include('classes.jar'),Sync之後就會自動import了
接著就可以利用UnityPlayer.currentActivity來拿到Activity去創建Native的原件,這邊寫了兩個Function,一個呼叫Toast,一個回傳number+1的數字。
public int getNumberPlus (int number)
{
return number+1;
}
public void showToast (String message)
{
Toast.makeText(UnityPlayer.currentActivity, "Toast "+message, Toast.LENGTH_SHORT).show();
}
Unity 那邊只需要使用AndroidJavaObject.Call即可以呼叫到前面寫好的showToast以及getNumberPlus兩個function
public class PluginWrapper : MonoBehaviour
{
private AndroidJavaObject javaClass;
public Text numText;
public Button toastButton;
// Start is called before the first frame update
void Start()
{
javaClass = new AndroidJavaObject("com.example.unityplugin.JavaClass");
javaClass.Call("logPrint","Hello Unity");
numText.text = javaClass.Call<int>("getNumberPlus",100).ToString();
toastButton.onClick.AddListener(new UnityEngine.Events.UnityAction (()=> showToast("Button Click")));
}
// Update is called once per frame
void Update()
{
}
public void showToast(string message)
{
javaClass.Call("showToast", message);
}
}
最後在Scene內新增一個Text和Button拉到PluginWrapper內Build出APK,按下按鈕即可看到Toast。