三、配置带HybridCLR的ARCore开发环境

news2024/11/19 4:20:27

预告

本专栏将介绍如何使用这个支持热更的AR开发插件,快速地开发AR应用。

专栏: Unity开发AR系列

插件简介

通过热更技术实现动态地加载AR场景,简化了AR开发流程,让用户可更多地关注Unity场景内容的制作。

“EnvInstaller…”支持HybridCLR和ARCore的一键安装。

“AR SDK…”基于HybridCLR和ARFoundation实现,使热更技术贯穿AR开发的全流程。

包含热更数据制作与导出、热更数据上传与下载、热更数据的版本控制与数据加载

资源下载

百度网盘链接:链接 提取码:jaiw

文件目录

配置AR开发环境

在前面的《使用插件一键安装》已介绍如何使用插件导入ARFoundation(ARCore)和HybridCLR的相关Package,这里仅介绍必须修改的设置。

导入AR SDK

  1. 通过“Assets -> Import Package -> Custom Package…”的方式导入 “AR SDK_v1.0.1.x.unitypackage”。导入成功后,菜单栏出现“Holo-XR”栏目。

  2. 点击“Holo-XR > Settings”,打开设置窗口。

    • (必需)勾选“热更新”启用SDK中涉及HybridCLR的脚本。

    • (必需)勾选“ARCore”,启用ARFoundation。(此处由于通过EnvInstaller安装的是ARCore,因此这里选用ARCore。目前也支持启用其它平台,将在后续文档中讲述。)

    • (可选)勾选“调试模式”和“打印日志”(勾选后,使用“EqLog.log(…)”)

Settings修改

使用ARFoundation

  1. 导入 “AR Foundation”和“ARCore Extensions for AR Foundation ”。

建议使用《使用插件一键安装》介绍的插件一键导入 ARCore的所有依赖。
此外,也可参考官方文档《AR Foundation 使用入门》按照步骤逐步导入。

  1. 转到 File > Build Settings 以打开 Build Settings 窗口,点击 Player Settings,修改3处地方。
Player Settings > …
Other Settings > Rendering取消选中 Auto Graphics API。 如果 Vulkan 列在 Graphics APIs 下,请将其移除,因为 ARCore 尚不支持 Vulkan。
Other Settings > Minimum API Level这里要构建 AR 必备应用,请指定 Android 7.0 ‘Nougat’ (API Level 24) or higher
Other Settings > Scripting Backend选择 IL2CPP(而非 Mono),Level切换为 .NET Framework(而非**.Net Standard 2.x**)。(注意:Unity 2020及其以下版本,切换为.NET 4.x)

示意图如下:

Player Settings修改

Player Settings修改

  1. 转到 Edit > Project Settings 以打开 Project Settings 窗口,点击XR Plug-in Management,启用ARCore。
Settings修改
  1. 转到ARCore,修改为深度可选的AR必备应用。
Settings修改

配置HybridCLR

  1. 检查HybridCLR Installer的状态

通过菜单栏 > HybridCLR > Installer…,打开HybridCLR Installer窗口,检查Installed的状态值是否为True。若为False,则点击Install按钮。

  1. 转到 File > Build Settings 以打开 Build Settings 窗口,点击 Player Settings,修改如下内容。这是使用HybridCLR所必需的。

HybridCLR同样需要修改为IL2CPP和切换为 .Net 4.x(Unity 2019-2020) 或 .Net Framework(Unity 2021+),由于上节内容已修改,这里不再重复。

  • 关闭增量GC

此前"HybridCLR"仅商业版支持增量GC,现在社区版已在2023年8月28日支持增量GC。若不关闭增量GC,则需要替换HybridCLR4.0以上版本。

Player Settings修改

  • 关闭代码裁剪

若要启用代码裁剪,则需补充元数据(此处关闭代码裁剪,可避免很多方法找不到的异常问题。若不关闭,则需要针对缺失的内容补充元数据)。

Player Settings修改

  1. 划分程序集

请阅读文档配置程序集了解如何配置程序集。

