ScriptableObject使用
创始人
2024-11-23 10:35:04
0

资料

Scripting/Create modular game architecture in Unity with ScriptableObjects
脚本文档

基础

SO是一个Unity对象,继承UnityEngine.Objec,
SO最大的特点是实例文件可共享,有点类似静态数据,同一个实例文件可被多个对象引用;
实例对象可放置到Inspector窗口(可序列化);
So实例文件保存在项目文件夹中,文件内容格式为yaml;
编辑器中,当退出播放模式时,对ScriptableObject值的更改不重置。
发布后,运行程序修改SO值,关闭程序后SO值不会保存。重新运行程序,SO值是发布时的状态。
So不仅能包含数据也可以包含方法。

实例化

编辑器中实例化,添加[CreateAssetMenu],右键创建SO实例文件;
运行时创建,ScriptableObject.CreateInstance()。

Mono脚本 Vs So脚本

相同之处

  1. 继承 UnityEngine.Object
  2. 可以序列化 显示在Inspector中

不同之处

  1. Mono脚本接收来自Unity的回调很多;So脚本接收少的Unity回调
  2. Monobehaviours必须在运行时附加到游戏对象;So脚本不附加在任何游戏对象上
  3. Mono保存时,保存到场景或预制体中;每个So脚本实例保存在项目文件夹中
  4. 编辑器中,改变mono脚本的值,离开播放器,数值会重置;
    编辑器中,当退出播放模式时,对ScriptableObject值的更改不重置。

So使用

So实例作为数据容器

多个对象共享一份So实例,多个对象共享的数据可提取出来作为so实例,减少重复,节约内存。
可扩展mono脚本,直接在游戏对象上编辑So实例
在这里插入图片描述

双重序列化

JSON和XML等文件格式可能很难在编辑器中修改,在Unity外,使用文本编辑都可轻松修改。
SO在Unity中修改容易,Unity外不方便修改。
结合两者特点,可将SO数据存储在JSON中,修改时,直接修改JSON文件;运行时,将json文件转换为SO使用。
在这里插入图片描述

观察者模式

利用SO实例共享的特点,结合委托使用。
例如,下面创建了一个无参数无返回值的EventChannel,
新建一份So实例,代表一种委托类型。
需要监听或触发该委托的对象可获取该So实例,监听者注册方法,广播者触发方法。
此外可拓展So脚本,直接触发方法,方便测试。
此外Unity新版输入系统使用的是类似思路。

[CreateAssetMenu(menuName = "Events/Void Event Channel")] public class VoidEventChannelSO : ScriptableObject { 	public event UnityAction OnEventRaised; 	public void RaiseEvent() 	{ 		if (OnEventRaised != null) 		OnEventRaised.Invoke(); 	} } 

Runtime Sets 运行时集合

利用共享的特点,结合Mono脚本使用。
So脚本中定义一个集合,并实现添加和移除集合元素的方法。
Mono获用So实例,添加和移除集合元素。
运行时,即可根据So实例获取集合元素。
注意,So脚本无法在Inspector窗口显示场景中的引用对象(无法序列化场景对象)。
So脚本可正常使用,但显示不正确,集合元素显示为“Type mismatch”。

using System.Collections.Generic; using UnityEngine; [CreateAssetMenu(menuName = "GameObject Runtime Set", fileName = "GORuntimeSet")] public class GameObjectRuntimeSetSO : ScriptableObject {   private List items = new List();   public List Items => items;   public void Add(GameObject thingToAdd)   {       if (!items.Contains(thingToAdd))           items.Add(thingToAdd);   }   public void Remove(GameObject thingToRemove)   {      if (items.Contains(thingToRemove))          items.Remove(thingToRemove);   } } 

相关内容

热门资讯

透视游戏!aapoker辅助软... 透视游戏!aapoker辅助软件合法,闲逸app透视版,辅助教程(有挂技巧)-哔哩哔哩小薇(透视辅助...
透视科技!德普之星透视辅助插件... 透视科技!德普之星透视辅助插件(透视)底牌透视挂辅助方法(可靠开挂辅助AA德州教程)-哔哩哔哩;德普...
一分钟了解!金华佛手在线辅助软... 一分钟了解!金华佛手在线辅助软件(辅助挂)真是真的有挂(专业辅助扑克教程)-哔哩哔哩;金华佛手在线辅...
黑科技辅助!德扑之星辅牌器可以... 黑科技辅助!德扑之星辅牌器可以找(智能ai辅助工具)软件透明挂黑科技(一贯是真的有挂)-哔哩哔哩;亲...
透视美元局!wepoker透视... 透视美元局!wepoker透视脚本是有挂(透视)底牌透视挂辅助机器人(可靠开挂辅助可靠教程)-哔哩哔...
黑科技辅助!aapoker系统... 黑科技辅助!aapoker系统机制(智能ai辅助工具)软件透明挂黑科技(从前有挂)-哔哩哔哩是一款可...
透视了解!德普之星的辅助工具介... 透视了解!德普之星的辅助工具介绍,青龙辅助器,科技教程(有挂方法)-哔哩哔哩运青龙辅助器辅助工具,进...
四分钟了解!星悦手机麻将是有挂... 四分钟了解!星悦手机麻将是有挂(辅助挂)固有存在有挂(专业辅助AA德州教程)-哔哩哔哩;星悦手机麻将...
透视了解!德扑之心免费透视(透... 透视了解!德扑之心免费透视(透视)底牌透视挂辅助工具(可靠开挂辅助必赢教程)-哔哩哔哩;1.德扑之心...
透视透视!pokemmo手机版... 透视透视!pokemmo手机版脚本免费,福建兄弟十三水辅助器下载,2025新版(有挂技术)-哔哩哔哩...