当前位置: 首页 > news >正文

ScriptableObject使用

资料

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<GameObject> items = new List<GameObject>();public List<GameObject> 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);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 新手小白做视频素材去哪里下载?8个无水印视频素材库分享
  • mysql 主从复制 读写分离 MHA
  • Android APK混淆处理方案分析
  • MySQL 存储引擎详解
  • 关于 夜莺n9e 的简易部署
  • 动态接口调优:在Mojo模型中调整模型的输入输出接口
  • 学习记录:ESP32控制舵机 FREERTOS BLE
  • RuoYi-Vue-Plus(动态添加移除数据源)
  • 构建查询洞察 UI
  • WEB前端10- Fetch API(同步/异步/跨域处理)
  • 基于Markdown的文档网站生成工具-VitePress框架
  • 强制通风(2):发动机为什么要进行曲轴强制通风?它的目的是什么呢?
  • 深入 Symfony 服务容器:依赖注入的艺术
  • 基于web的物流配送管理系统/基于客户时间窗变化的物流配送管理系统/快递配送管理系统
  • AI发展下的伦理挑战,应当如何应对?
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Android开源项目规范总结
  • CEF与代理
  • CentOS 7 防火墙操作
  • Hibernate最全面试题
  • Invalidate和postInvalidate的区别
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • laravel5.5 视图共享数据
  • leetcode46 Permutation 排列组合
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Node项目之评分系统(二)- 数据库设计
  • PHP 7 修改了什么呢 -- 2
  • Redash本地开发环境搭建
  • Webpack 4 学习01(基础配置)
  • 从PHP迁移至Golang - 基础篇
  • 关于 Cirru Editor 存储格式
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 聊一聊前端的监控
  • 前端之React实战:创建跨平台的项目架构
  • Nginx实现动静分离
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (笔试题)分解质因式
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计高校学生选课系统
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (一) 初入MySQL 【认识和部署】
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • **PHP二维数组遍历时同时赋值
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .NET 指南:抽象化实现的基类
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET开发不可不知、不可不用的辅助类(一)
  • /var/log/cvslog 太大
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法