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;
}

生成对应的资源: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;             //实例变量绑定给全局变量   
}

【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;
    }
}

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

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

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

关键代码:

var instance = (FontsConfig)AssetDatabase.LoadAssetAtPath("Assets/Resources/Config/fontConfig.asset", typeof(FontsConfig));
var defaultFont = instance.defaultFont;
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值