【问题标题】:Display Unity Scene as Sub View in android studio在 android studio 中将 Unity 场景显示为子视图
【发布时间】:2017-10-10 15:12:15
【问题描述】:

我对在 android studio 项目中显示 3D 模型和图形有点困惑。

我一直在使用Rajawali,这是一个 Android OpenGL ES 2.0/3.0 引擎。

感谢 Rajawali,我能够显示 3D 模型、执行简单的动画并四处移动相机。

现在我想执行越来越复杂的动作和动画,并且可能创建自定义材质和纹理,但是 Rajawali wiki 已经过时并且这个库有一些限制(在我看来)。

所以现在我想知道是否有办法在 Unity3D 中创建场景或其他东西,例如我可以用手指旋转的动画 3D 模型视图,然后将其转换为 Android Java 类或 CustomView。

谢谢。

编辑:

这是我目前得到的:

这是我的 Android Studio APP 的主屏幕。在背景中,我有一个“加载”了 Rajawali 的 3D 模型视图。

如何使用 Unity 获得相同的结果?

【问题讨论】:

  • 你知道unity也可以将你的游戏导出到安卓吗?
  • 我知道,但我不想开发游戏。我想在我的 AndroidStudio 应用程序中嵌入一个 3D 模型视图。
  • @Kardux 不是重复的。该问题的答案解释了如何导出 Unity 问题,而不是如何将 Unity 场景显示为子视图。
  • @Programmer 同意这不是完全相同的问题,但主要部分(关于 Android 项目导出)仍然有效。另外,如何将 Unity 场景从 Activity 更改为 SubView 与 Unity 无关,而是与 Android 本身有关(当我发表评论时我也不知道这是目标^^)。无论如何,我删除了那个标志 :) 给 OP:如果它符合您的需要,请确保接受提供的答案。

标签: android unity3d


【解决方案1】:

您正在寻找的是如何将 Unity 场景显示为子视图。

如下所示:

这在 Unity 论坛上被描述为here。以及加载 Unity 场景的代码:

package com.unity3d.viewexample;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout.LayoutParams;

import com.unity3d.player.UnityPlayer;


public class JavaCubeViewActivity extends Activity {
    private UnityPlayer m_UnityPlayer;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create the UnityPlayer
        m_UnityPlayer = new UnityPlayer(this);
        int glesMode = m_UnityPlayer.getSettings().getInt("gles_mode", 1);
        boolean trueColor8888 = false;
        m_UnityPlayer.init(glesMode, trueColor8888);

        setContentView(R.layout.main);

        // Add the Unity view
        FrameLayout layout = (FrameLayout) findViewById(R.id.frameLayout2);    
        LayoutParams lp = new LayoutParams (LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
        layout.addView(m_UnityPlayer.getView(), 0, lp);
    }
}

您可以将 Unity 项目export 转至 Android Android 项目,然后使用上面的代码,或者您可以编写该 Java 代码,然后将其编译为 jar 插件,并通过在 Unity 中修改 Android Manifest 使 Unity 加载它。这两种方法都应该有效。

最后,您可以使用UnityPlayer.SendMessage.从Java调用Unity端的C#函数

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" package="com.unity3d.unity" android:versionName="1.0" android:versionCode="1">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false">
    <activity android:name="com.unity3d.player.UnityPlayerProxyActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:screenOrientation="portrait">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:screenOrientation="portrait">
    </activity>
    <activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:screenOrientation="portrait">
      <meta-data android:name="android.app.lib_name" android:value="unity" />
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
    </activity>
    <activity android:name="com.unity3d.player.VideoPlayer" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:screenOrientation="portrait">
    </activity>
  </application>
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="15" />
</manifest>

编辑

如果你想从 Java 中调用 Unity 的函数,请使用

UnityPlayer.UnitySendMessage("GameObjectName", "MethodName", "parameter to send");

您可以找到更多信息以及如何将其导入 Android Studio here

【讨论】:

  • 这就是我想要的!我试试看,谢谢;)
  • 您只能编辑指向论坛的链接吗?因为不是指图片,谢谢
  • 你知道任何其他的讨论或例子吗? Bocouse 这个是 2012 年的。反正没问题,只是问问。
  • m_UnityPlayer.getView() 返回 Unity 的 Android 视图 Unity 正在运行。如果您知道在 Android 中显示除FrameLayout 之外的另一个视图的其他方式,您可以将其与m_UnityPlayer.getView() 结合使用。这也应该有效。
  • 你应该看看UnityPlayer.java类的源代码。它将向您展示许多可以使用的好变量。该类的另一个变量是private SurfaceView n。如果您可以将其设为公共变量,您绝对可以使用它在游戏中将 Unity 显示为子视图,但这些都不是必需的。返回Viewm_UnityPlayer.getView() 应该没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
相关资源
最近更新 更多