2023-06-04 Unity ScriptableObject1——ScriptableObject数据文件

这篇具有很好参考价值的文章主要介绍了2023-06-04 Unity ScriptableObject1——ScriptableObject数据文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


​ ScriptableObject 是 Unity 提供的一个数据配置存储基类,可以用来保存大量数据的数据模板,类似于可以自定义的数据资源文件模板

​ 它是一个类似 MonoBehavior 的基类,需要继承来进行使用

​ 主要作用:

  1. 数据复用(多个对象用同一个数据)

  2. 配置文件(配置游戏中的数据)

  3. 编辑模式下的数据持久化

​ 优点:

  1. 直接在 Inspector 窗口编辑配置数据,利用它来做配置文件

  2. 处理重复数据,减少数据拷贝时造成的内存占用,利用它来做公共数据

  3. 更方便的处理数据带来的多态行为

一、创建数据模板

​ 创建 ScriptableObject 数据模板,需要进行的操作为:

  1. 创建 C# 脚本,继承 ScriptableObject 类
  2. 在该类中声明成员(变量、方法等)
public class MyData : ScriptableObject
{
    // 可以声明任何类型的成员变量
    // 如果希望在 Inspector 窗口中能够编辑它,需要声明为 public 或添加 SerializeField 特性

    public int   i;
    public float f;
    public bool  b;

    public GameObject obj;
    public Material   m;
    public AudioClip  audioClip;
    public VideoClip  videoClip;

    public void PrintInfo() {
        Debug.Log(i);
        Debug.Log(f);
        Debug.Log(b);
    }
}

​ 声明后,我们边可以在 Inspector 窗口中看到变化

​ 我们可以在其中进行设置,但是这些设置都是默认数据,并没有真正使用他们

​ 这些关联信息都是通过脚本文件对应的 Unity 配置文件 meta 进行记录的,打开该脚本同目录下的 .meta 文件可看到:

​ 目前该数据只是一个数据容器模板,只是规定了需要创建的数据格式,并没有创建数据文件

二、创建数据文件

​ 具体的方法有两种:

  1. 为类添加 CreateAssetMenu 特性,通过菜单创建资源

    • [CreateAssetMenu(fileName, menuName, order)]

      fileName:创建出来的默认数据文件名

      menuName:在 Asset / Create 菜单中显示的名字

      order:在 Asset / Create 菜单中的顺序,通过数字指定排列优先级

    [CreateAssetMenu(fileName = "MyData", menuName = "ScriptableObject/我的数据", order = 0)]
    public class MyData : ScriptableObject 
    {
        ...
    }
    

    ​ 在 Project 窗口中右键即可找到对应目录创建数据文件:

    ​ 创建出来的文件是实实在在的独立数据文件 .asset,可以在 Inspector 面板中编辑其数据。

  2. 利用 ScriptableObject 的静态方法创建数据对象,然后将数据对象保存在工程目录下

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class ScriptableObjectTool
{
    [MenuItem("ScriptableObject/CreateMyData")]
    public static void CreateMyData()
    {
        // 书写创建数据资源文件的代码
        MyData asset = ScriptableObject.CreateInstance<MyData>();
        
        // 通过编辑器API 根据数据创建一个数据资源文件
        AssetDatabase.CreateAsset(asset, "Assets/Resources/MyDataTest.asset");
        
        // 保存创建的资源
        AssetDatabase.SaveAssets();
        
        // 刷新界面
        AssetDatabase.Refresh();
    }
}

​ 在菜单窗口中即可创建,效果和方法 1 一样。

​ 但是由于引用了 UnityEditor 命名空间,需要将该脚本放在 Editor 文件夹下,否则项目打包会失败。

​ 方法 1 在项目使用中更常用,方法 2 在 Unity 编辑器开发中更常见。

三、使用数据文件

(一)直接关联使用

​ 在继承 MonoBehaviour 类中申明数据容器类型的成员,在 Inspector 窗口进行关联

public class Lesson2 : MonoBehaviour
{
    public MyData data;
}

(二)加载数据使用

​ 使用代码加载数据文件资源

​ Resources、AB包、Addressables 都支持加载继承 ScriptableObject 的数据文件

​ 以 Resources 为例,将数据文件放入 Resources 文件夹下,之后使用代码加载。

