👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 专栏交流 | 🧧 |
---|---|
🟥Unity100个实战基础✨ | 🎁 |
🟦 Unity100个精华一记✨ | 🎁 |
🟩 Unity50个demo案例教程✨ | 🎁 |
🟨 Unity100个精华细节BUG✨ | 🎁 |
文章目录
⭐前言⭐
- 大家在Unity有没有见过这样的文件,它是什么呢?
ScriptableObject是Unity引擎中的一个类,用于创建可序列化的、可在运行时动态修改的对象。它可以存储和序列化数据,并且可以在不实例化的情况下在Unity编辑器中进行编辑。
ScriptableObject通常用于存储和管理项目中的配置数据、游戏对象的状态以及其他可共享的数据。由于ScriptableObject可以在编辑器中进行编辑,并且可以在游戏运行时共享和访问,因此它非常适合创建和管理游戏中的各种资源和数据。
在实际应用中,ScriptableObject常用于以下几个方面:
- 创建和管理游戏的配置数据,例如游戏关卡、角色属性、敌人行为等。
- 存储和管理游戏的可复用组件,例如技能系统、任务系统等。
- 创建和管理游戏的资源集合,例如音频剪辑、纹理、精灵等。
- 在不同场景之间共享数据,例如游戏中的全局变量、跨场景的数据等。
- 创建和管理虚拟现实(VR)或增强现实(AR)应用中的虚拟对象和数据。
总之,ScriptableObject提供了一种方便和灵活的方式来创建、存储和管理游戏中的数据和资源,并且可以在编辑器中进行编辑和共享。它可以提高开发效率,并允许开发人员在游戏运行时动态修改和操作这些数据和资源。
🎶 作用
- 注意:发布之后无法持久化
1.可直接在Inspector窗口编辑配置数据,利用它来做配置文件
2.处理重复数据,减少数据拷贝时造成的内存占用,可以利用它来做公共数据
3.可以更方便的处理数据带来的多态行为
🎶(1) 继承ScriptableObject类
- 创建一个脚本让其继承ScriptableObject类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
public class dataText : ScriptableObject
{
public int num;
public bool isOpen;
public GameObject obj;
public AudioClip audioClip;
public VideoClip videoClip;
}
- 继承了Scriptable脚本和普通脚本的区别
🎶(2)创建配置文件
生成菜单栏显示,并创建配置文件
方法1(在Asset菜单上显示)
只是在代码上添加了特性:
[CreateAssetMenu(fileName =“MrTangData”, menuName =“ScriptableObject/我的数据”, order = 0)]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
[CreateAssetMenu(fileName ="MrTangData", menuName ="ScriptableObject/我的数据", order = 0)]
public class MyData : ScriptableObject
{
//声明成员时需要注意
//我们可以声明任何类型的成员变量
//但是需要注意:如果希望之后在Inspector窗口中能够编辑它
//那你在这里声明的变量规则 要和 MonoBehavior当中public变量的规则是一样的
public int i;
public float f;
public bool b;
public GameObject obj;
public Material m;
public AudioClip audioClip;
public VideoClip videoClip;
}
方法2(在Menu菜单栏上显示)
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
public class ScriptableObjectCreartTool
{
[MenuItem("ScriptableObject/CreateData")]
public static void CreateData()
{
//书写创建数据资源文件的代码
dataText asset = ScriptableObject.CreateInstance<dataText>();
//通过编辑器API 根据数据创建一个数据资源文件
AssetDatabase.CreateAsset(asset, "Assets/Resources/dataText.asset");
//保存创建的资源
AssetDatabase.SaveAssets();
//刷新界面
AssetDatabase.Refresh();
}
}
🎶(3)数据文件的使用
进行关联(方法1,方法2)
- 1.拖拽关联
在Inspector窗口进行拖拽关联
- 2.资源加载
Resources、AB包、Addressables都支持加载继承ScriptableObject的数据文件
DataText data;
data = Resources.Load<DataText>("DataTest");
ScriptableObject的生命周期函数
-
OnDestroy ScriptableObject 对象将被销毁时调用
-
OnDisable ScriptableObject 对象销毁时、即将重新加载脚本程序集时 调用
-
OnEnable ScriptableObject 创建或者加载对象时调用
-
OnValidate 编辑器才会调用的函数。发布不会,Unity在加载脚本或者Inspector窗口中更改值时调用
🎶(4)非持久化数据的生成
-
只是希望在运行时能有一组唯一的数据可以使用
这个数据不会保存为数据资源文件浪费硬盘空间
这样ScriptableObject的非持久化数据就有了存在的意义 -
创建方法:
data = ScriptableObject.CreateInstance<该对象类名>();
🎶(5)ScriptableObject变成数据持久化
-
ScriptableObject的数据它在游戏发布运行过程中无法被持久化
但是可以利用 PlayerPrefs、XML、Json、2进制等等方式
让其可以达到被真正持久化的目的 -
但是为什么不直接使用这些方式进行持久化呢,不是画蛇添足吗,那么ScriptableObject真正的意义在哪里呢,请看下一篇!
⭐🅰️系统路线学习点击跳转⭐
👨💻 Unity程序基础学习路线 | 🧧 |
---|---|
⭐【Unityc#专题篇】之c#进阶篇】 | 🎁 |
⭐【Unityc#专题篇】之c#核心篇】 | 🎁 |
⭐【Unityc#专题篇】之c#基础篇】 | 🎁 |
⭐【Unity-c#专题篇】之c#入门篇】 | 🎁 |
⭐【Unityc#专题篇】—进阶章题单实践练习 | 🎁 |
⭐【Unityc#专题篇】—基础章题单实践练习 | 🎁 |
⭐【Unityc#专题篇】—核心章题单实践练习 | 🎁 |
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、