IOS使用Unity容器动态加载3D模型

news/2024/7/20 22:49:08 标签: ios, unity, 3d

项目背景

我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互。而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案。

对于Unity容器来说,需要满足如下的功能:

1.在APP启动时,需要满足动态下载最新的模型文件。

2.在点击藏品查看模型时,需要根据不同的参数展示不同的模型,并且在页面消失后,自动卸载对应的模型。

如果要实现上面说的功能则是需要使用Unity的打包功能,将资源打包成AssetBundle资源包,然后把ab包进行上传到后台服务器,然后在APP启动时从服务器动态下载,然后解压到指定的目录中。

当用户点击藏品进入到Unity容器展示3D模型时,则可以根据传递的模型名称和ab包名,从本地的解压目录中加载对应的3D模型。

AssetBundle打包流程

创建AB打包脚本

AB包打包是在Editer阶段里。

首先要创建一个Editer目录并把脚本放置到这个目录下面,注意它们的层级关系:Assert/Editor/CS脚本,这个层级关系是固定的,不然会报错。

0

脚本实现如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

using UnityEditor;

using System.IO;

/// <summary>

///

/// </summary>

public class AssetBundleEditor

{

    //1.编译阶段插件声明

    [MenuItem("Assets/Build AssetBundles")]

    static void BuildAssetBundles() {

        string dir = "AssetBundles";

        if (!Directory.Exists(dir)) {

            //2.在工程根目录下创建dir目录

            Directory.CreateDirectory(dir);

        }

        //3.构建AssetBundle资源,AB资源包是一个压缩文件,可以把它看成是一个压缩的文件夹,里面

        //可能包含多个文件,预制件,材质,贴图,声音。

        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.iOS);

    }

}

设置需要打包的资源

可以在Project选中一个资源(预制件,材质,贴图,声音等),然后在Inspector下面的AssetBundle设置打包成的名称和后缀。如果名称带层级的如:scene/cube,那么打出来的AB包会自己添加一个scene目录,然后在目录下存在了cube资源包。

AB包可以存在依赖关系,比如GameObjectA和GameObjectB共同使用了Material3, 然后它们对应的AssetBundle名称和后缀分别为cube.ab, capsule.ab, share.ab。

虽然GameObjectA中包含了Material3资源,但是 AssetBundle在打包时如果发现Material3已经被打包成了share.ab, 那么就会只打GameObjectA,并在里面设置依赖关系就可以了。

0

使用插件工具进行打包

1.从gitHub上下载源码,然后将代码库中的Editor目录下的文件复制一份,放到工程Target的Assets/Editor目录下。打开的方式是通过点击Window->AssetBundle Browser进行打开

插件工具地址:GitHub - Unity-Technologies/AssetBundles-Browser: Editor tool for viewing and debugging asset bundle contents before and after builds

0

2.打包时,可以选择将打出的ab包内置到项目中,勾选Copy StreamingAssets ,让打出的内容放置在StreamingAssets目录下,这样可以将ab资源内置到Unity项目中。

3.通过上面的操作会完成资源打包,然后将打包的产物压缩上传到后台。

03d3e617a.png" width="896">

AssetsBundle资源包的使用

APP启动时,下载AssetBundle压缩包, 然后解压放置在沙盒Documents/AssetsBundle目录下,当点击APP中的按钮进入到Unity容器页面时,通过包名加载对应的ab包进行Unity页面展示。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

/// <summary>

 ///读取原生沙盒Documents/AssetsBundle目录下的文件,Documents/AssetsBundle下的文件通过Native原生下载的资源

 /// </summary>

 /// <param name="abName">Documents/AssetsBundle下的ab文件</param>

 /// <returns>读取到的字符串</returns>

 public static AssetBundle GetNativeAssetFromDocumentsOnProDownLoad(string abName)

 {

     string localPath = "";

     if (Application.platform == RuntimePlatform.Android)

     {

         localPath = "jar:file://" + Application.persistentDataPath + "/AssetsBundle/" + abName;

     }

     else

     {

         localPath = "file://" + Application.persistentDataPath + "/AssetsBundle/" + abName;

     }

     UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(localPath);

     var operation = request.SendWebRequest();

     while (!operation.isDone)

     { }

     if (request.result == UnityWebRequest.Result.ConnectionError)

     {

         Debug.Log(request.error);

         return null;

     }

     else

     {

         AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(request);

         return assetBundle;

     }

     //UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(localPath);

     //yield return request.Send();

     //AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(request);

     //return assetBundle;

 }

