在Unity中,提到MonoBehaviour,简直如雷贯耳,大家都能扒拉吧拉说上半天,但是提到ScriptableObject,应该有许多人不知道。
通俗的讲,MonoBehaviour是行为脚本,既然是行为脚本,那么它的服用方法自然就是挂在GameObject游戏对象上,在每一个挂载的地方,生成一个新的实例。
与行为脚本不同,ScriptableObject"脚本"则专注于数据的存储。有人要问,我在MonoBehaviour里面定义一个static的表也可以存数据,而且全局公用,但是,关机后,你的static数据还在不在呢?!也许有人说,我用txt或者json存到本地硬盘嘛,甚至我存在数据库或者服务器里,你要这么讲,确实你厉害,家里有矿啊!
那ScriptableObject到底是啥呢?
【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后,你能够把一些字体拖到这个变量里面,预存起来以备后用。
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变量上

关键代码:
var instance = (FontsConfig)AssetDatabase.LoadAssetAtPath("Assets/Resources/Config/fontConfig.asset", typeof(FontsConfig));
var defaultFont = instance.defaultFont;