【发布时间】:2017-03-22 13:50:33
【问题描述】:
我目前正在培训使用 Unity 添加一些功能(AR、VR 等)的应用程序。目前,我一直在使用 Android Studio 开发 Android,一旦完成,我将在 iOS 上进行培训。
我的目标很简单:我的MainActivity 显示两个按钮,每个按钮调用一个单独的 Unity 项目(从 Unity 导出为 Google Android 项目)来启动其场景。
为此,我将这两个 Unity 项目 Scene1 和 Scene2 导入为库,并通过启动它们的活动来调用它们(参见下面的代码)。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void goToUnity1(View v){
Intent intent = new Intent(this, com.example.unityscene1.UnityPlayerActivity.class);
startActivity(intent);
}
public void goToUnity2(View v){
Intent intent = new Intent(this, com.example.unityscene2.UnityPlayerActivity.class);
startActivity(intent);
}
}
及其AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.multipleunity">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.example.unityscene1.UnityPlayerActivity"></activity>
<activity android:name="com.example.unityscene2.UnityPlayerActivity"></activity>
</application>
Scene1 和 Scene2 中的 UnityPlayerActivity 文件是由 Unity 生成的,因此它们是相似的(这里是它们的 onCreate 方法):
public class UnityPlayerActivity extends Activity {
protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code
// Setup activity layout
@Override protected void onCreate (Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy
mUnityPlayer = new UnityPlayer(this);
setContentView(mUnityPlayer);
mUnityPlayer.requestFocus();
}
...
}
代码编译没有任何问题,应用程序启动并显示带有两个按钮的 MainActivity。当我单击第一个按钮时,它会按预期启动第一个 Unity 场景。但是,当我点击第二个按钮时,它也会启动第一个 Unity 场景,而不是第二个。
所以我试图理解为什么会发生这种情况,到目前为止我可以告诉你:
- 我没有错误地将同一个 Unity 项目放两次
- 在将
Scene2转换为库之前,它可以独立运行 - 当我点击第二个按钮时,
com.example.unityscene2.UnityPlayerActivity活动被调用
更新
在花费了几个小时之后,我确信问题出在我在 Google Android 项目中导出时 Unity 提供的资源的名称,这些资源始终相同 (unity-classes.jar)。
这是我读到的here:
Android 开发工具将库项目的资源与应用项目的资源合并。如果一个资源的 ID 被多次定义,工具会从应用程序中选择资源,或者从具有最高优先级的库中选择资源,然后丢弃其他资源。
此外,如果我有多个库,则优先级匹配依赖顺序(它们出现在 Gradle 依赖块中的顺序)。
所以我尝试颠倒依赖关系的顺序,我将第二个 Unity 项目放在第一个之前,正如预期的那样,两个按钮都会启动 Unity 的第二个场景。
现在我知道了,有没有办法避免这种名称冲突?
【问题讨论】:
-
你解决了这个问题吗?
标签: android android-studio unity3d