注意:当离开Unity容器时需要卸载里面加载的ab包

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public


http://www.niftyadmin.cn/n/5410634.html

相关文章

【《高性能 MySQL》摘录】第 9 章 操作系统和硬件优化

文章目录 9.1 什么限制了MySQL的性能9.2 如何为 MySQL 选择 CPU9.2.1 哪个更好&#xff1a;更快的 CPU 还是更多的 CPU9.2.2 CPU架构9.2.3 扩展到多个CPU和核心 9.3 平衡内存和磁盘资源9.3.1 随机 I/O 和顺序 I/O9.3.2 缓存&#xff0c;读和写9.3.3 工作集是什么9.3.4 找到有效…

java接口(interface)的编写以及实现(implements)

在Java中编写接口可以按照以下步骤进行操作&#xff1a; 首先定义一个新的文件并使用.java为后缀名。这将成为我们要创建的接口所在的类文件。 在该文件中&#xff0c;使用关键字 interface 来声明一个接口。例如&#xff1a;public interface MyInterface { }。 在接口内部&…

高性能的key-value数据库Redis 介绍

Redis 是一个高性能的key-value数据库。 Redis是一个开源的键值存储系统&#xff0c;通常用于缓存和消息传递。它支持多种类型的数据结构&#xff0c;如字符串、列表、集合、散列表和有序集合等。Redis的特点是提供了高性能、灵活性和可伸缩性。 Redis的主要特点包括&#xff…

52.2k star! 自己部署gpt4free, 免费使用各种GPT

GPT4Free是一个由开发者Xtekky在GitHub上发布的开源项目&#xff0c;它可以免费地使用GPT-3.5、GPT-4、llama、gemini-pro、bard、claude等多种大模型。截止到当前(2024.1.30)已经有52.2k star&#xff0c;可见其受欢迎程度。 github地址&#xff1a;https://github.com/xtekky…

Objective-C blocks 概要

1.block的使用 1.1什么是block&#xff1f; Blocks是C语言的扩充功能&#xff1a;带有自动变量&#xff08;局部变量&#xff09;的匿名函数。 “带有自动变量”在Blocks中表现为“截取自动变量" “匿名函数”就是“不带名称的函数” 块&#xff0c;封装了函数调用及调用…

【操作系统学习笔记】文件管理3.4

【操作系统学习笔记】文件管理3.4 参考书籍: 王道考研 视频地址: Bilibili 磁盘管理 磁盘初始化 进行低级格式化&#xff0c;将磁盘的各个磁道划分为扇区。一个扇区通常可划分为头、数据区域、尾三个部分。头尾一般放置管理扇区所需要的各种数据结构&#xff0c;包括扇区校…

【Java】CAP理论以及它的实际应用案例

目录 简介 不是所谓的“3 选 2” CAP 实际应用案例 总结 CAP 理论/定理起源于 2000年&#xff0c;由加州大学伯克利分校的Eric Brewer教授在分布式计算原理研讨会&#xff08;PODC&#xff09;上提出&#xff0c;因此 CAP定理又被称作 布鲁尔定理&#xff08;Brewer’s the…

每日shell脚本之自动化备份管理镜像

每日shell脚本之自动化备份管理镜像 #!/bin/bash h_sl(){echo "-------------------" } save(){if [ ! -d "./images" ]; thenmkdir imagesficd imagesdocker images --format "{{.ID}} {{.Repository}}:{{.Tag}} {{.Size}}" > images_pull.…