Unity3D-Android用のプラグインの作成

まえがき



こんにちは

ここでは、Androidアプリケーションを使用してUnity3Dの機能を拡張する方法について説明します。 言い換えると、EclipseでAndroidに必要な機能をJavaプログラミング言語のライブラリとして記述し、.jarにエクスポートしてUnity3Dで使用できます。 基本的に、彼らはUnity3Dの機能に欠けているものを書きます-懐中電灯のオン/オフや長時間の振動など



画像



何が必要ですか







ソースコード



Unity3Dプロジェクト

Eclipseプロジェクト



Android





Unity3D用のAndroidライブラリの作成は、通常のAndroidライブラリの作成と何の違いもありません。 始めるには、Unityからこのための別のライブラリを取得する必要があります-このため、インストールしたフォルダー(通常はC:/ ProgramFiles )に移動し、このパスに沿ってUnity \ Editor \ Data \ PlaybackEngines \ androidplayer \ bin \に移動しますclasses.jar 、およびライブラリを自分にとって都合の良い場所にコピーします。



Eclipseでプロジェクトを作成します:[ファイル]-[プロジェクト]-[Androidアプリケーションプロジェクト]-[次へ]をクリックし、オブジェクトの名前を入力します。 Androidデバイスの電球をオン/オフできるプロジェクトを作成する必要があるとします(最初はUnity3Dにそのような機能はありません)。 次に、 UnityTorchプロジェクトを呼び出します。 プロジェクトのパッケージ名をcom.izaron.habr.unitytorchとします。 その後、アクティビティの名前が表示されるまで「次へ」をクリックします。 UnityTorchActivity呼び (メインクラスの名前はそれに依存します)、[完了]をクリックします。



プロジェクトを作成しました。 上記で言及したclasses.jarライブラリーをlibsフォルダーに移動します



srcフォルダーでUnityTorchActivity.javaを開きます。次のようになります。

package com.izaron.habr.unitytorch; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class UnityTorchActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_unity_torch); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.unity_torch, menu); return true; } }
      
      







プラグインがUnity3Dで動作するには、アクティビティがUnityPlayerActivityを継承する必要があります

ファイルをこのような状態に変更します

 package com.izaron.habr.unitytorch; import com.unity3d.player.UnityPlayerActivity; import android.os.Bundle; public class UnityTorchActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }
      
      







ご覧のとおり、ここでは何も起こりません。 ここで、懐中電灯を担当し、オン/オフを切り替える関数を含むTorch.javaクラスを作成する必要があります。 少しグーグル、このクラスの準備ができました

非表示のテキスト
 package com.izaron.habr.unitytorch; import com.unity3d.player.UnityPlayerActivity; import android.content.pm.PackageManager; import android.hardware.Camera; import android.hardware.Camera.Parameters; public class Torch { private Camera cam; //   public UnityPlayerActivity activity; //      public boolean isEnabled; // -  public Torch(UnityPlayerActivity activity) { this.activity = activity; isEnabled = false; cam = Camera.open(); //      } public boolean hasTorch() { //      ,   false return (activity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)); } public void turnLightOn() { if(hasTorch()) { isEnabled = true; cam = Camera.open(); Parameters p = cam.getParameters(); p.setFlashMode(Parameters.FLASH_MODE_TORCH); //  cam.setParameters(p); cam.startPreview(); } } public void turnLightOff() { if(hasTorch()) { isEnabled = false; cam.stopPreview(); cam.release(); } } public boolean enabled() { return isEnabled; } }
      
      









注意! activity.getPackageManager()に関連するエラーが発生する場合があります。 AndroidManifest.xmlファイルで修正するには、「android:minSdkVersion = "8" "の行を" android:minSdkVersion = "9" "に変更すると、すべてが正常になります。



最後の部分-メインクラスでトーチのコピーを作成します

 package com.izaron.habr.unitytorch; import com.unity3d.player.UnityPlayerActivity; import android.os.Bundle; public class UnityTorchActivity extends UnityPlayerActivity { public Torch torch = new Torch(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } }
      
      







Unity3d



Unity3Dでプロジェクトを作成する

AndroidのすべてのプラグインはAssets / Plugins / Androidフォルダーに保存する必要があります。そうしないと、ユニットはプラグインを「表示」しません-このフォルダーを作成します。 そこで、AndroidManifest.xml、ライブラリjarファイル、リソースを保存するためのresフォルダーをスローできます。



Eclipseのプロジェクトに戻り、左のセクションでプロジェクトを右クリックします-「エクスポート」-「JARファイル」-「次へ」-UnityプロジェクトのAssets / Plugins / Androidへのパスを書きます-「Finish」



Unityの同じフォルダーAndroidManifest.xmlに直接作成します-エディターではなく、エクスプローラーまたはIDE(Visual Studio、MonoDevelop)で直接作成します



このファイルに書き込みます



 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.izaron.habr.unitytorch" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="9" /> <application android:label="@string/app_name" android:icon="@drawable/app_icon"> <activity android:name="com.izaron.habr.unitytorch.UnityTorchActivity" android:configChanges="keyboardHidden|orientation" 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> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> </manifest>
      
      





変更する必要があるのは、名前パッケージ、android:アクティビティの名前とuses-permissonsです



Eclipseプロジェクトのマニフェストはコピーされません。必要ありません



次に、ライブラリ上に小さな「ラッパー」を作成する必要があります-TorchActivity.csTorch.csの 2つのファイルを作成します



TorchActivity.cs (パッケージ名を忘れないでください)

 using UnityEngine; using System.Collections; public static class TorchActivity { #if UNITY_ANDROID && !UNITY_EDITOR public static AndroidJavaClass activityClass = new AndroidJavaClass("com.izaron.habr.unitytorch.UnityTorchActivity"); public static AndroidJavaClass unityActivityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); public static AndroidJavaObject activityObj = unityActivityClass.GetStatic<AndroidJavaObject>("currentActivity"); #else public static AndroidJavaClass activityClass; public static AndroidJavaClass unityActivityClass; public static AndroidJavaObject activityObj; #endif }
      
      







Torch.cs

 using UnityEngine; using System.Collections; public static class Torch { #if UNITY_ANDROID && !UNITY_EDITOR private static AndroidJavaObject torchObj = TorchActivity.activityObj.Get<AndroidJavaObject>("torch"); #else private static AndroidJavaObject torchObj; #endif public static bool HasTorch() { if (Application.platform == RuntimePlatform.Android) return torchObj.Call<bool>("hasTorch"); else return false; } public static bool Enabled() { if (Application.platform == RuntimePlatform.Android) return torchObj.Call<bool>("enabled"); else return false; } public static void TurnLightOn() { if (Application.platform == RuntimePlatform.Android) torchObj.Call("turnLightOn"); } public static void TurnLightOff() { if (Application.platform == RuntimePlatform.Android) torchObj.Call("turnLightOff"); } }
      
      







なぜ2つのフィールドactivityClassとactivityObjが必要なのですか? activityObjを使用して、UnityTorchActivityメソッドを呼び出すことができ、静的関数はactivityClassを介してのみ呼び出すことができます。 そのような小さな(そして初心者には下劣な)ニュアンス

それ以外の場合、すべてが非常に透過的です-Androidプラットフォームの外部で関数を起動しても、何も良い結果につながりません。



結論-Unity3D向けのAndroid用プラグインの作成は、あまり普及していないため、この分野に関する記事はほとんどありません。 この問題が明らかになったことを願っています。 ご清聴ありがとうございました!



ソースコード



Unity3Dプロジェクト

Eclipseプロジェクト



All Articles