android - 在 Android Studio 中打开 Unity 项目时找不到资源异常
问题描述
由于 Google 警告我们提供对 64 位架构的支持,我正在将我现有的 Unity 项目从 Unity 5.6.6f 版本迁移到Unity 2018.4.1f
在运行我的项目应用程序时,日志会崩溃,
2019-06-02 20:08:27.869 14987-14987/com.example.myapplication:unityplayer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication:unityplayer, PID: 14987
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.UnityActivity}: android.content.res.Resources$NotFoundException: String resource ID #0x0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2747)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2808)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1541)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:165)
at android.app.ActivityThread.main(ActivityThread.java:6375)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0
at android.content.res.Resources.getText(Resources.java:347)
at android.content.res.MiuiResources.getText(MiuiResources.java:97)
at android.content.res.Resources.getString(Resources.java:393)
at com.unity3d.player.UnityPlayer.a(Unknown Source)
at com.unity3d.player.UnityPlayer.<init>(Unknown Source)
at com.example.myapplication.UnityActivity.onCreate(UnityActivity.java:52)
at android.app.Activity.performCreate(Activity.java:6845)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
我已经完成的步骤
我在 Unity 2018.4.1f 中创建了一个新项目,并将脚本后端配置更改为 IL2CPP 以支持 64 位架构。
请看我下面的配置。
我已将 Unity 中的包名称更改为我的 Android 应用程序包名称并导出了构建。
导出后,我已将 Library 文件夹、Asset 文件夹和 JniLibs 文件夹内容(我从导出的 Unity Android 项目中获得)粘贴到我的 Android 项目各自的文件夹中。
我在 Android Studio 项目中的 UnityActivity 文件,
package com.example.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Window;
import android.widget.FrameLayout;
import com.unity3d.player.UnityPlayer;
public class UnityActivity extends Activity {
protected static UnityPlayer mUnityPlayer; // don't change the name of UnityPlayer.currentActivity variable; referenced from native code
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
getWindow().setFormat(PixelFormat.RGBX_8888); // <--- UnityPlayer.currentActivity makes xperia play happy
mUnityPlayer = new UnityPlayer(this);
setContentView(mUnityPlayer);
FrameLayout cameraLayout = findViewById(R.id.unity_player_layout);
cameraLayout.addView(mUnityPlayer.getView());
mUnityPlayer.requestFocus();
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
}
// Quit Unity
@Override
protected void onDestroy() {
if (mUnityPlayer != null) {
mUnityPlayer.quit();
}
super.onDestroy();
}
// Pause Unity
@Override
protected void onPause() {
super.onPause();
System.out.println("OnPause called");
mUnityPlayer.pause();
}
// Resume Unity
@Override
protected void onResume() {
super.onResume();
System.out.println("OnResume called");
mUnityPlayer.resume();
}
@Override
protected void onStop() {
super.onStop();
System.out.println("Onstop called");
}
// 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();
}
}
// UnityPlayer.currentActivity 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 onTouchEvent(MotionEvent event) {
return mUnityPlayer.injectEvent(event);
}
/*API12*/
public boolean onGenericMotionEvent(MotionEvent event) {
return mUnityPlayer.injectEvent(event);
}
@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
}
@Override
public void onBackPressed() {
super.onBackPressed();
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mUnityPlayer.quit();
}
});
}
}
对应的 XML 文件,
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/unity_player_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
我的 AndroidManifest 文件看起来像
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.front"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.front.autofocus"
android:required="false" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch.distinct"
android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- Allows access to the flashlight -->
<permission
android:name="android.permission.FLASHLIGHT"
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
android:protectionLevel="normal"
android:required="false" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
<activity
android:name=".UnityActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection"
android:label="@string/app_name"
android:launchMode="singleTask"
android:process=":unityplayer"
android:screenOrientation="landscape">
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
<meta-data
android:name="unityplayer.ForwardNativeEventsToDalvik"
android:value="true" />
</activity>
<!--
To support devices using the TI S3D library for stereo mode we must
add the following library.
Devices that require this are: ODG X6
-->
<uses-library
android:name="com.ti.s3d"
android:required="false" /> <!-- To support the ODG R7 in stereo mode we must add the following library. -->
<uses-library
android:name="com.osterhoutgroup.api.ext"
android:required="false" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
因为,我是一名本地开发人员,对 Unity 知之甚少,所以解决这个问题的任何帮助都会非常有帮助!
解决方案
我必须将以下行添加到 strings.xml 文件中以消除错误!
<string name="game_view_content_description">Game view</string>
推荐阅读
- javascript - 如何阻止可扩展的 Material UI 卡片同时打开?
- google-kubernetes-engine - 是否可以通过 GKE 入口配置 Google Cloud 内部 TCP/UDP 负载均衡器?
- css - 如何在打字稿项目中添加缩小的引导文件?
- kubernetes - GKE BackendConfig 不适用于 customRequestHeaders
- python - 如何解决:TypeError:fit() 缺少 1 个必需的位置参数:'y'
- android - android studio中的模糊元素
- python - 模型实例未呈现到模板中
- javascript - 如何使用 javascript 更改 JSON 文件
- postgresql - 如何将用户选择的 csv 文件导入 ASP.NET Core MVC 上的数据库
- python - 如何在odoo中以真正的字母顺序(不区分大小写)排序顺序获取记录?