Android/iOS嵌入Unity开发设计实例,嵌入
Unity 与 Android/iOS 交叉式开发设计关键有二种方法,以 Android 为例子,一是 Android 转化成 jar 或是 aar 包,导进到 unity3d plugin/bin/ 文件目录下;二是 Unity 导出来 Android 工程项目,在 Android Studio 中做为库再次开发设计。在网上的实例教程基本上都是第一种方法,而文中关键剖析第二种方法。
这类方法能够在手机端的 NativeApp 中以,库的方式集成化早已写好的 Unity 工程项目,运用 Unity 手机游戏模块方便快捷的开发设计方式开展混合开发开发设计。
Unity官方网文本文档 Unity as a Library integration example to iOS and Android
下列以安卓系统服务平台做为实例。
Android Studio 3.5.3 Unity version 2019.3.7f1 Android Studio 在建新项目:这时候备选择Export将会会提醒JDK相对路径配备错误,没事儿大家到 Preference - Externl Tools 设定相对路径
include ':unityLibrary' project(':unityLibrary').projectDir = new File('..\\UnityProject\\androidBuild\\unityLibrary')
点一下 AS 的 sync project,能看到早已多了一个 module:
如今大家能够立即应用这一 module 里的 java class 了。
如今大家的工程项目包括了2个 module ,一个是在建工程项目内置的 app,一个是刚刚导进的 unityLibrary。点开 unityLibrary 的文件目录能看到2个关键的 class :
在其中 UnityPlayerActivity 是最大要的 class ,大家能够根据这一类在安卓系统 app 中显示信息 Unity 的情景。对于如何应用—— OverrideUnityActivity 则是对 UnityPlayerActivity 使用方法的一个官方网实例,里边的编码也非常简单
<.unity3d.player.UnityPlayerActivity; public abstract class OverrideUnityActivity extends UnityPlayerActivity public static OverrideUnityActivity instance = null; abstract protected void showMainActivity(String setToColor); @Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); instance = this; @Override protected void onDestroy() { super.onDestroy(); instance = null;显而易见官方网是期待大家在安卓系统内用一个 Activity 去显示信息 Unity 3D渲染的情景,对于这一 Activity ,立即承继 UnityPlayerActivity 就基本完了了,十分简易。
那麼大家在建一个 Activity,这儿我起名叫 MainUnityActivity:
public class MainUnityActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
你大能全都不写,要是承继 UnityPlayerActivity 就可以了了。如今搭建 app,进到 MainUnityActivity 的情况下便会显示信息 Unity 的情景了。
自然你可以能必须将 Unity 的情景做为子主视图显示信息,而并不是让 Unity 占有你的全部显示屏,这套简易方式也不合适了,但是依然有处理计划方案,参照 Display Unity Scene as Sub View in android studio 。
大家先来观查 UnityPlayerActivity 里边究竟写了甚么:
public class UnityPlayerActivity extends Activity implements IUnityPlayerLifecycleEvents protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code // Override this in your custom UnityPlayerActivity to mand line arguments passed to the Unity Android Player // mand line arguments are passed as a string, separated by spaces // UnityPlayerActivity calls this from 'onCreate' // Supported: -force-gles20, -force-gles30, -force-gles31, -force-gles31aep, -force-gles32, -force-gles, -force-vulkan // See // @param cmdLine mand line arguments, may be null // @return mand line string or null protected String updateUnityCommandLineArguments(String cmdLine) return cmdLine; // Setup activity layout @Override protected void onCreate(Bundle savedInstanceState) requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); String cmdLine = updateUnityCommandLineArguments(getIntent().getStringExtra( unity )); getIntent().putExtra( unity , cmdLine); mUnityPlayer = new UnityPlayer(this, this); setContentView(mUnityPlayer); mUnityPlayer.requestFocus(); ......
实际上重要就取决于这几行
protected UnityPlayer mUnityPlayer; ...... mUnityPlayer = new UnityPlayer(this, this); setContentView(mUnityPlayer);//←
大家要是照葫芦画瓢的把 UnityPlayer 写进一个 FrameLayout 里就可以了了:
private UnityPlayer mUnityPlayer; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create the UnityPlayer mUnityPlayer = new UnityPlayer(this); setContentView(R.layout.activity_sub); FrameLayout layout = (FrameLayout) findViewById(R.id.FrameLayout); LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layout.addView(mUnityPlayer.getView(), 0, layoutParams);
那样出来 UnityActivity 就可以显示信息在一个 FrameLayot 里了。
举个案子,Unity中有许多内嵌软件能够全自动操纵拍摄头,编译程序到移动应用平台时,应用这种软件能够考虑大部分分情景,不用附加程序编写,立即在 Unity 搞好后装包便可以了。可是如果你必须下列运用情景:
检验拍摄头视頻数据信息中的面部 自定美颜(CPU美颜优化算法)的情况下,应用Unity内嵌或拓展软件就无法进行这一每日任务了。这时候候,就必须 Unity 和移动应用平台交叉式开发设计,例如下列这套步骤
Android/iOS native app 实际操作拍摄头 - 获得视頻流数据信息 - 面部检验或美颜 - 传送给 Unity 3D渲染 - Unity作出大量的实际效果(ps滤镜/颗粒)
只之后发一篇安卓系统和 Unity 进程共享资源 eglcontext 的blog,先占个坑位。
参照材料:dengb.TechArticleAndroid/iOS嵌入Unity开发设计实例,嵌入 Unity 与 Android/iOS 交叉式开发设计关键有二种方法,以 Android 为例子,一是 Android 转化成 jar 或是 aar 包,导进到 unit...