划分程序集:
项目代码必须合理拆分为AOT(即编译到游戏主包内)程序集 和 热更新程序集,才能进行热更新。HybridCLR对于 怎么拆分程序集并无任何限制,甚至可以把第三方工程中的代码作为热更新程序集。一般来说,游戏刚启动时,至少需要一个AOT程序集来负责启动及热更新相关工作。

这里以AR SDK中的示例为例,AR SDK中包含如下程序集定义

程序集类型简介
Holo.Demo热更程序集包含各单项功能示例的程序集,示例Demo中使用
DynamicScene热更程序集AR动态场景示例的程序集,示例Demo中使用
Holo.RuntimeAOT程序集AR SDK核心程序集,已编译成dll并添加至项目中。
Assembly-CSharpAOT/热更都可Unity的默认全局程序集

Assembly-CSharp是Unity默认的程序集,这里可做AOT程序集,也可做热更程序集。

若要自定义热更数据集,则可通过“Assets > Create > Assembly Definition”的方式创建程序集。

  1. 配置热更新程序集

注意:如果把Assembly-CSharp作为AOT程序集,强烈建议关闭热更新程序集的auto reference选项。因为Assembly-CSharp是最顶层assembly,它会自动引用剩余所有assembly。

当确定要使用哪些程序集作为热更程序集后,那么需要在HybridCLR Settings中,将这些程序集添加至“hotUpdateAssemblyDefinitions”或“hotUpdateAssemblies”。

操作步骤

  • 点击菜单 “HybridCLR > Settings” 打开配置界面。
  • 将Assembly Definition(asmdef)方式定义的程序集,加入hotUpdateAssemblyDefinitions
  • 将普通dll或"Assembly-CSharp"加入hotUpdateAssemblies(不需要’.dll’后缀)

注意事项

  • hotUpdateAssemblyDefinitions和hotUpdateAssemblies列表是等价的,不要重复添加,否则会报错。
  • 如果热更新程序集是已经编译好的dll(无论放在Assets下还是其他目录),必须同时在 HybridCLR/Settings的外部dll搜索路径中配置它的搜索路径。 搜索路径为相对路径,相对于项目根目录(也就是Assets的父目录)。

参考示例

  • 这里将“Holo.Demo”和“DynamicScene”两个程序集作为热更的程序集,则可参考下面的操作截图。

Settings修改

  1. 生成AOT dll

    • 运行菜单 HybridCLR/Generate/All 一键执行必要的生成操作

    这里只需要执行"Genrate > All"即可,若需了解更多,请参考<<HybridCLR 打包工作流>>。

  2. 补充元数据

    在执行上一步操作后,生成的裁剪后的AOT dll可以用于补充元数据。HybridCLR插件会自动把它们复制到{project}/HybridCLRData/AssembliesPostIl2CppStrip/{target}

    注意,不同BuildTarget的裁剪AOT dll不可复用。

    打开“Assets/HybridCLRGenerate/AOTGenericReferences.cs”文件,查看需要补充的元数据。

    using System.Collections.Generic;
    public class AOTGenericReferences : UnityEngine.MonoBehaviour
    {
    
        // {{ AOT assemblies
        public static readonly IReadOnlyList<string> PatchedAOTAssemblyList = new List<string>
        {
    		"UnityEngine.AndroidJNIModule.dll",
    		"UnityEngine.CoreModule.dll",
    		"mscorlib.dll",
        };
    }
    

    可见,需要补充的dll有以下3个。

     "UnityEngine.AndroidJNIModule.dll",
     "UnityEngine.CoreModule.dll",
     "mscorlib.dll",
    

    打开HybridCLR Settings,在“Patch AOT Assemblies”中添加。

    补充元数据

注意:

补充元数据没有加载顺序的要求。这里使用的是HybridCLR社区版本,补充元数据加载后,大约会占用6倍dll大小的内存,而且这些内存无法回收。若对内存有较高的要求,需要使用HybridCLR商业版本的完全泛型共享技术,不再需要补充元数据,节省这部分内存。请转至 HybridCLR文档《基于补充元数据的泛型函数实例化技术》


