【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。

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 编辑器模式下使用,官方介绍见→AssetDatabase、Batching 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】资源管理。
【Unity3D】资源管理的更多相关文章
- Unity3d资源管理分析
原创链接:http://blog.csdn.net/ox_thedarkness/article/details/9197453 分离资源管理 参考 1.Unity3D占用内存太大的解决方法 - 星尘 ...
- Unity3D - 资源管理
一直没有总结过Unity的资源管理,都是随用随看文档.今天有人问起,总结一下.加深对Unity资源管理的理解. 主要參考了Unity官方文档之Resources和AssetBundle. Unity有 ...
- Unity3D资源管理架构
在Unity3D引擎中,场景资源文件(.unity)是以2进制格式存储的.但同一时候它也有一种基于文本的表现格式. 可在Edit>Project Setting>Editor 中设置: 1 ...
- 资源 Des加密
Unity3d资源管理分析 http://blog.csdn.net/sgnyyy/article/details/39268215 打包资源 http://www.cnblogs.com/sifen ...
- Unity3D和OGRE资源管理机制
转自:http://www.tuicool.com/articles/QbMjUn 游戏中通常有大量资源,如网格.材质.纹理.动画.着色器程序和音乐等,游戏引擎作为做游戏的工具,自然要提供良好的资源管 ...
- 浅析游戏引擎的资源管理机制——扒一扒Unity3D中隐藏在背后的资源管理
游戏中通常有大量资源,如网格.材质.纹理.动画.着色器程序和音乐等,游戏引擎作为做游戏的工具,自然要提供良好的资源管理,让游戏开发者用最简单的方式使用资源.游戏引擎的资源管理包括两大部分:离线资源管理 ...
- Unity3D游戏开发框架-资源管理类ResourceManage
新建文件夹:ResMgr.接着新建三个C#脚本.代码如下: IResLoadListener.cs AssetInfo.cs ResMgr.cs using UnityEngine; using Sy ...
- Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生
一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...
- Unity3D游戏开发初探—3.初步了解U3D物理引擎
一.什么是物理引擎? 四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础.牛顿有句话是这么说的:“如果说我看得比较远的话,那是因为我站在巨人的肩膀 ...
- 跟我从零基础学习Unity3D开发--U3d脚本注意事项及两个基本函数的简单介绍
经过上一篇的学习,我相信开发环境您已经搭好了,如果还没有搭好可以百度一下. 今天主要讲的有以下几点: 第一:Unity3D中的C#脚本与.net中的C#写法的区别 1.Unity3D C#脚本不支持命 ...
随机推荐
- CPython, Pypy, MicroPython...还在傻傻分不清楚?
哈喽大家好,我是咸鱼 当我们说 Python 时,通常指的是官方实现的 CPython 但还有很多比如 Pypy.Jython.MicroPython.Brython.RustPython 等 &qu ...
- Python copy & deeocopy 探究
简单来说,copy 复制创建新的容器,而引用容器内元素的地址不变.而 deepcopy 也对容器内的容器元素进行复制. 但是这种复制具体是什么体现呢?是否只是对第一层容器元素进行了复制?写了一段代码验 ...
- 创建 Code Interpreter Demo: 一次实践的探索
好消息,好消息,Code Interpreter可以测试使用了!!! 在这篇文章中,我们将探索如何创建一个 Code Interpreter Demo.提交一个2023年1-5月份的融资记录数据,让它 ...
- 利用shell脚本交互式运行jar任务
如题,废话不多说,直接上代码: #!/bin/bash APP_PATH=/root/bigdata/neural_networks/width_control_model/predict/uploa ...
- 2023-07-22:一共有n个项目,每个项目都有两个信息, projects[i] = {a, b}, 表示i号项目做完要a天,但是当你投入b个资源,它就会缩短1天的时间, 你一共有k个资源,你的目
2023-07-22:一共有n个项目,每个项目都有两个信息, projects[i] = {a, b}, 表示i号项目做完要a天,但是当你投入b个资源,它就会缩短1天的时间, 你一共有k个资源,你的目 ...
- Elementary OS old version download 旧版本下载
Elementary OS 号称是最漂亮的Linux发行版,没有之一.确实,他的整体风格看起来就是特别舒服,说不出哪里特别好,但也挑不出什么毛病.相比之下,其他Linux的界面总感觉不太和谐.比如特别 ...
- UG NX实现叉车运输货物功能遇见的问题
在前一段时间编写模拟叉车运输功能时遇到,货物无法跟随的问题(如下动图) 后面发现是速度太快的原因导致货物没有跟着动,类似于抽桌布的感觉 解决办法有两种:第一种解决办法很简单就是把速度降低到不超过 2 ...
- webpack dev server 与 hot module replace 提高开发效率
通过 webpack 命令编译源代码时,如果我们对源代码进行了修改,需要重新执行命令才能看到编译后的效果. 这样在开发中非常的影响效率,如果存在一种方式,当文件被修改时,webpack 自动监听重新编 ...
- 「学习笔记」gdb 调试的简单操作
gdb是一个命令行下的.功能强大的调试器. 在学习 gdb 前,我们要知道几个最基本的 cmd 命令. cmd 首先,对于 win10 系统,我们按 Windows + R 键,打开运行窗口,在里面输 ...
- Linux 网络发包流程
哈喽大家好,我是咸鱼 之前咸鱼在<Linux 网络收包流程>一文中介绍了 Linux 是如何实现网络接收数据包的 简单回顾一下: 数据到达网卡之后,网卡通过 DMA 将数据放到内存分配好的 ...