【Unity3D】资源管理

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。用 Excel 编辑如下表格,然后另存为 csv 格式,把文件拖拽到 Unity 中,然后绑定到 Test_TextAsset 脚本在监视器面板的 heightDatas 属性上。

Test_TextAsset.cs

using UnityEngine;

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

    private void Awake() {
        string[] textInLines = heightDatas.text.Split('\n');
        // 因为cvs文件最后有一个空的换行, 所以这里长度要减1
        for (int i = 1; i < textInLines.Length - 1; 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,就不会报错了。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容