LoginSignup
9

More than 5 years have passed since last update.

UnityでC#だけでToastを出してみた(Android)

Posted at

短いコードだったらAndroidJavaなんちゃら使って書いたほうが楽かなーなどと思ったけどなんか引っかかったのでメモ。
あまりネイティブは分からないが…。

とりあえずToast作成に必要な物を考える
javaだとandroid.widget.Toastをインポートして
Toast.makeText(Context context, CharSequence text, int duration) を使って作成するらしい
(new Toast(Context context)でやったら「makeText使わないで作成しただろ」とエラーが出てしまった)
それぞれの引数は
context → currentActivity.getApplicationContextで出せる
text → CharSequence型とか分かんないけど、表示したい文字列なのでstringでできるだろう
int → Toastクラスに定数が用意されているので、GetStatic<int>で受け取る

それで以下のように書いた

AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");

AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");
AndroidJavaObject toast = toastClass.CallStatic<AndroidJavaObject> ("makeText",
                                          context,
                                          "Test Toast",
                                          toastClass.GetStatic<int>("LENGTH_SHORT")
                                          );
toast.Call ("show");

けど、Looper.prepare()がどうのこうのとエラーが出たため、調べて以下のように修正。

AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext");

activity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
    AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");
    AndroidJavaObject toast = toastClass.CallStatic<AndroidJavaObject> ("makeText",
                                          context,
                                          "Test Toast",
                                          toastClass.GetStatic<int>("LENGTH_SHORT")
                                          );
    toast.Call ("show");
}));

こいつで見事"Test Toast"が表示された。
後は好きな文字列を入れられるようにするのがいいかな。

ClassだObjectだCall(Static)だGet/Set(Static)だと出てきてちんぷんかんぷんになってたけど、C#でも同じことしてるだろ、と考えたら少しは書けるようになった。
でも書いてて自分があまり理解してないとこがあるので、もうすこしネイティブを勉強せねばだ。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9