anz blog

Unity v2018.2 で Java がサポートされたらしいよ!

2018-07-12 #Unity

ざっくりまとめ。

  • Unity v2018.2 がリリースされましたね!!
  • いろいろ機能追加あるけども... Java がサポートされたらしい!
  • やってみたよ!...うごいたよ!!

です。

環境

  • Unity v2018.2

Unity v2018.2 リリース!

いやーはえー。結局 Unity v2018.1 は触っていない気がする...😇
見て分かる通り、まぁいろいろと追加などされていますが...

そのなかでも、ちょっときになったのが...

これ。
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配下)

HelloAndroid.java

👍

ゆにゆにいっちゃうよ!

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に実機転送できてる環境さえできてれば大丈夫)

結果

plugin_example

うごいてるぞーー!!
いやまぁこれぐらいなら、全部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() だと普通にわたせるんだけどね。。🤔

参考

Unity 2018.2 で個人的に気になるポイント - もんりぃ is undefined.