首页 > 其他分享 >【Unity3D】资源管理

【Unity3D】资源管理

时间:2023-10-21 15:12:46浏览次数:49  
标签:Unity3D Assets Test AssetDatabase Addressables PlayerPrefs 资源管理 Resources

1 前言

​ Unity 中资源管理方案主要有 Resources、TextAsset、ScriptableObject 、AssetDatabase、PlayerPrefs、Addressables、AssetBundle、SQLite,本文将介绍其中大部分方案。

2 Resources

​ Resources 主要用于加载资源,被加载的资源需要放在 Resources 目录下,可以在 Assets 的任何子目录下创建 Resources 目录,Unity 会自动检索到这些 Resources 目录。

​ Test_Resources.cs

using UnityEngine;

public class Test_Resources : MonoBehaviour {
    private void Awake() {
        GameObject cube = Resources.Load<GameObject>("CubePrefab");
        Material cubeMat = Resources.Load<Material>("CubeMat");
        cube.GetComponent<Renderer>().material = cubeMat;
        Instantiate(cube);
    }
}

3 TextAsset

​ TextAsset 主要用于加载文本、表格文件,官方介绍见→TextAsset

img

​ Test_TextAsset.cs

using UnityEngine;

public class Test_TextAsset : MonoBehaviour {
    [SerializeField]
    private TextAsset heightDatas;

    private void Awake() {
        string[] textInLines = heightDatas.text.Split('\n');
        for (int i = 1; i < textInLines.Length; i++) {
            string[] values = textInLines[i].Split(",");
            string name = values[0];
            int age = int.Parse(values[1]);
            float height = float.Parse(values[2]);
            Debug.Log("name=" + name + ", age=" + age + ", height=" + height);
        }
    }
}

​ 打印如下。

img

4 ScriptableObject

​ ScriptableObject 主要用于持久化数据、项目参数配置、角色参数配置等,官方介绍见→ScriptableObject,主要回调函数如下,继承 ScriptableObject 后,重写下述方法即可在相应状态下自动回调。

img

​ SOData.cs

using UnityEngine;

public class SOData : ScriptableObject {
    [SerializeField]
    private string _name; // 姓名
    [SerializeField]
    private int _age; // 年龄
    [SerializeField, Range(1f, 2.3f)]
    private float _height; // 身高

    public string Name => _name;
    public int Age => _age;
    public float Height => _height;
}

​ 编译后,在 Assets 窗口右键,依次选择【Create→SOData】,创建对象,并重命名为 SOData_1。选中 SOData_1 对象后,在 Inspector 窗口可以调整属性,如下。

img

5 AssetDatabase

​ AssetDatabase 用于加载资源,仅在 Unity 编辑器模式下使用,官方介绍见→AssetDatabaseBatching with the AssetDatabase

AssetDatabase.CopyAsset("Assets/Asset1.txt", "Assets/Text/Asset1.txt"); // 复制资源
AssetDatabase.MoveAsset("Assets/Asset2.txt", "Assets/Text/Asset2.txt"); // 移动资源
AssetDatabase.DeleteAsset("Assets/Asset3.txt"); // 删除资源
AssetDatabase.ImportAsset(path1, ImportAssetOptions.Default); // 导入资源
GameObject cube = AssetDatabase.LoadAssetAtPath<GameObject>("Assets/Loader/CubePrefab.prefab"); // 加载资源

​ Test_AssetDatabase.cs

using UnityEditor;
using UnityEngine;

public class Test_AssetDatabase {

    [MenuItem("Custom/Import Cube")]
    public static void ImportImage() {
        // 导入Cube预设体
        string path1 = "Assets/Loader/CubePrefab.prefab";
        AssetDatabase.ImportAsset(path1, ImportAssetOptions.Default);
        GameObject cube = AssetDatabase.LoadAssetAtPath<GameObject>(path1);
        // 导入Cube材质
        string path2 = "Assets/Loader/CubeMat.mat";
        AssetDatabase.ImportAsset(path2, ImportAssetOptions.Default);
        Material mat = AssetDatabase.LoadAssetAtPath<Material>(path2);
        // 实例化Cube
        cube.GetComponent<Renderer>().material = mat;
        GameObject.Instantiate(cube);
    }
}

​ 说明:Test_AssetDatabase 脚本文件需要放在 Editor 目录下面。编译后,在菜单栏依次点击【Custom→Import Cube】即可创建一个 Cube 对象。

6 PlayerPrefs

​ PlayerPrefs 是一个在游戏会话之间存储玩家偏好的类,它可以将字符串、浮点数和整数值存储到用户的平台注册表中。Unity 将 PlayerPrefs 存储在本地注册表中,没有加密,不要使用 PlayerPrefs 数据存储敏感数据。PlayerPrefs 官方介绍见→PlayerPrefs

​ PlayerPrefs 的静态方法如下。

img

​ Test_PlayerPrefs.cs

using UnityEngine;

public class Test_PlayerPrefs : MonoBehaviour {

    private void Awake() {
        PlayerPrefs.SetString("name", "Zhang san");
        PlayerPrefs.SetInt("age", 25);
        PlayerPrefs.SetFloat("height", 1.75f);
        Debug.Log("name=" + PlayerPrefs.GetString("name")
            + ", age=" + PlayerPrefs.GetInt("age")
            + ", height=" + PlayerPrefs.GetFloat("height"));
    }
}

​ 打印日志如下。

img

7 Addressables

​ Addressables 包提供了组织和打包应用内容的工具和脚本,在运行时可以加载和释放资源,官方介绍见→Addressables

1)安装 Addressables

​ 在菜单栏依次选择【Window→Package Manager】,打开包管理器,按照以下步骤安装 Addressables。

img

2)设置资源为 Addressable

