使用Asset Graph来构建资源工作流

之前在做资源导入管理的时候,一直都是使用各种各样AssetImporter来分别处理,这其实也挺好的,但是我之前遇到的问题其中有一个就是假如我想修改某个资源的属性,这个属性和Importer中约束的不同的话,又会被改回去,后来就变成不停的细分更多的文件夹。

另外Asset Graph不单单能用作导入的处理,还可以用作资源的批量处理,通过使用它来实现自己的资源工作流。

首先安装通过Package Manager安装插件

然后右键Create -Asset Graph 创建一个Graph

下面我们实现一个简单的功能,将一个文件夹下的图片自动设为Sprite 常见的UI图片操作

第一个Load From Directory 节点用于选取文件夹

可以用来选定一个文件夹,作为导入器的时候需要将Respond To Asset Change勾选上

下面一个节点Split By Fiter 用于资源过滤,因为修改成Sprite的资源一定是Texture ,我们需要过滤只剩下Texture

这里还可以使用正则表达式对文件名进行额外的过滤

下面对所有过滤出来的Texture进行进一步处理 ,这里用到Overwirte Import Settings

当新建这个节点的时候需要选择类型,选定Texture

选定之后这个就会成为我们的模版文件,所有的都会和这个一样

你可以像正常图片一样,选择它的所有属性

这个配置就存在AssetGraph的SavedSettings下面,你之后也可以直接修改这个文件来修改资源模版

另外还有一个需要说明的事,AssetGraph在使用过程中会生成大量的Cache,在你使用版本控制的时候,需要将这些Cache文件夹添加到ignore中

与此同时打开Use As Postprocessor 作为资源后处理,这个时候所有的导入的资源都会遵循模版设置

当资源目录里的资源发生变动的时候就会批量修改资源与模版保持一致

另外需要说明一下这个Respond To Asset Change的作用 加入你想要让你的修改也生效的话 就取消勾选,如果一直遵循模版的设置勾选上

这就是一个简单的资源导入器的配置,类似的也可以方便的实现音频模型等的预处理


下面在看看如何利用Asset Graph来生成预制体的过程 包含了批量处理以及资源生成

上面是一个根据模型生成对应的材质处理,

先创建一个生成资源节点

生成的资源有三种路径可以选择 分别是缓存目录 选择的目录,和源文件目录,这里我选择源资源目录。

下面来创建自定义生成脚本,来对我们的逻辑进行自定义处理Window=》AssetGraph=>....

接下来就可以在之前的Generate Asset下选择到创建的脚本了

下面看看源码中生成的核心逻辑

Package/AssetGraph/Editor/System/Node/Buildin/AssetGenerator.cs这个脚本

需要注意的是IAssetGenerator接口中GenerateAsset返回false的时候就会抛出异常,中断生成,所以需要直接return false

