/ kyokomi note / blog

UaalでのNative <-> Unity間の相互のやり取り調査メモ

May 31, 2020 [Android | Unity]

前回のUaalでinstallしたときAndroidアプリが2つにならないようにするの続き。

UnityとAndroid間のやりとりがどうなってるのか調べたのその調査メモ。

Native(Android) -> Unityを起動

// MainActivity.java

public void btnLoadUnity(View v) {
  isUnityLoaded = true;
  Intent intent = new Intent(this, MainUnityActivity.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
  startActivityForResult(intent, 1);
}

Unity -> Native(Android)への呼び出し

// cube.cs

void showHostMainWindow()
{
  #if UNITY_ANDROID
    try
    {
      AndroidJavaClass jc = new AndroidJavaClass("com.company.product.OverrideUnityActivity");
      AndroidJavaObject overrideActivity = jc.GetStatic<AndroidJavaObject>("instance");
      overrideActivity.Call("showMainActivity", lastStringColor);
    } catch(Exception e)
    {
      appendToText("Exception during showHostMainWindow");
      appendToText(e.Message);
    }
  #elif UNITY_IOS || UNITY_TVOS
    NativeAPI.showHostMainWindow(lastStringColor);
  #endif
}
// MainUnityActivity.java

@Override
protected void showMainActivity(String setToColor) {
  Intent intent = new Intent(this, MainActivity.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
  intent.putExtra("setColor", setToColor);
  startActivity(intent);
}

Native(Android) -> Unityへの呼び出し

// MainUnityActivity.java

myButton.setOnClickListener( new View.OnClickListener() {
  public void onClick(View v) {
    mUnityPlayer.UnitySendMessage("Cube", "ChangeColor", "yellow");
  }
});
// cube.cs

public class Cube : MonoBehaviour
{
    public Text text;    
    void appendToText(string line) { text.text += line + "\n"; }

    string lastStringColor = "";
    void ChangeColor(string newColor)
    {
        appendToText( "Chancing Color to " + newColor );

        lastStringColor = newColor;
    
        if (newColor == "red") GetComponent<Renderer>().material.color = Color.red;
        else if (newColor == "blue") GetComponent<Renderer>().material.color = Color.blue;
        else if (newColor == "yellow") GetComponent<Renderer>().material.color = Color.yellow;
        else GetComponent<Renderer>().material.color = Color.black;
    }

	....

}

感想

汎用的なBridge呼び出し(callbackなど含めて)をつくらないと都度このinterface追加していくのヤバそうな感じはある。

もしくはアプリとして完全にin-gameとout-gameが切り離せていればそれでもいいのかもしれない。

結構作ってみないとわからないな〜って感じはある。

SceneのPreloadとかScene切り替えみたいな基本的な機能?はほしいかも。

last modified June 18, 2020

👋 Related posts in the uaal series...