广州凡科互联网科技有限公司

营业时间
MON-SAT 9:00-18:00

全国服务热线
18720358503

公司门店地址
广州市海珠区工业大道北67号凤凰创意园

Android/iOS嵌入Unity开发设计实例,嵌入

日期:2021-02-18 浏览:

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 在建新项目:
Unity 在建新项目: 最后工程项目构造以下:
Unity导出来

这时候备选择Export将会会提醒JDK相对路径配备错误,没事儿大家到 Preference - Externl Tools 设定相对路径


include ':unityLibrary'
project(':unityLibrary').projectDir = new File('..\\UnityProject\\androidBuild\\unityLibrary')

implementation project(':unityLibrary') implementation fileTree(dir: project(':unityLibrary').getProjectDir().toString() + ('\\libs'), include: ['*.jar']) // 自身新项目的配备
string name= app_name NativeAndroidApp /string string name= action_settings Settings /string // Add Code string name= game_view_content_description Game view /string // End /resources

点一下 AS 的 sync project,能看到早已多了一个 module:


如今大家能够立即应用这一 module 里的 java class 了。


做为Activity

如今大家的工程项目包括了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 的情景了。

做为subView

自然你可以能必须将 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...



网站知识

联系方式丨CONTACT

  • 全国热线:18720358503
  • 传真热线:18720358503
  • Q Q咨询:2639601583
  • 企业邮箱:2639601583@qq.com

首页
电话
短信
联系