至此环境已搭建完成,后续将结合示例讲述如何实现一个示例程序。


补充说明

AR Foundation注意事项

内置渲染管线和通用渲染管线都与 AR Foundation 软件包兼容,但 URP 需要额外的步骤进行配置。
参考文档《AR Foundation 使用入门》

HybridCLR技巧

  • 优化打包流程

    HybridCLR/Generate/All 命令运行过程中会执行一次导出工程,以生成裁剪后的AOT dll。这一步对于大型项目来说可能非常耗时,几乎将打包时间增加了一倍。如果需要优化打包时间,可以按照如下流程一次出包。

    • 运行 HybridCLR/Generate/LinkXml
    • 导出工程
    • 运行 HybridCLR/Generate/Il2cppDef
    • 运行 HybridCLR/Generate/MethodBridge生成桥接函数
    • 运行 HybridCLR/Generate/PReverseInvokeWrapper。 不需要与lua之类交互的项目可跳过此步。
    • {proj}\HybridCLRData\LocalIl2CppData-{platform}\il2cpp\libil2cpp\hybridclr\generated目录 替换导出工程中的此目录。
    • 在导出工程上执行build

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1662123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java JVM 浅析

为什么要有JVMJVM是什么&#xff1f;JVM的工作流程和组成部分JVM规范和JVM实现JVM原理详解 带着以上问题&#xff0c;我将尝试对JVM作出一些简单的介绍。 一、JVM 简介 在90年代初&#xff0c;软件开发面临一个大问题&#xff0c;即不同的操作系统和硬件架构要求开发不同的版本…

【Java代码审计】代码审计的方法及常用工具

【Java代码审计】代码审计的方法及常用工具 代码审计的常用思路代码审计辅助工具代码编辑器测试工具反编译工具Java 代码静态扫描工具 代码审计的常用思路 1、接口排查&#xff08;“正向追踪”&#xff09;&#xff1a;先找出从外部接口接收的参数&#xff0c;并跟踪其传递过…

3DGS+3D Tiles融合已成 ,更大的场景,更细腻的效果~

最近国外同行Kieran Farr发布了一个他制作的3D GussianSplatting(高斯泼溅)Google Map 3D Tiles的融合叠加的demo案例&#xff08;如下所示&#xff09;。 准确来说这是一个数据融合的实景场景&#xff0c;该实景场景使用了倾斜三维和3D GussianSplatting两种实景表达技术&…

深入理解Java TreeSet:实现与使用案例分析

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

【WPF学习笔记(一)】WPF应用程序的组成及Window类介绍

WPF应用程序的组成及Window类介绍 WPF应用程序的组成及Window类介绍前言正文1、WPF介绍1.1 什么是WPF1.2 WPF的特点1.3 WPF的控件分类 2、XAML介绍2.1 XAML的定义2.2 XAML的特点2.3 XAML的命名空间 3、WPF应用程序组成3.1 App.config3.2 App.xaml3.3 App.xaml.cs3.4 MainWindow…

react18【实战】tab切换,纯前端列表排序(含 lodash 和 classnames 的安装和使用)

技术要点 动态样式 className{tabItem ${currentType item.value && "active"}}安装 lodash npm i --save lodash使用 lodash 对对象数组排序&#xff08;不会改变源数组&#xff09; _.orderBy(dataList, "readNum", "desc")src\De…

十二种网络威胁防护方案

一、SQL注入 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服务器执行非授权的任…

Python之数据分析基础

导言&#xff1a; “21世纪的竞争是数据的竞争&#xff0c;谁掌握数据&#xff0c;谁就掌握未来”。如何将大量看似杂乱无章的数据进行聚合&#xff0c;并发现潜在的规律也变得越来越重要。本文将先说明数据分析的步骤&#xff0c;再通过python完成实例数据的处理、分析最终展…

19.接口自动化-Jekins学习