public class Lesson2 : MonoBehaviour
{
    public MyData data;
    
    private void Start() {
        data = Resources.Load<MyData>("ScriptableObject/MyDataTest");
        data.PrintInfo();
    }
}

(三)生命周期函数

​ ScriptableObject 和 MonoBehavior 类似,也存在生命周期函数

​ 但是生命周期函数的数量更少,主要做了解,一般使用较少

  • Awake:数据文件创建时调用
  • OnDestroy:ScriptableObject 对象将被销毁时调用
  • OnDisable:ScriptableObject 对象销毁时、即将重新加载脚本程序集时调用
  • OnEnable:ScriptableObject 创建或者加载对象时调用
  • OnValidate:编辑器才会调用的函数,Unity 在加载脚本或者 Inspector 窗口中更改值时调用
public class MyData : ScriptableObject
{
    // 可以声明任何类型的成员变量
    // 如果希望在 Inspector 窗口中能够编辑它,需要声明为 public 或添加 SerializeField 特性

    public int   i;
    public float f;
    public bool  b;

    public GameObject obj;
    public Material   m;
    public AudioClip  audioClip;
    public VideoClip  videoClip;
    
    private void Awake() {
        Debug.Log("数据文件创建时会调用");
    }

    private void OnEnable() { }

    private void OnDisable() { }

    private void OnDestroy() { }

    private void OnValidate() {
        Debug.Log("123");
    }

    public void PrintInfo() {
        Debug.Log(i);
        Debug.Log(f);
        Debug.Log(b);
    }
}

用途:

  1. 编辑器中的数据持久化

    通过代码修改数据对象中内容,会影响数据文件,相当于达到了编辑器中数据持久化的目的
    (该数据持久化只是在编辑模式下的持久,发布运行时并不会保存数据)

  2. 复用数据

    如果多个对象关联同一个数据文件

    相当于他们复用了一组数据,内存上更加节约空间

​ 创建出来的数据资源文件,可以理解成一种记录数据的资源

​ 它的使用方式,和 Unity 中其它资源规则是一样的,比如:预设体、音频文件、视频文件、动画控制器文件、材质球等等

​ 只不过通过继承 ScriptableObject 类生成的数据资源文件,它主要是和数据相关的

四、非持久化特性

​ ScriptableObject 的非持久化指的是不管在编辑器模式还是在发布后,下次运行程序后之前修改的数据都不会存储下来

​ 通过 ScriptableObject 中的静态方法 ScriptableObject.CreateInstance() 创建数据文件来使用,就好像直接 new 一个数据结构类对象,其构造函数在 ScriptableObject 模板中定义。

data = ScriptableObject.CreateInstance("MyData") as MyData;
data = ScriptableObject.CreateInstance<MyData>();
data.PrintInfo();
  • 该方法可以在运行时创建出指定继承 ScriptableObject 的对象
  • 该对象只存在于内存当中,可以被 GC 回收,调用一次就创建一次

意义:

  • 只希望在运行时能有一组唯一的数据可以使用,但又不希望保存为数据资源文件浪费硬盘空间
  • 只在运行时使用,在编辑器模式下也不会保存在本地

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

但是并不建议使用 ScriptableObject 来做数据持久化,有点画蛇添足文章来源地址https://www.toymoban.com/news/detail-702592.html

