前回のUaalでinstallしたときAndroidアプリが2つにならないようにするの続き。
UnityとAndroid間のやりとりがどうなってるのか調べたのその調査メモ。
Native(Android) -> Unityを起動
- UnityActivityを普通にstartするだけ
// 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)への呼び出し
- GetStaticでMainUnityActivityのclassを持ってきてリフレクションでメソッドを呼ぶ感じ
Callbackは厳しそう 🤔=> 普通にCallのreturnでもらえる
- MainUnityActivityはOverrideUnityActivityを継承してる
// 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からOverrideUnityActivityの
mUnityPlayer
を参照し、UnitySendMessage()
で送信するこれもCallbackときとか困りそう… 🤔
// 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切り替えみたいな基本的な機能?はほしいかも。