1.CI-持续集成 频繁的&#xff08;一天多次&#xff09;将代码集成到主干 目的&#xff1a;让产品快速迭代&#xff0c;保持高质量 好处&#xff1a; 快速发现错误&#xff0c;每次更新都集成到主干&#xff0c;可以快速发现错误&#xff0c;定位错误也容易防止分支大幅偏离主…

示波器基础1-带宽

数字示波器最重要的基本特征之一是其带宽&#xff0c;了解带宽及其对技术指标的影响对于选择合适的示波器非常有帮助。 这里我们对示波器带宽的一些基本方面做一简要介绍。 当我们谈到示波器的带宽时&#xff0c;重要的是要区分模拟带宽和数字带宽。模拟带宽主要受仪器模拟输入…

TriCore: Architecture

说明 本文是 英飞凌 架构文档 TriCore TC162P core archiecture Volume 1 of 2 (infineon.com) 的笔记&#xff0c;稍作整理方便查阅&#xff0c;错误之处&#xff0c;还请指正&#xff0c;谢谢 :) 1. Architecture 2. General Purpose & System Register 名词列表&#…

Spring Cloud Alibaba 网关 Gateway 集成(7)

项目的源码地址 Spring Cloud Alibaba 工程搭建&#xff08;1&#xff09; Spring Cloud Alibaba 工程搭建连接数据库&#xff08;2&#xff09; Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用&#xff08;3&#xff09; Spring Cloud Alibaba Ribbo…

用标准的GNU/Linux命令替换Alpine上的精简版命令

Alpine Linux 是一个基于 musl libc 和 busybox 的轻量级Linux发行版&#xff0c;busybox 实现了很多常用类Unix命令的精简版&#xff0c;特点是体积很小&#xff0c;舍弃了很多不常用参数&#xff0c;我们简单对比一下标准Linux自带的 date 命令 和 Alpine下默认的 date 命令便…

Babel基础知识及实现埋点插件

目录 前言 AST 遍历 Visitors Paths&#xff08;路径&#xff09; Paths in Visitors&#xff08;存在于访问者中的路径&#xff09; State&#xff08;状态&#xff09; Scopes&#xff08;作用域&#xff09; Bindings&#xff08;绑定&#xff09; API babylo…

LeetCode 112. 路径总和 || LeetCode 113. 路径总和ii

LeetCode 112. 路径总和 1、题目 题目链接&#xff1a;112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true…

唤醒手腕 Go 语言 并发编程、Channel通道、Context 详细教程(更新中)

并发编程概述 ​ 一个进程可以包含多个线程&#xff0c;这些线程运行的一定是同一个程序&#xff08;进程程序&#xff09;&#xff0c;且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位&#xff0c;线程是调度运行的基本单位&#xff0c…

CentOS 7安装配置docker

CentOS 7、8安装、配置docker 这里宿主机的型号选择是centos7.9.2009的版本 1.宿主机关闭防火墙和selinux&#xff0c;配置ipv4 #设置SELinuxdisabled vim /etc/selinux/config SELinuxdisabled 查看防火墙状态&#xff1a;firewall-cmd --state 关闭防火墙&#xff1a;syst…

C# WinForm —— 14 CheckedListBox 复选列表框介绍

1. 简介 类似 ListBox&#xff0c;提供项的列表&#xff0c;区别就是 CheckedListBox 每一个项前面有个复选框 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 ckl 开头BackColor背景颜色BoderStyle边框样式&#xff1a;无、FixedSingle、F…

探索静态住宅代理IP:网络安全的隐形守护者

在当今这个数字化高速发展的时代&#xff0c;网络安全问题愈发凸显其重要性。无论是企业级的网络运营&#xff0c;还是个人用户的网络活动&#xff0c;都需要一个安全、稳定的网络环境。而在这个环境中&#xff0c;静态住宅代理IP以其独特的优势&#xff0c;逐渐成为了网络安全…

如何通过PHP语言实现远程控制空调

如何通过PHP语言实现远程控制空调呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制空调&#xff0c;通过不同规格的通断器&#xff0c;来控制不同功率的空调的电源。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称…