到了这里,关于2023-06-04 Unity ScriptableObject1——ScriptableObject数据文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WuThreat身份安全云-TVD每日漏洞情报-2023-04-06

    漏洞名称:Microsoft Outlook 特权提升漏洞 漏洞级别:严重 漏洞编号:CVE-2023-23397,CNNVD-202303-1036 相关涉及:Microsoft Outlook 2016 (64-bit edition) 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_ID=TVD-2023-06254 漏洞名称:SonicOS 拒绝服务漏洞 漏洞级别:高危 漏洞编号:CVE-2023-0656,CNNVD-202303-1

    2023年04月09日
    浏览(48)
  • 一份详细 redis sentinel 哨兵架构搭建步骤<写于2023-04-06>

    redis 哨兵架构,其实是在 主从架构 基础上延伸的,sentinel 哨兵模式的 redis 实例,不提供读写操作的。实例相互之间,会感知到。 code: port 26379 daemonize yes # 改为后台启动 pidfile “/var/run/redis‐sentinel‐26379.pid” logfile “26379.log” dir “/usr/local/redis‐5.0.3/data” #sentinel monitor

    2023年04月14日
    浏览(35)
  • Unity ScriptableObject 使用方法详解

    ScriptableObject类 直接继承自Object类;它和 MonoBehaviour 是并列的,都继承自Object(但MonoBehaviour并不是直接继承自Object); ScriptableObject 就是一个数据容器,可以用来存储大量的数据,它是可序列化的,这个特点也正决定了它的主要用途;一个 主要用处就是通过将数据存储在Sc

    2024年02月08日
    浏览(38)
  • unity中ScriptableObject的保存技巧

            so(ScriptableObject 这里是简称,后面都用so代替ScriptableObject)在处理大量数据,属实不怎么样,本人深有体会,在项目中一开始定的是用so存储数据,到后期数据量变大了,so的维护就变的特别麻烦,因为so用代码赋值后会暂时保存,在unity的属性面板上可以看到我们

    2024年02月03日
    浏览(37)
  • 2023-06-08 Unity AssetBundle1——AB包介绍与使用

    一、AB 包介绍 ​ AB 包是特定于平台的资源压缩包,类似于压缩文件。其中资源可包括:模型、贴图、预设体、音效、材质球等等。 ​ 相较于 Resources 文件夹下的资源文件,AB 包能够更好管理资源: Resources 文件夹:打包时资源固定,只读,无法修改。 AB 包:存储位置可自定

    2024年02月16日
    浏览(37)
  • 2023-06-19 Untiy进阶 C#知识补充2——C#版本与Unity的关系

    一、Unity 与 C# 版本 Unity 版本 C# 版本 Unity 2021.2 C# 9 Unity 2020.3 C# 8 Unity 2019.4 C# 7.3 Unity 2017 C# 6 Unity 5.5 C# 4 ​ 更多信息可以在 Unity 官网说明查看:Unity - Manual: C# compiler (unity3d.com) ​ 之所以不同 Unity 版本支持的 C# 版本不同,主要是不同 Unity 版本使用的 C# 编译器和脚本运行时版

    2024年02月12日
    浏览(37)
  • 2023-06-01:讲一讲Redis常见数据结构以及使用场景。

    2023-06-01:讲一讲Redis常见数据结构以及使用场景。 答案2023-06-01: 字符串(String) 适合场景 缓存功能 Redis 作为缓存层,MySQL 作为存储层,在大部分请求中,数据的读取通常是从 Redis 中获取。由于 Redis 具有支持高并发的特性,因此缓存层通常能够加速读写操作,并减轻后端

    2024年02月07日
    浏览(61)
  • 2023-06-13:统计高并发网站每个网页每天的 UV 数据,结合Redis你会如何实现?

    2023-06-13:统计高并发网站每个网页每天的 UV 数据,结合Redis你会如何实现? 答案2023-06-13: 如果统计 PV (页面浏览量)那非常好办,可以考虑为每个网页创建一个独立的 Redis 计数器,并将日期添加为键(key)的后缀。当网页收到请求时,对应的计数器将被递增。对于每天的

    2024年02月08日
    浏览(87)
  • 【Python爬虫】利用爬虫抓取双色球开奖号码,获取完整数据,简洁45行代码实现,更新时间2023-06-28

    链接:https://pan.baidu.com/s/18oE308_NVNPaCOACw_H5Hw?pwd=abc1  利用爬虫抓取双色球开奖号码,获取完整数据,简洁45行代码实现,更新时间2023-06-28 这是网上的数据,怎么将它爬取下来 它将只爬取最近30期的双色球开奖号码,并将结果写入到名为 \\\"双色球开奖结果.csv\\\" 的文件中。   生成

    2024年02月15日
    浏览(156)
  • C++ Primer Plus笔记: 2023.06.05 AND 2023.06.06

    1.在C++的赋值语句: 赋值将从右向左进行,首先,88被赋值给steinway,然后,steinway的值(现在是88)被赋给baldwin,然后baldwin的值88被赋给yamaha。 2.类与对象: ** 类是用户定义的一种数据类型。要定义类,需要描述它能够表示什么信息和可对数据执行哪些操作,类之于对象就像

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包