​ 在 Assets 窗口选中资源,在 Inspector 窗口勾选 Addressable,并修改资源 Key,如下。

img

3)分组管理 Addressables

​ 在菜单栏依次选择【Window→Asset Management→Addressables→Groups】,打开 Addressables Groups 窗口,如下。

img

​ 可以拖拽 Addressables Groups 窗口,使其停靠在 Game 窗口旁边,如下。可以看到 Resources 目录下的资源会自动添加到 Addressables 中。

img

​ 依次点击【New→Packed Assets】,创建新包,并重命名,便于对资源进行分组管理,如下。

img

4)加载资源

​ Test_Addressables.cs

using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class Test_Addressables : MonoBehaviour {
    private GameObject cube;

    private void Awake() {
        Addressables.InstantiateAsync("CubePrefab2").Completed += OnInstantiate;
    }

    private void OnInstantiate(AsyncOperationHandle<GameObject> operationHandle) { // 游戏对象加载成功回调函数
        cube = operationHandle.Result;
        Addressables.LoadAssetAsync<Material>("CubeMat2").Completed += onl oadAsset;
    }

    private void onl oadAsset(AsyncOperationHandle<Material> operationHandle) { // 材质加载成功回调函数
        cube.GetComponent<Renderer>().material = operationHandle.Result;
    }
}

​ 说明:引入 UnityEngine.AddressableAssets 和 UnityEngine.ResourceManagement.AsyncOperations 这两个命名空间时,在 VSCode 中可能会报错,但 Unity 中不会报错,也不影响程序运行。如果想消除 VSCode 中的这个报错,可以重启一下 Unity 和 VSCode,就不会报错了。

​ 声明:本文转自【Unity3D】资源管理

标签:Unity3D,Assets,Test,AssetDatabase,Addressables,PlayerPrefs,资源管理,Resources
From: https://www.cnblogs.com/zhyan8/p/17764568.html

相关文章

  • 【Unity3D】UI Toolkit自定义元素
    1前言​UIToolkit支持通过继承VisualElement实现自定义元素,便于通过脚本控制元素。另外,UIToolkit也支持将一个容器及其所有子元素作为一个模板,便于通过脚本复制模板。​如果读者对UIToolkit不是太了解,可以参考以下内容。UIToolkit简介UIToolkit容器UIT......
  • 【Unity3D】UI Toolkit数据动态绑定
    1前言​本文将实现cvs表格数据与UIToolkit元素的动态绑定。​如果读者对UIToolkit不是太了解,可以参考以下内容。UIToolkit简介UIToolkit容器UIToolkit元素UIToolkit样式选择器UIToolkit自定义元素​本文完整资源见→UIToolkit数据动态绑定。......
  • 优维产品最佳实践第12期:IT资源管理首页丰富
    背景当我们进入平台后,默认跳转至IT资源管理首页,因此该页面的优化与丰富将极大的提高平台使用者的体验和效率。优化后的首页可以更好地展示常用模型、小产品、外部系统、以及保存的所有关系查询和快速查询条件,使用户能够更快捷、方便地找到所需内容。丰富前:丰富后:功能1.关系查询和......
  • Unity3D 如何制作带厚度的透明图片详解
    Unity3D是一款功能强大的游戏开发引擎,可以实现各种复杂的游戏效果。本文将详细介绍如何使用Unity3D制作带厚度的透明图片,并提供代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。在Unity3D中,......
  • 【Unity3D】UI Toolkit简介
    1前言​UIToolkit是一种基于Web技术的GUI框架,是为了解决UGUI效率问题而设计的新一代UI系统(UGUI的介绍详见→UGUI概述)。与UGUI不同,UIToolkit没有采用GameObject的方式,而是参考了Web技术的XML和CSS方案。这意味着它只保存变化的数据,而不是整个界面状态......
  • 【Unity3D】UI Toolkit容器
    1前言​UIToolkit简介中介绍了UIBuilder、样式属性、UQuery、Debugger,UIToolkit元素中介绍了Label、Button、TextField、Toggle、RadioButton、Slider、ProgressBar、Dropdown、Foldout等元素,UIToolkit样式选择器中介绍了简单选择器、复杂选择器、伪类选择器等......
  • 【Unity3D】程序纹理简单应用
    1几何纹理应用​本文所有案例的完整资源详见→Unity3D程序纹理简单应用。1.1边框​1)边框子图​Border.shadersubgraph​说明:Any节点用于判断输入向量中是否存在一个分量非零,Branch节点根据输入的真假走不同的分支,详见→ShaderGraph节点。​2)圆环......
  • 【Unity3D】水面特效
    1前言​水波特效中通过屏幕后处理实现了环形水波效果,本文通过ShaderGraph实现了模拟水面特效,包含以下特效细节。ShaderGraph基础知识详见→ShaderGraph简介、ShaderGraph节点、程序纹理简单应用。深水区和浅水区颜色差异;水面有波纹,并且在移动;水面起伏波动;水面......
  • Unity3D学习记录02——PloyBrush场景搭建
    首先在Window->PackageManager里面搜索PolyBrush,下载后将URP的Shader样例导入 导入后Asset文件夹下会有Sample的文件夹,在菜单栏Tools->PolyBrush->PolyBrushWindow打开窗口这个窗口最上面的五个,第一个是用来调整地形高低的,第二个是进行柔化场景的,第三个是调整颜色的,第四个......
  • Unity3D学习记录01:URP渲染管线以及3D游戏场景设置
    以下内容所使用的版本均为Unity2022.3先在Window->PackageManager->UnityRegistry里面搜索添加UniversalRP Unity中,创建渲染管线的方式为Asset文件夹下右键Create->Readering->URPAsset(withUniversalAsset)会创建以下两个Pipeline: 接着在图中的设置里添加这两个渲......