【Unity配置数据文件】ScriptableObject,在Unity中你肯定见过它的配置文件

在这里插入图片描述


👨‍💻个人主页@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 专栏交流🧧
🟥Unity100个实战基础✨🎁
🟦 Unity100个精华一记✨🎁
🟩 Unity50个demo案例教程✨🎁
🟨 Unity100个精华细节BUG✨🎁

在这里插入图片描述

在这里插入图片描述



前言

  • 大家在Unity有没有见过这样的文件,它是什么呢?
    在这里插入图片描述

ScriptableObject是Unity引擎中的一个类,用于创建可序列化的、可在运行时动态修改的对象。它可以存储和序列化数据,并且可以在不实例化的情况下在Unity编辑器中进行编辑。
ScriptableObject通常用于存储和管理项目中的配置数据、游戏对象的状态以及其他可共享的数据。由于ScriptableObject可以在编辑器中进行编辑,并且可以在游戏运行时共享和访问,因此它非常适合创建和管理游戏中的各种资源和数据。

在实际应用中,ScriptableObject常用于以下几个方面:

  1. 创建和管理游戏的配置数据,例如游戏关卡、角色属性、敌人行为等。
  2. 存储和管理游戏的可复用组件,例如技能系统、任务系统等。
  3. 创建和管理游戏的资源集合,例如音频剪辑、纹理、精灵等。
  4. 在不同场景之间共享数据,例如游戏中的全局变量、跨场景的数据等。
  5. 创建和管理虚拟现实(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<该对象类名>();

🎶(5ScriptableObject变成数据持久化


  • ScriptableObject的数据它在游戏发布运行过程中无法被持久化
    但是可以利用 PlayerPrefs、XML、Json、2进制等等方式
    让其可以达到被真正持久化的目的

  • 但是为什么不直接使用这些方式进行持久化呢,不是画蛇添足吗,那么ScriptableObject真正的意义在哪里呢,请看下一篇!

在这里插入图片描述

🅰️系统路线学习点击跳转


👨‍💻 Unity程序基础学习路线🧧
⭐【Unityc#专题篇】之c#进阶篇】🎁
⭐【Unityc#专题篇】之c#核心篇】🎁
⭐【Unityc#专题篇】之c#基础篇】🎁
⭐【Unity-c#专题篇】之c#入门篇】🎁
【Unityc#专题篇】—进阶章题单实践练习🎁
⭐【Unityc#专题篇】—基础章题单实践练习🎁
【Unityc#专题篇】—核心章题单实践练习🎁

你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


Unity使用Instantiate()方法克隆ScriptableObject文件时出现卡顿的可能原因有几种。 首先,ScriptableObjectUnity一种用于存储和共享数据的可编程对象。它的实例化过程可能需要分配额外的内存和执行复杂的初始化代码,从而导致卡顿。 其次,如果ScriptableObject文件较大,克隆时可能需要花费较长时间读取和复制文件内容,从而导致卡顿。这种情况下,可以尝试使用异步操作或延迟加载的方式来减少卡顿的程度。 另外,如果克隆ScriptableObject的操作发生在游戏运行时,而不是编辑器环境,那么卡顿可能是由于主线程被阻塞而引起的。在游戏运行时进行大量的克隆操作会导致帧率下降,从而造成卡顿。为了解决这个问题,可以考虑将克隆操作放在后台线程执行,或者使用对象池技术来重复利用已创建的ScriptableObject实例。 最后,如果在克隆ScriptableObject时发起了大量其他操作,例如其他GameObject的实例化或计算密集型任务,也可能导致卡顿。在这种情况下,可以尝试优化代码逻辑,减少额外操作的数量,或者将它们分散到多个帧执行,以减轻卡顿的影响。 综上所述,Unity使用Instantiate()方法克隆ScriptableObject文件出现卡顿的原因可能是ScriptableObject的初始化过程、文件读取和复制耗时、主线程阻塞以及其他操作的影响。可以采取异步操作、延迟加载、后台线程执行、对象池技术、优化代码逻辑等方法来减轻卡顿的程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秩沅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值