[CustomAssetGenerator("Create Role Material", "v0.1", 1)]
    public class RoleMaterialGenerator : IAssetGenerator
    {
        [SerializeField] private string shaderName = "URP/Character";
        public bool CanGenerateAsset(AssetReference asset)
        {
            return true;
        }

        public bool GenerateAsset(AssetReference asset, string generateAssetPath)
        {
            bool generated = false;

            if (!string.IsNullOrEmpty(generateAssetPath))
            {
                var tempMat = AssetDatabase.LoadAssetAtPath<Material>(generateAssetPath);//已经生成过了 不在生成了
                if (tempMat != null)
                {
                    return true;
                }
                Material material = new Material(Shader.Find(shaderName));
                AssetDatabase.CreateAsset(material, generateAssetPath);
                generated = true;
            }

            //移动材质

            return generated;
        }

        public string GetAssetExtension(AssetReference asset)
        {
            return "_Mat.mat";
        }

        public Type GetAssetType(AssetReference asset)
        {
            return typeof(Material);
        }
        public void OnInspectorGUI(Action onValueChanged)
        {
            EditorGUILayout.TextField("Material Shader:", shaderName);
        }

        public void OnValidate(){}

        public static string FileNameWithoutSuffix(string name)
        {
            if (name == null)
            {
                return null;
            }

            int endIndex = name.LastIndexOf('.');
            if (endIndex > 0)
            {
                return name.Substring(0, endIndex);
            }
            return name;
        }

预制体也是差不多的操作

var go = AssetDatabase.LoadAssetAtPath<GameObject>(asset.importFrom);
GameObject objSource = (GameObject)PrefabUtility.InstantiatePrefab(go);
//其他变体处理
GameObject obj = PrefabUtility.SaveAsPrefabAsset(objSource, generateAssetPath);
UnityEngine.MonoBehaviour.DestroyImmediate(objSource);

我这里用原先的模型生成一个新的预制体变体,当需要换模型的时候直接更换模型就好了,其他就不需要做额外的操作,这里在这个预制体变体上在进行额外的处理,比如挂在脚本,添加动画等等。

当脚本都写完后点击执行Execute,就会进行处理了


上面就介绍了两种Asset Graph的简单实用,当然它能做的还不止于此,我用的还比较浅显,用它可以可视化节点化的定制资源工作流,尤其是资源的生成,往往模型很多 ,挂脚本,处理大量的相同操作,使用它能够带来巨大的便利

//

Addressable资源管理

本文详细讲解Nicelua框架集成Addressable资源管理系统的操作流程。
Nicelua地址: https://github.com/Justin-sky/Nice-Lua
依赖Unity Package:
Addressables 1.8.4
Asset Graph preview-1.7.2
准备资源托管服务器:
本文:60.1.1.12

1, 使用Asset Graph为资源设置Addressable和group

添加结点如上图,总共设置6个Group, 在Set Asset Address节点,设置Path Match Pattern如下:

将路径 Assets/AssetsPackage/ 替换为“”, 对Lua 目录添加了Label节点,本来想通过Label来一次性读取所有Lua文件进行预加载,但是读取后不能获取单个Lua文件的原始路径,因此,此处Label节点没什么用。

2,配置Addressables

选择对应平台,点击Execute,将按Asset Graph配置设置好资源的Addressables。

打开Addressables Groups窗口,配置好的Group如下:

3,配置Addressables Profiles

打开Addressables Profiles窗口,添加如下Profile:

本文在window上测试,后续操作都选择 production_win 这个profile, RemoteLoadPath:为:http://60.1.1.12/et/win/, 注意此处配置支持两种语法:

  • [BuildTarget] 方括号里可以使用Unity的全局变量
  • {Addressable.AddressableConfig.server_android_url} 大括号中可以直接引用类中的静态变量 ,(用此配置语法可以实现程序中动态修改资源更新地址)

4,配置静态资源和动态资源

目前我希望所有资源都打入到初始包中,首先配置AddressableAssetSettings:

注意设置此3处,

  • Profile In Use: production_win 前面配置的profile
  • Disable Catalog Update on Startup : 应用启动时不自动更新Catalog
  • Build Remote Catalog : 第一个Build时生成Remote Catalog, 不勾选无法增量更新

5. 配置Group

  • Build Path : 生成到本地的路径,在最终打包时自动复制到StreamingAssets目录
  • Load Path: 本地加载时的路径
  • Update Restriction: Cannot Change Post Release 由于我们想将初始group设置所静态资源打包到最终程序包中增量更新,因此此group生成的bundle打包后将不能修改。如果想全量更新,设选择Can Change Post Release ,当然,前面的Build Path和Load Path都修改为Remote配置。

6. 首次打包

在Addressables Groups窗口中,选择: Build / New Build / Default Build Script , 执行后:

在上面目录中将生成 Catlog 文件,里面包含所有本地资源的Addressables Path.

将上面的文件放入资源服务器中,游戏启动时去更新此catlog文件来检测是否需要更新资源 。

7. 资源Patch

当项目中资源发生修改后,

  • 在AssetGraph窗口中重新Execute, 将对新资源进行Addressable配置,
  • 然后在Addressables Groups窗口中,点击 Tools/Check for Content Update Restriction , 选择6 打包生成的bin

此时将自动分析出修改的文件,点击Apply Changes ,将生成新的group, 新group配置如下 :

最后,点击 Build / Update a Previous Build , 在ServerData目录中将更新catlog文件和生成新的patch bundle

将此目录中的文件放到资源服务器中,游戏启动时将检查并更新bundle.

Nice Lua框架中资源更新代码如下:

IEnumerator checkUpdate()
    {
        var start = DateTime.Now;


        var initHandle =Addressables.InitializeAsync();
        yield return initHandle;

        var a = Addressables.RuntimePath;
        var checkHandle = Addressables.CheckForCatalogUpdates(false);
        yield return checkHandle;
        Logger.Log(string.Format("CheckIfNeededUpdate use {0}ms", (DateTime.Now - start).Milliseconds));
        Logger.Log($"catalog count: {checkHandle.Result.Count} === check status: {checkHandle.Status}");
        if(checkHandle.Status == AsyncOperationStatus.Succeeded)
        {
            List<string> catalogs = checkHandle.Result;
            if (catalogs != null && catalogs.Count > 0)
            {
               
                needUpdateRes = true;

                statusText.text = "正在更新资源...";
                slider.normalizedValue = 0f;
                slider.gameObject.SetActive(true);

               
                start = DateTime.Now;
                AsyncOperationHandle<List<IResourceLocator>> updateHandle = Addressables.UpdateCatalogs(catalogs, false);
                yield return updateHandle;

                var locators = updateHandle.Result;
                Logger.Log($"locator count: {locators.Count}");

                foreach(var v in locators)
                {
                    List<object> keys = new List<object>();
                    keys.AddRange(v.Keys);

                    var sizeHandle = Addressables.GetDownloadSizeAsync(keys);
                    yield return sizeHandle;

                    long size = sizeHandle.Result;
                    Logger.Log($"download size:{size}");

                    if(size > 0)
                    {
                        UINoticeTip.Instance.ShowOneButtonTip("更新提示", $"本次更新大小:{size}", "确定", null);
                        yield return UINoticeTip.Instance.WaitForResponse();


                        var downloadHandle = Addressables.DownloadDependenciesAsync(keys, Addressables.MergeMode.Union);
                        while (!downloadHandle.IsDone)
                        {
                            float percentage = downloadHandle.PercentComplete;
                            Logger.Log($"download pregress: {percentage}");
                            slider.normalizedValue = percentage;

                            yield return null;
                        }
                        Addressables.Release(downloadHandle);
                    }
                }

                Logger.Log(string.Format("UpdateFinish use {0}ms", (DateTime.Now - start).Milliseconds));
                yield return UpdateFinish();

                Addressables.Release(updateHandle);
            }

            Addressables.Release(checkHandle);
        }
        

        needUpdateRes = false;

        ChannelManager.instance.resVersion = "112";
        ChannelManager.instance.appVersion = "1.0";
        yield return StartGame();

    }

Unity-AssetGraph 使用小结

1.创建一个AssetGeneratorScript

2. 加入自己喜欢的逻辑

3. 添加自己创建的方法

4. 创建CUI buildassetbundle.bat

5. 找到刚创建好的文件,Show in Explorer

6. 以上步骤都做完,我们可以关掉Unity了

7. CMD 环节

记录:

问题 1 :在生成prefab的时候,想把图片TextureImportSetting压缩格式,sRGB等属性也一起设置了,然后发现了override platform 不生效,然后搜了一下,assetgraph override import setting doesn't work

https://github.com/Unity-Technologies/AssetGraph/issues/155

看了一下代码,发现生成了一份本地setting.asset,这个本地文件是一直都没有勾上的。

我们只需要找到本地生成的setting.asset文件,然后勾上override就好了~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity Asset Store是Unity官方提供的一个资源库,可以在其中下载各种Unity相关的资源,包括模型、贴图、音效、插件等等。使用Unity Asset Store需要以下步骤: 1. 打开Unity编辑器,在菜单栏中选择“Window”->“Asset Store”打开Asset Store窗口。 2. 在Asset Store窗口中可以浏览各种资源,可以按照分类、关键字等进行搜索。 3. 找到需要的资源后,点击“Download”按钮进行下载。如果是免费资源,可以直接下载;如果是付费资源,需要先购买。 4. 下载完成后,可以在Unity编辑器中的“Assets”窗口中找到下载的资源,可以直接拖拽到场景中使用。 需要注意的是,使用Asset Store下载的资源需要遵守相应的使用协议,不得用于商业用途等违反协议的行为。 ### 回答2: Unity Asset Store是Unity游戏引擎的一个商店,在这个商店中,用户可以浏览、购买、下载和使用各种游戏开发资源,比如模型、纹理、材质、脚本等。Unity Asset Store的使用非常简单,下面就来详细讲解一下。 第一步,打开Unity编辑器,在窗口上方点击“Window”,然后选择“Asset Store”菜单。这样就会打开Asset Store的窗口。 第二步,在Asset Store的窗口中,可以浏览不同的资源类别,或者搜索特定的资源。您可以使用标签过滤器和搜索框以更快地找到所需资源。 第三步,找到需要的资源后,点击资源卡片以查看详细信息、演示视频、评分、评论等,并查看资源包含的文件和示例。 第四步,如果您决定购买资源,先登录到Unity账户,选择所需的许可证类型,并点击“Add to Cart”按钮。确认购物车中的内容,并点击“Checkout”按钮。跟随屏幕上的指导,完成付款。 第五步,下载资源包,并导入到您的项目中。可以在“Assets”窗口中查看刚才导入的资源。如果资源包含脚本,则需要将脚本添加到场景对象或项目中。 第六步,使用导入的资源完成您的游戏开发工作,可以在您的项目中查看资源的许可证和使用条款。 总的来说,Unity Asset Store可以帮助游戏开发者更快地创建游戏,节省时间和资源,同时提高游戏的品质和体验。希望以上步骤能帮助您了解如何在Unity Asset Store中使用及购买所需的资源。 ### 回答3: Unity的Asset Store是一种在线资源库,可以让Unity用户获得免费或付费的资源,如3D模型、音效、脚本等,以便在游戏开发中使用。在这里,我将介绍Unity Asset Store的使用方法。 第一步:登录Unity账号 首先,你需要有一个Unity账号,如果没有,可以在Unity的官网上注册。注册后,登录您的Unity账号。 第二步:打开Asset Store 打开Unity编辑器,在编辑器左上角点击Asset Store,即可打开Asset Store。在Installer中可以查看与编辑器安装在一起的内容,而在Assets中可以查看和购买或免费下载特定的资产,如:硬表面模型,粒子系统等。 第三步:浏览和搜索资源 在Asset Store的主页面,你可以浏览热门资源,新资产,功能和编辑器扩展,或在搜索栏中输入关键词来搜索你需要的资源。 第四步:选择并下载资源 当你发现需要的资源后,可以单击资源的缩略图,然后查看更多信息,如相关文件、价格、作者等。如果你想要下载或购买,可以单击对应的按钮。在下载和购买之前,您需要确保资源是与您的Unity版本兼容的。 第五步:使用资源 在下载完成后,资源将自动添加到Unity项目中的Asset文件夹中。您可以创建一个新场景,从新的要素窗格中将其拉出。使用资产,您也可以在视图窗口中拖动资源到场景中,然后使用它们来构建游戏内的元素。 总结: Unity Asset Store是一个强大的工具,可以让Unity用户快速而方便地获取所有类型的资源,以便在他们的游戏中使用使用Asset Store并不需要太多的技能或知识,只需要登录账户,浏览和搜索资源,选择并下载资源,然后在Unity项目当中使用它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值