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

这篇具有很好参考价值的文章主要介绍了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脚本,这个层级关系是固定的,不然会报错。

IOS使用Unity容器动态加载3D模型,ios,unity,3d

脚本实现如下:

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,并在里面设置依赖关系就可以了。

IOS使用Unity容器动态加载3D模型,ios,unity,3d

使用插件工具进行打包

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

IOS使用Unity容器动态加载3D模型,ios,unity,3d

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

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

IOS使用Unity容器动态加载3D模型,ios,unity,3d

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文章来源地址https://www.toymoban.com/news/detail-841167.html

到了这里,关于IOS使用Unity容器动态加载3D模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity3D中Resources动态加载图片

    问题:unity的Resources动态加载就不必多说了,这里出现的问题是当我把图片放入Resources文件夹后,使用Resources.Load(datapath)却并没有出现图片。 分析:由于你放在文件夹下的是图片,是Texture2D类型,但是实际用在u3d中的是sprite,所以需要转换类型。 方式: 1.在代码中先行创

    2024年02月11日
    浏览(27)
  • Unity 3D模型展示框架篇之资源打包、加载、热更(二)

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程。增加了Asset Bundle+ILRuntime热更新技术流程。 本篇文章介绍如何对更新进行代码检测以及使用更新资源服务器进行资源热更新。 创建登录UI预制体 Log

    2023年04月20日
    浏览(36)
  • Unity的AssetBundle系统来动态加载FBX模型

    在Unity中,可以使用C#脚本和Unity的AssetBundle系统来动态加载FBX模型。以下是一个简单的示例,演示如何动态加载FBX模型: 准备FBX模型 首先,准备一个或多个FBX模型,并将它们导入到Unity项目中。确保每个FBX模型都有一个独立的游戏对象,并且已经被正确地设置为“Static”或“

    2024年02月06日
    浏览(31)
  • Unity动态加载外部服务器上的FBX模型

    去年某项目需要从后端服务器上加载FBX模型,但是整个项目中只有很少的地方需要用到动态模型替换,并且项目交付后需要外行人员也能轻松上手更换需要动态加载的模型,所以需要实现一个简单的模型打包和动态模型加载功能。 1.创建一个新的脚本,编写如下代码 2.回到

    2024年02月11日
    浏览(37)
  • Unity运行时程序动态加载外部.fbx.obj模型文件

    项目中有用到这个需求,为实现Unity程序运行状态下,从程序外部动态加载fbx或obj模型,所以研究了一下,目前TriLib比较靠谱,好用,多平台适用。会提供 下载插件地址。 unity运行时加载fbx 使用的插件 下载插件地址 将Trilib压缩包内容解压到Unity工程Assets文件夹下,返回工程等

    2024年02月16日
    浏览(34)
  • Unity开发——移动端实用特性使用(安卓/IOS)

    如何让屏幕保持常亮?如何获取手机当前电量?如何…? 接下来列举一些实用特性和方法: 1.防止屏幕休眠,从而让屏幕保持常亮 SleepTimeout.NeverSleep是一个特殊的值,它会禁止屏幕进入休眠状态,因此屏幕会保持常亮。 注意,这个设置可能会导致用户的电池电量消耗增加 ,

    2024年02月15日
    浏览(27)
  • [unity3d][通过代码]让模型移动,动态改变模型位置,点对点移动

    阅读时长 : 10分钟 阅读难度 : 初级 阅读收获 : 可以在unity自由的完成点对点的移动过程 例子地址 : https://gitee.com/asiworld/unity3d-basic-function-code 直接修改 gameobject 的 position 内容,当然物体实际存在的有localposition和worldposition,具体要使用哪个要看需求是怎么样的 在hierarchy视图中创

    2023年04月24日
    浏览(37)
  • GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条

            游戏在转换场景的时候,需要花费时间来加载相关的资源。而这个过程往往因为游戏场景的规模和复杂度以及玩家电脑配置的原因花费一小段时间(虽然这个项目里用不到)。         所以,如果这一小段时间,画面就卡在这里,啥也做不了,玩家也不知道啥时候能

    2024年02月02日
    浏览(38)
  • 【Unity嵌入原生IOS,仅退出Unity应用】

    官方的说法是这样的: 调用此方法可完全卸载 Unity,并在 Unity 退出后接收对 UnityFrameworkListener 的回调。Unity 将释放所有内存。 注意:进行此调用后,您将无法在同一进程中再次运行 Unity。可在 AppController 上设置 quitHandler 以覆盖默认进程终止。 所以官方提供了一个卸载的方

    2024年02月11日
    浏览(39)
  • Unity与iOS交互(1)——需要了解的IOS相关知识

    【前言】 以下只是简要介绍,详细的内容需要自己去看链接  【Objective-C基础知识】 .h .m .mm .cpp文件区别 .h是头文件扩展名。头文件包含类,类型,函数和常数的声明,这里的定义一般是Public的 .m是实现文件扩展名。其包含源代码,用于.h文件中的实现,一般是private的。这是

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包