• Unity中,如何在【编辑器】和【运行时】状态下读写一个ScriptableObject对象


    1、什么时ScriptableObject

    在Unity中,提到MonoBehaviour,简直如雷贯耳,大家都能扒拉吧拉说上半天,但是提到ScriptableObject,应该有许多人不知道。

    通俗的讲,MonoBehaviour是行为脚本,既然是行为脚本,那么它的服用方法自然就是挂在GameObject游戏对象上,在每一个挂载的地方,生成一个新的实例。

    与行为脚本不同,ScriptableObject"脚本"则专注于数据的存储。有人要问,我在MonoBehaviour里面定义一个static的表也可以存数据,而且全局公用,但是,关机后,你的static数据还在不在呢?!也许有人说,我用txt或者json存到本地硬盘嘛,甚至我存在数据库或者服务器里,你要这么讲,确实你厉害,家里有矿啊!

    那ScriptableObject到底是啥呢?

    • 它是Unity中用来存储数据的文件或者资源文件
    • 它存的数据不会丢失,即便你关机,除非你卸载你的应用(用Unity开发的软件)
    • 它可以 被整个工程共享使用:整个工程里面的任何场景、任何地方、任何人,都可以访问这些数据,包括读和写
    • 它存的数据类型超过你的想象,Int、String、Float…Material…都不在话下,甚至你可以定义一个字体【Font】类型的变量,并把【微软雅黑】这种字体拖到它上面,存起来,以便在某些Text上,应用这种字体。

    2、如何生成一个ScriptableObject资源文件?

    • 1、定义一个ScriptableObject脚本
    • 2、生成一个对应的资源文件

    【FontsConfig.cs】代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    /// <summary>
    /// 字体信息配置
    /// 创建asset的菜单入口:
    /// Asset目录,右键 -> Create -> 持久数据创建/创建字体配置信息
    /// </summary>
    
    [CreateAssetMenu(fileName = "FontsConfig", menuName = "持久数据创建/创建字体配置信息")]
    public class FontsConfig : ScriptableObject
    {
        /// <summary>
        /// 默认的字体
        /// </summary>
        public Font defaultFont;
    
        /// <summary>
        /// 用于测试的字段
        /// </summary>
        public int textIndex;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    生成对应的资源:Asset目录,右键 -> Create -> 持久数据创建/创建字体配置信息
    在这里插入图片描述

    里面到底有啥?
    在这里插入图片描述
    如图:当你点开FontsConfig.asset后,你能够把一些字体拖到这个变量里面,预存起来以备后用。

    3、run time如何使用ScriptableObject资源文件

    • 首先ScriptableObject资源文件要存在一个持久的目录,比如Resources或者StreamingAssets里面
    • 你可以在一个MonoBehaviour行为脚本里面定义一个ScriptableObject的变量,把它存到static里面,以便直接访问。
    public ScriptableObject myFontsConfig2;             //定义asset资源
    public static ScriptableObject s_myFontsConfig2;    //static方便任何地方访问
    
    private void Awake()
    {
        s_myFontsConfig2 = myFontsConfig2;             //实例变量绑定给全局变量   
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    【FontsManager .cs】脚本代码清单

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    
    /// <summary>
    /// 字体管理脚本
    /// </summary>
    public class FontsManager : MonoBehaviour
    {
        /// <summary>
        /// 字体配置信息
        /// </summary>
        [Header("字体配置信息")]
        [SerializeField]
        public ScriptableObject myFontsConfig2;
        public static ScriptableObject s_myFontsConfig2;
    
        private void Awake()
        {
            s_myFontsConfig2 = myFontsConfig2;
        }
    
    #if UNITY_EDITOR
        [ContextMenu("设置数据")]
    #endif
        void SetIndex()
        {
            var r = s_myFontsConfig2 as FontsConfig;
            r.textIndex = r.textIndex + 1;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    你可以把该脚本挂载到场景物体上,然后把刚生成的asset资源文件拖到myFontsConfig2变量上
    在这里插入图片描述

    四、如何在Unity Editor状态下使用该资源文件

    • 读取资源文件对象
    • 从该对象里面读取字体字段

    关键代码:

    var instance = (FontsConfig)AssetDatabase.LoadAssetAtPath("Assets/Resources/Config/fontConfig.asset", typeof(FontsConfig));
    var defaultFont = instance.defaultFont;
    
    • 1
    • 2
  • 相关阅读:
    YOLOv5算法改进(18)— 更换激活函数(SiLU、ReLU、ELU、Hardswish、Mish、Softplus等)
    gltf和glb格式模型用什么软件处理
    阿里神作,拥有了这份java面试题,等于拥有了大厂敲门砖
    超声波、毫米波、ToF激光雷达——在低功耗场景的应用选型
    volatile 系列之实现原理
    景联文科技:AI大模型强势赋能,助力自动驾驶迭代升级
    分布式架构的监控与指标
    自动化测试如何实施落地?详细教程来了
    SwiftUI 如何保证 Text 中字符数量相等的字符串显示宽度一定相同?
    Elastic Stack--10--QueryBuilders UpdateQuery
  • 原文地址:https://blog.csdn.net/dzj2021/article/details/125417927