iOS編はこちら
C# からJavaコードの呼び出し
- AndroidJavaClassでJavaのクラスを参照して使う:
public class HogeClass { |
- usingはC#の文法で、ガベコレ対策(ガベコレが走るまでJava側のリソースを保持し続けてしまうのを防止するため)
package com.hoge; |
Javaのコードはコンパイルして.jarを作り、Assets/Plugins/Android/以下に配置すると、Buildでリンクされる。
とりあえずJava側のstaticメソッドの呼び出しだけ試した
コールバック
- C#からJavaにメソッドを渡して呼び返してもらう、ということはできないようで、
UnityPlayer.UnitySendMessage
というのを使う:
package com.hoge; |
- シーンに存在する「オブジェクト名」のGameObjectにメソッドを送ることができる
- そのため、コールバックを受け取るオブジェクトは
MonoBehaviour
を継承したGameObjectで、シーンに配置され、一意の名前を持っている必要がある - C#からJavaに対してコールバックして欲しい対象のオブジェクト名を渡して、それに対して
UnitySendMessage
をするといいかもしれない
- そのため、コールバックを受け取るオブジェクトは
- メッセージを介して渡せるのは文字列だけなので、複雑な結果を渡したい場合にはシリアライズ/デシリアライズする必要がある
- コンパイルするにはUnityのクラス情報が入った.jarファイルが必要(Macの場合
/Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidPlayer/release/bin/classes.jar
にある)
アクティビティの取得
Java側でAndroidのAPIを呼び出す場合、ActivityやContextが欲しい時が多い。それを取得するにはC#で、
public class HogeClass { |
- Unityから起動されるアプリのActivityは
UnityPlayer
か、カスタマイズしている場合その派生クラスだと思うけど、そのstaticなcurrentActivity
フィールドに格納されているらしい。
参考
- Unity - Manual: Building Plugins for Android Android側でNDKを使う方法であれば、C#側はiOSと同様にできるか…といってもやりとりしたいのはJavaコードの場合が多いだろうからね