142 lines
4.1 KiB
Java
142 lines
4.1 KiB
Java
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<UnityEventListener> 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();
|
|
}
|
|
}
|