ScriptableObject使用

news2024/11/17 1:54:25

资料

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1949669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3前端开发-小兔鲜项目-form表单的统一校验

vue3前端开发-小兔鲜项目-form表单的统一校验&#xff01;实际上&#xff0c;为了安全起见&#xff0c;用户输入的表单信息&#xff0c;要满足我们的业务需求&#xff0c;参数类型等种种标准之后&#xff0c;才会允许用户向服务器发送登录请求。为此&#xff0c;有必要进行一次…

set_clock_groups -physically_exclusive 和-asynchronous是否有必要同时设置

引言 vc-spyglass sdc检查时遇到的问题 正如vc spyglass sdc check提示Error: 当两个时钟设置成物理互斥或逻辑互斥时&#xff0c;需要另外加上这两个时钟是异步设置的约束。 个人经历&#xff1a; 由于本人经验尚浅&#xff0c;之前遇到的项目&#xff0c;个人理解是设置了物…

W30-python03-pytest+selenium+allure访问百度网站实例

此篇文章为总结性&#xff0c;将pystest、selenium、allure结合起来 功能如下&#xff0c;web自动化&#xff0c;输入baidu网站&#xff0c;搜索“雷军”、打开网页中第一条内容 tools.webkeys 相关文件见附件。 pytestsel.py如下&#xff1a; import time import re impor…

全链路追踪 性能监控,GO 应用可观测全面升级

作者&#xff1a;古琦 01 介绍 随着 Kubernetes 和容器化技术的普及&#xff0c;Go 语言不仅在云原生基础组件领域广泛应用&#xff0c;也在各类业务场景中占据了重要地位。如今&#xff0c;越来越多的新兴业务选择 Golang 作为首选编程语言。得益于丰富的 RPC 框架&#xff…

在 Windows 搭建 flink 运行环境并模拟流数据处理

一、引入 在大数据场景中,开发者追求高效与灵活,Linux 系统以其稳定性成为众多组件的首选,但在资源有限的情况下,在本机搭建一个 Linux 虚拟机集群却显得过于笨重,启动、运行占资源,需要配置网络,无法和windows共享资源,尤其是对只有 8GB 内存的 Windows 系统用户来说…

C++内存管理(候捷)第五讲 笔记

GNU C对allocators的描述 new_allocator 和malloc_allocator&#xff0c;它们都没有特别的动作&#xff0c;无非底部调用operator new和malloc。它们没有用内存池 区别&#xff1a;::operator new是可重载的 智能型的allocator&#xff0c;使用内存池&#xff0c;分一大块然后…

lua 游戏架构 之 游戏 AI (四)ai_autofight_find_target

定义一个名为 ai_autofight_find_target 的类&#xff0c;继承自 ai_base 类。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读237次。定义了一套接口和属性&#xff0c;可以基于这个基础类派生出具有特定行为的AI组件。例如&#xff0c;可…

【Python系列】isin用法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

简单使用nginx

打开下载的nginx文件夹下的。。具体地址 打开并编辑nginx.conf文件 server {listen 8089;//访问端口号server_name localhost;//访问地址#charset koi8-r;#access_log logs/host.access.log main;location / {root D:/development/dist/;//dist包地址index index.h…

无人机之降落操作及紧急情况处理

一、无人机降落操作 1、选择降落地点 a.提前选择一个平坦且没有障碍物的降落点&#xff1b; b.确认降落点周围没有行人或障碍物&#xff0c;保证降落的安全性。 2、降低飞行高度 a.缓慢降低飞行高度&#xff0c;尽量保持匀速下降&#xff0c;防止因下降过快导致无人机受损…

用户管理与高级SQL语句(数据库管理与高可用)

1.表&#xff08;Table &#xff09; 数据库中的表与我们日常生活中使用的表格类似&#xff0c;它也是由行&#xff08;Row&#xff09; 和列&#xff08;Column&#xff09;组成的。列由同类的信息组成&#xff0c;每列又称为一个字段&#xff0c;每列的标题称为字段名。行包…

NeRF:从二维图像到三维重建【初识!原理通俗讲解】

NeRF&#xff1a;从二维图像到三维重建 反渲染&#xff08;Inverse Rendering&#xff09;可以理解为成像渲染的反过程&#xff0c;是指从一组二维图像重建三维场景的过程&#xff0c;这在计算机视觉和图形学中具有重要意义。NeRF&#xff08;Neural Radiance Fields&#xff…

Profinet转ModbusTCP网关模块的配置与应用详解

Profinet转ModbusTCP网关模块&#xff08;XD-ETHPN20&#xff09;是一种常见的工业通信设备&#xff0c;广泛应用于现代工业自动化系统中。通过使用Profinet转Modbus TCP网关模块&#xff08;XD-ETHPN20&#xff09;将Profinet协议转换成Modbus TCP协议&#xff0c;实现了不同网…

【Web】LitCTF 2024 题解(全)

目录 浏览器也能套娃&#xff1f; 一个....池子&#xff1f; 高亮主题(划掉)背景查看器 百万美元的诱惑 SAS - Serializing Authentication exx 浏览器也能套娃&#xff1f; 随便试一试&#xff0c;一眼ssrf file:///flag直接读本地文件 一个....池子&#xff1f; {…

昇思25天学习打卡营第23天|LSTM+CRF序列标注

Mindspore框架CRF条件随机场概率图模型实现文本序列命名实体标注|&#xff08;一&#xff09;序列标注与条件随机场的关系 Mindspore框架CRF条件随机场概率图模型实现文本序列命名实体标注|&#xff08;二&#xff09;CRF模型构建 Mindspore框架CRF条件随机场概率图模型实现文本…

IEC104转MQTT网关快速实现了IEC104到MQTT的转换和数据交互

随着智能电网技术的不断进步&#xff0c;IEC 104&#xff08;IEC 60870-5-104&#xff09;协议作为电力系统中重要的远动通信标准&#xff0c;正逐步融入更广泛的物联网生态系统中。亚马逊AWS&#xff08;Amazon Web Services&#xff09;&#xff0c;作为全球领先的云计算服务…

神经网络与注意力机制的权重学习对比:公式探索

神经网络与注意力机制的权重学习对比&#xff1a;公式探索 注意力机制与神经网络权重学习的核心差异 在探讨神经网络与注意力机制的权重学习时&#xff0c;一个核心差异在于它们如何处理输入数据的权重。神经网络通常通过反向传播算法学习权重&#xff0c;而注意力机制则通过学…

python通过omniORBpy调用CORBA

omniORB参考地址&#xff1a; omniORB omniORB - Browse Files at SourceForge.net omniORB - Browse /omniORBpy/omniORBpy-4.3.0 at SourceForge.net Windows 普通使用好像不需要安装omniorb。就对接北向接口业务需要使用python3.10的windows包&#xff0c;但目前好像没有…

vue接入google map自定义marker教程

需求背景 由于客户需求&#xff0c;原来系统接入的高德地图&#xff0c;他们不接受&#xff0c;需要换成google地图。然后就各种百度&#xff0c;各种Google&#xff0c;却不能实现。----无语&#xff0c;就连google地图官方的api也是一坨S-H-I。所以才出现这篇文章。 google地…

SpringBoot整合elasticsearch-java

一、依赖 系统使用的是ElasticSearch8.2.0 <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.1.0</version> </dependency> 二、配置 1、yml文件配置 elastics…