Я работаю над андроидным приложением, которое должно загрузить экземпляр UnityPlayer в activiy, используя код из следующего сообщения форума в качестве руководства:
http://forum.unity3d.com/threads/98315-Using-Unity-Android-In-a-Sub-View.
Первоначально приложение корректно отображает UnityPlayer внутри действия под названием "UnityActivity.java".
Проблема начинается, когда пользователь переходит к MainActivity (путем нажатия кнопки возврата оборудования или нажатия кнопки возврата ActionBar), а затем пытается повторно открыть UnityActivity. В этом случае вместо экрана отображается черный экран UnityPlayer. Пользователь на форумах предложил переадресовать события жизненного цикла onPause и onResume на UnityPlayer, как показано ниже в коде. Однако при этом появляются следующие ошибки, и приложение вылетает.
Это регистрируется при первом входе в UnityActivity:
W/libc(21095): pthread_create sched_setscheduler call failed: Operation not permitted
Эта ошибка регистрируется при нажатии кнопки "Назад":
W/Choreographer(20963): Already have a pending vsync event. There should only be one at a time.
Эта ошибка регистрируется при повторном доступе к UnityActivity:
A/libc(21095): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 21176 (Thread-5073)
... в какой момент меня выталкивают из приложения.
Код
Это выдержка из основного действия MainActivity.java
:
public void startUnityActivity(View view) {
Intent intent = new Intent(this, UnityActivity.class);
startActivity(intent);
}
Это выдержка из активности Unity UnityActivity.java
:
public class UnityActivity extends ActionBarActivity {
UnityPlayer m_UnityPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_unity);
m_UnityPlayer = new UnityPlayer(this);
int glesMode = m_UnityPlayer.getSettings().getInt("gles_mode", 1);
m_UnityPlayer.init(glesMode, false);
FrameLayout layout = (FrameLayout) findViewById(R.id.unityView);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
layout.addView(m_UnityPlayer, 0, lp);
m_UnityPlayer.windowFocusChanged(true);
m_UnityPlayer.resume();
}
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
m_UnityPlayer.windowFocusChanged(hasFocus);
}
@Override
public void onPause() {
super.onPause();
m_UnityPlayer.pause();
}
@Override
public void onResume() {
super.onResume();
m_UnityPlayer.resume();
}
Вот как описываются действия в манифесте ../AndroidManifest.xml
:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.package.example.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.package.example.UnityActivity"
android:label="@string/title_activity_unity"
android:screenOrientation="portrait"
android:launchMode="singleTask"
android:parentActivityName="com.package.example.MainActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale">
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
</activity>
</application>
Так определяется формат UnityActivity ../res/layout/activity_unity.xml
:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.package.example.UnityActivity"
tools:ignore="MergeRootFrame" >
<FrameLayout
android:id="@+id/unityView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</FrameLayout>
</FrameLayout>
Буду благодарен за любые советы и решения, указывающие на меня в правильном направлении.