【Unity3D】资源管理

2023-09-14 23:53:45

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

        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);
        }
    }
}

        打印如下。

4 ScriptableObject

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

        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 窗口可以调整属性,如下。

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 的静态方法如下。

        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"));
    }
}

        打印日志如下。

7 Addressables

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

        1)安装 Addressables

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

        2)设置资源为 Addressable

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

        3)分组管理 Addressables

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

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

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

        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 += OnLoadAsset;
    }

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

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

更多推荐

阿里云服务器经济型e实例租用价格和CPU性能测评

阿里云服务器ECS推出经济型e系列,经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,CPU采用IntelXeonPlatinum架构处理器,支持1:1、1:2、1:4多种处理器内存配比,e系列性价比优选,新品e实例价格低至15元/月,折合0.5元

小白备战大厂算法笔试(八)——搜索

搜索二分查找二分查找是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮减少一半搜索范围,直至找到目标元素或搜索区间为空为止。Question:给定一个长度为n的数组nums,元素按从小到大的顺序排列,数组不包含重复元素。请查找并返回元素target在该数组中的索引。若数组不包含该元素,则返回−1双闭区间如下图所

css知识学习系列(6)-每天10个知识点

目录1.**CSS中的“box-sizing”属性与“border”属性有什么关系?**2.**在CSS中,如何使用“calc()”函数进行计算?有什么使用技巧?**3.**在CSS中,如何使用“@import”引入外部样式表?有哪些注意事项?**4.**Flexbox和Grid布局在实践中哪个更常用?为什么?**5.

【学习笔记】Java 一对一培训(2.2)Java基础逻辑

【学习笔记】Java一对一培训(2.2)Java基础逻辑关键词:Java、SpringBoot、Idea、数据库、一对一、培训、教学本文主要内容含Java逻辑运算、Java循环语句、Java常见工具类、Java常见数据结构、Java文件操作、封装继承多态计划2.5小时完成,请同学尽量提前准备。本部分主要代码实战!有学习

如何提升LED显示屏显示效果?

影响LED显示屏显示效果的因素有很多,以下是一些主要的因素:LED灯珠的质量和性能:LED灯珠是LED显示屏的核心组件,其质量和性能会直接影响到整个LED显示屏的显示效果。显示屏的亮度:LED显示屏的亮度是影响显示效果的一个重要因素。如果亮度过低,显示图像就会模糊不清,而如果亮度过高,则可能会引起屏幕反射和眩光等问题。

自身免疫疾病诊断原料厂家——博迈伦

自身免疫疾病是免疫系统异常攻击自身正常组织和器官的疾病,如类风湿性关节炎、系统性红斑狼疮、硬皮病等。诊断自身免疫疾病通常需要使用特定的试剂和试验方法。以下是一些常见的自身免疫疾病诊断原料厂家:1.ThermoFisherScientific(Invitrogen):作为一家的生命科学公司,ThermoFisherSci

Cglib代理和JDK代理原理的区别

一、JDKJdk动态代理,拿到目标类所实现的接口(目标类必须有实现接口),生成代理类,并且代理类也会实现和目标类一样的接口。二、CglibCglib代理功能更强,无论目标类是否实现了接口都可以代理,他是基于继承的方式来代理目标类,如果目标类也实现了接口,代理类也会实现一次publicObjectgetProxy(@Nu

大厂FPGA的面试题

FPGA(现场可编程门阵列)在电子工程领域被广泛使用,以下是一些FPGA面试题:解释FPGA,并列举其优点和局限。在FPGA上设计一个数字系统需要哪些步骤?FPGA设计中,时钟的使用和调整是个重要环节。你能解释一下什么是时钟抖动吗?在设计中如何处理这种问题?什么是时钟相位调整?这对于FPGA设计有何重要性?在FPGA设

我的创作纪念日(从本科到研究生)

一、机缘大一暑假的时候,老师让每周写自己学习了什么,然后以博客的形式记录下来,后来坚持的人很少,我也是其中之一,没有坚持下来。后来,有个同学经常分享自己学习成果,也就是把自己的博客发群,确实质量也不错,时间长了,他的粉丝什么的涨的就比较多,现在也是某一个领域的大佬了。我后来坚持发博客一方面受到了他的影响,另一方面我也在

【GIT问题解决】---- 在【.gitignore】中添加了忽略文件或文件夹后不生效

1.出现问题在已经提交过的GIT管理的项目中,在.gitignore文件中新增一些忽略的文件或者文件夹,或者直接新建.gitignore文件之后,新增的内容不生效。2.实例截图3.实例描述lifecycle.js文件已新增到.gitignore文件中,但是lifecycle.js文件修改的时候依然会上传;yarn.lo

LoRa 常见问题解答 FAQs汇总

目录LoRa调制和特点LoRaWAN协议LoRa网关如何选择LoRa的BW、SF和CR当两个不同制造商的SX127x模块不能相互通信,故障检测的步骤是什么可以用LoRa设备发送或接收一个无限长度的有效载荷数据包吗?文章部分来源LoRa调制和特点众所周知,无线通信基础的调制方式包括模拟调制AM(调幅)、FM(调频)和PM

热文推荐