Поддержание UnityPlayer через фрагменты - PullRequest
0 голосов
/ 12 октября 2018

У меня есть действие с подпредставлением, которое загружает в него UnityPlayer.Этот UnityPlayer работает хорошо и как ожидалось.Затем я открываю новый фрагмент в этом действии, этот фрагмент также имеет представление, которое загружает в него UnityPlayer.Этот UnityPlayer также работает хорошо и как ожидалось.

Проблема возникает, когда я выхожу из фрагмента, возвращаясь к действию.Здесь UnityPlayer заморожен, и программа в конечном итоге вылетает.Кто-нибудь есть идеи (или указатели) о том, как использовать UnityPlayer в различных представлениях, как это?

Например:

Когда открывается действие, я использую это для инициализации моего представления:

public void init(Context context) {
    inflate(context, R.layout.exercise_3d_animation_layout, this);

    mUnityPlayer = new UnityPlayer(context);

    FrameLayout frameLayout = findViewById(R.id.unity_player);
    frameLayout.addView(mUnityPlayer);
    mUnityPlayer.setOnTouchListener(this);
}

Тогда в моей деятельности есть все обычные обратные вызовы Unity-Android:

// Quit Unity
@Override protected void onDestroy ()
{
    mUnityPlayer.quit();
    super.onDestroy();
}

// Pause Unity
@Override protected void onPause()
{
    super.onPause();
    mUnityPlayer.pause();
}

// Resume Unity
@Override protected void onResume()
{
    super.onResume();
    mUnityPlayer.resume();
}

@Override protected void onStart()
{
    super.onStart();
    mUnityPlayer.start();
}

@Override protected void onStop()
{
    super.onStop();
    mUnityPlayer.stop();
}

// Low Memory Unity
@Override public void onLowMemory()
{
    super.onLowMemory();
    mUnityPlayer.lowMemory();
}

// Trim Memory Unity
@Override public void onTrimMemory(int level)
{
    super.onTrimMemory(level);
    if (level == TRIM_MEMORY_RUNNING_CRITICAL)
    {
        mUnityPlayer.lowMemory();
    }
}

// This ensures the layout will be correct.
@Override public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    mUnityPlayer.configurationChanged(newConfig);
}

// Notify Unity of the focus change.
@Override public void onWindowFocusChanged(boolean hasFocus)
{
    super.onWindowFocusChanged(hasFocus);
    mUnityPlayer.windowFocusChanged(hasFocus);
}

// For some reason the multiple keyevent type is not supported by the ndk.
// Force event injection by overriding dispatchKeyEvent().
@Override public boolean dispatchKeyEvent(KeyEvent event)
{
    if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
        return mUnityPlayer.injectEvent(event);
    return super.dispatchKeyEvent(event);
}

// Pass any events not handled by (unfocused) views straight to UnityPlayer
@Override public boolean onKeyUp(int keyCode, KeyEvent event)     { return mUnityPlayer.injectEvent(event); }
@Override public boolean onKeyDown(int keyCode, KeyEvent event)   { return mUnityPlayer.injectEvent(event); }
@Override public boolean onTouchEvent(MotionEvent event)          { return mUnityPlayer.injectEvent(event); }
/*API12*/ public boolean onGenericMotionEvent(MotionEvent event)  { return mUnityPlayer.injectEvent(event); }

И когда фрагмент открывается, он снова инициализирует представление (как и раньше).Я думаю, что моя проблема в понимании жизненного цикла обоих и как они взаимодействуют

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Я решил это!

В основном в базовом действии методы onStop () и onDestroy () возникают только тогда, когда действие isFinishing () затем использует одноэлементный UnityPlayer (хотя синглтон только в контексте действия, уничтожается при изменении действия).Это необходимо, поскольку многие основные методы UnityPlayer являются статическими, и вы не можете вызывать или создавать двух отдельных игроков Unity.

При открытии нового фрагмента отсоедините первый UnityPlayer от его макета (чтобы у него не было родителя при подключении его к следующему представлению).Сделайте это при выходе из фрагмента тоже.Убедитесь, что правильно обрабатывает onPause () и onResume (), чтобы избежать появления черных экранов.Это также устраняет проблемы изменения ориентации при изменении макета:)

0 голосов
/ 15 октября 2018

Кажется, UnityPlayer.quit () на самом деле убивает свой процесс при вызове.

Вы можете остановить это поведение, указав другое имя процесса (например, "unity") для UnityPlayerActivity в манифесте Android.Похоже, что UnityPlayer убивает свой процесс при вызове quit (), поэтому вам просто нужно убедиться, что у вашего Приложения и других Активностей другое имя процесса (по умолчанию это имя пакета Приложения).

https://answers.unity.com/questions/587979/how-do-i-stop-munityplayerquit-closing-the-entire.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...