Unity v2018.2 で Java がサポートされたらしいよ!
ざっくりまとめ。
- Unity v2018.2 がリリースされましたね!!
- いろいろ機能追加あるけども... Java がサポートされたらしい!
- やってみたよ!...うごいたよ!!
です。
環境
- Unity v2018.2
Unity v2018.2 リリース!
いやーはえー。結局 Unity v2018.1 は触っていない気がする...😇
見て分かる通り、まぁいろいろと追加などされていますが...
そのなかでも、ちょっときになったのが...
> Support for using .java and .cpp source files as plugins in a Unity project
— 杏z (@AnzNetJp) 2018年7月11日
まじで!?ほほ〜
/Unity 2018.2 で個人的に気になるポイント - もんりぃ is undefined. https://t.co/lDGuJacjDV
これ。
java ファイルをサポート!
つまり、、、いままで Android でなにかしらネイティブ連携しようとおもったら、
AndroidStudio なんかをひらいて、ライブラリで作成して、Gradle でビルドして .jar ファイルなんかをつくって...
のまえに、Unity の .lib ファイルなんかの参照設定もあったり...
まぁ、めんどかったのですよ。
そもそも Unity ひらいてそこに AndroidStudio ひらくとか...おもいし。。
Unityマンにとって...
AndroidStudio?? なにそれおいしいのばかなのしぬの
ぐらいな勢いだろうし...
もう Gradle とかいわれたら...
あーあれねよくエラー吐いてるやつでしょ(嫌悪感)
みたいな気持ちになっちゃうでしょ?知ってるんだから
それが、サポートされたっていうことは
AndroidStudio とかさわらずに、、ささーっと java コード書いたら、
あとは普通にビルドして実機確認できると...なんて素敵なんだ!!
れっつとらい!
じゃばじゃば言うぞ
とりあえず java 側。
さくっと Toast 表示するだけのやつ
package xyz.anzfactory.hello;
import android.content.Context;
import android.widget.Toast;
import com.unity3d.player.UnityPlayer;
public class HelloAndroid {
private Context mContext;
HelloAndroid() {
mContext = UnityPlayer.currentActivity;
}
public void ShowToast(String message) {
Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
}
}
package とか class name とかは適宜よろです。
とりま、これで、Toast を表示するだけのやつができました
で、これを .java ファイルとして保存します(Plugin/Android配下)
👍
ゆにゆにいっちゃうよ!
Unity 側はいつものようにソレを呼び出すだけ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Call : MonoBehaviour
{
public void OnClick()
{
CallToast();
}
private void CallToast()
{
// 自作プラグイン読み込んで呼ぶ!
var helloAndroid = new AndroidJavaObject("xyz.anzfactory.hello.HelloAndroid");
helloAndroid.Call("ShowToast", "めっせーじだおー");
}
}
クリックされたら Toast 表示するだけのやつ。
これで。おわりです。
おわりなんです。
AndroidStudio?? Gralde??? そんなもんさわらないっす。
(Androidに実機転送できてる環境さえできてれば大丈夫)
結果
うごいてるぞーー!!
いやまぁこれぐらいなら、全部Unity(c#)側だけでも済ませられるけど...(笑)
この手軽さ、、いい。。。いままでネイティブ連携したほうが楽そう...だけど、.jar つくんのかったるいな...とかなってたんだけど...。
こんなに手軽にできるなら、もっと気軽に連携やっていき!💪
わかんないこと
上記に挙げた例では、コンストラクタで UnityPlaerActivity
を取得して保持するようにしてるんだけど...
最初は引数で受け取れるようにかいてたのですよ。
HelloAndroid(Context context) {
mContext = context;
}
こう。
で、Unity側からは
// context とってきて
var unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity").Call<AndroidJavaObject>("getApplicationContext");
// 引数に指定して渡す
var helloAndroid = new AndroidJavaObject("xyz.anzfactory.hello.HelloAndroid", context);
これでインスタンス作られるはずなのだけれど...エラーになるんですよね。
non no-static method init HelloAndroid なんちゃら〜〜〜
みたいな感じで。。
引数に指定するのを AndroidJavaObject
じゃなくてただの文字列にしたら全然だいじょうぶなのだけれど...
制限とかあんのか。。
Call()
だと普通にわたせるんだけどね。。🤔