package com.rexraphael.flutterunitywidget; import android.app.Activity; import android.graphics.PixelFormat; import android.os.Build; import android.view.ViewGroup; import com.unity3d.player.UnityPlayer; import java.util.concurrent.CopyOnWriteArraySet; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; public class UnityUtils { public interface CreateCallback { void onReady(); } public static boolean isAR = false; private static UnityPlayer unityPlayer; private static boolean _isUnityReady; private static boolean _isUnityPaused; private static final CopyOnWriteArraySet mUnityEventListeners = new CopyOnWriteArraySet<>(); public static UnityPlayer getPlayer() { if (!_isUnityReady) { return null; } return unityPlayer; } public static boolean isUnityReady() { return _isUnityReady; } public static boolean isUnityPaused() { return _isUnityPaused; } public static void createPlayer(final Activity activity, final CreateCallback callback) { if (unityPlayer != null) { callback.onReady(); return; } activity.runOnUiThread(new Runnable() { @Override public void run() { activity.getWindow().setFormat(PixelFormat.RGBA_8888); unityPlayer = new UnityPlayer(isAR ? activity : activity.getApplicationContext()); try { // wait a moument. fix unity cannot start when startup. Thread.sleep( 1000 ); } catch (Exception e) { } // start unity addUnityViewToBackground(activity); unityPlayer.windowFocusChanged(true); unityPlayer.requestFocus(); unityPlayer.resume(); _isUnityReady = true; callback.onReady(); } }); } public static void postMessage(String gameObject, String methodName, String message) { if (!_isUnityReady) { return; } UnityPlayer.UnitySendMessage(gameObject, methodName, message); } public static void pause() { if (unityPlayer != null) { unityPlayer.pause(); _isUnityPaused = true; } } public static void resume() { if (unityPlayer != null) { unityPlayer.resume(); _isUnityPaused = false; } } /** * Invoke by unity C# */ public static void onUnityMessage(String message) { for (UnityEventListener listener : mUnityEventListeners) { try { listener.onMessage(message); } catch (Exception e) { } } } public static void addUnityEventListener(UnityEventListener listener) { mUnityEventListeners.add(listener); } public static void removeUnityEventListener(UnityEventListener listener) { mUnityEventListeners.remove(listener); } public static void addUnityViewToBackground(final Activity activity) { if (unityPlayer == null) { return; } if (unityPlayer.getParent() != null) { ((ViewGroup)unityPlayer.getParent()).removeView(unityPlayer); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { unityPlayer.setZ(-1f); } ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(1, 1); activity.addContentView(unityPlayer, layoutParams); } public static void addUnityViewToGroup(ViewGroup group) { if (unityPlayer == null) { return; } if (unityPlayer.getParent() != null) { ((ViewGroup)unityPlayer.getParent()).removeView(unityPlayer); } ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT); group.addView(unityPlayer, 0, layoutParams); unityPlayer.windowFocusChanged(true); unityPlayer.requestFocus(); unityPlayer.resume(); } }