问题标签 [scriptable-object]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2421 浏览

unity3d - 如何使用 ScriptableObject 进行关卡的预制转换?

我有 3 种预制件:A、B 和 C

在设计关卡时,在播放模式下,我在关卡中添加和定位它们。

如何创建一个 ScriptableObject 来保存对这些预制件及其转换的所有实例的引用?

具体来说,在 PlayMode 中,Scriptable 对象应动态响应预制件在 PlayMode 中的位置和旋转变化。

我无法想象如何做到这一点,尽管这似乎是对 Scriptable Objects 的一种很好的使用。

0 投票
2 回答
615 浏览

c# - 重新加载程序集以访问新的 ScriptableObject 脚本类型

我正在从模板创建一个新脚本。但是,在程序集有机会重新编译之前,无法访问这种新的脚本类型。我正在尝试创建新 ScriptableObject 的实例,以便通过代码生成它。

一切正常,直到我使用 CreateInstance(); 此时,该类型还不存在。我必须等待大会重新编译并投降类型......

我在谷歌上搜索了刷新大会的概念,但没有找到任何东西。

我还使用 async/await 谷歌搜索,以延迟调用 CreateInstance(),直到在程序集之后,肯定有新类型......到目前为止,这些尝试要么锁定了编辑器,要么没有按预期工作...(我是 C# 中这种异步风格的新手)

我对解决此问题的组装解决方案或异步解决方案持开放态度。

0 投票
1 回答
750 浏览

c# - 从一个保存文件中反序列化多个不相关的 ScriptableObjects

我想将多个不相关ScriptableObjects的对象保存到一个保存文件中。这样,我可以保存/加载我可能想要跟踪的任何数据。IE。门解锁,库存,高分,找到宝箱等。这样我仍然可以使用ScriptableObjects,保存和/或重新加载任何受DataManager. 我只想DataManager保存并重新加载ScriptableObjects他们保存的数据。

在此处输入图像描述

ScriptableObjects在我看来,将不同的文件保存到一个文件似乎可以正常工作。如果我打开data_editor.sav文件,我可以看到数据已经序列化并放入文件中。

但是,读回数据并尝试重新填充 myDataManagermanagedData属性是不断破坏的原因。我一生都无法弄清楚如何将 JSON 字符串反序列化回ScriptableObjects.

我得到错误:

ArgumentException:无法将 JSON 反序列化为“ScriptableObject”类型的新实例。

我已经查看了几个 SO 问题,包括这个问题,但我似乎找不到任何可以将多个不同的ScriptableObjects问题合二为一的方法。

有什么帮助吗?

我已经尝试过各种变化JsonUtility.FromJsonOverwriteJsonUtility.FromJson<ScriptableObject>但我无法让它发挥作用。

DataStore 这是写入磁盘的类。

从保存文件中读回数据后,我可以输出查看 SO 的数据。

在此处输入图像描述

这是 SO 的外观

在此处输入图像描述 在此处输入图像描述

数据管理器

IDataSaver

JsonSaver

0 投票
1 回答
2117 浏览

unity3d - 全局脚本对象

假设我有这个 ScriptableObject 来表示卡片列表:

然后我创建 ScriptableObject 并用我所有的卡片信息填充它。

有没有办法修改此代码,以便任何脚本都可以静态访问它?例如,是否可以给出CardList单例行为?

我不想创建另一个类,创建一个ScriptableObjectManager可以引用的类很容易CardList。我宁愿CardList.instance.cardName[i]直接打电话给类似的东西。

0 投票
1 回答
7192 浏览

c# - 如何在更改其值后在运行时保存 ScriptableObject

我在使用 ScriptableObjects 作为 Unity 应用程序中的保存对象时遇到问题。当我尝试将值写入它们时,一切都很好,但是如果我想关闭应用程序并加载 ScriptableObject 的值,这些值将重置为它的最后一个值。这破坏了我使用它们来保存游戏值的想法。

我尝试调试将值保存到我的一个 Scriptableobjects 的整个过程,这似乎有效,每当我暂停场景时,我的 Scriptableobject 中的所有值。但是,只要我不暂停场景,Scriptableobject 就不会像看起来那样采用任何值(这里有一些关于此的示例代码)

(这只是一些示例代码,应该是对该主题感兴趣的所有内容。如果您有任何问题或需要更多背景知识,请询问,我可以尝试提供)

0 投票
1 回答
5369 浏览

c# - 实例化 ScriptableObjects

谁能告诉我我的方法的优点/缺点?

我有状态效果,作为脚本对象的技能,具有独特的字段,对于每个游戏中的角色都不同(如持续时间、伤害、施法时间,这都取决于个人角色的统计数据)。此外,我在其中拥有大部分逻辑,即仅通过每个对象的 StatusController/SkillCastingController 中的事件进行控制。所以我想出了使用: Object.Instantiate(assigned shared ScriptableObject instance) 为每个人提供单独的实例。

Object.Instantiate(ScriptableObject) 的内存开销很大吗?因为它将在运行时以这种方式大量使用(在运行时应用状态效果 = 使用 Object.Instantiate)。

我只是希望,以这种方式使用 ScriptableObjects 就像它们是简单的类一样工作,不同之处仅在于在编辑器中创建和编辑它们的能力。如果这个假设成立 - Object.Instantiate(在检查器 StatusEffect/Skill ScriptableObject 中分配)与使用复制构造函数创建简单类的新实例相同(new StatusEffect(statuseffects[0]/Skills[0]))。如果这是真的 - 不应该有很多内存使用,对吧?

来自专业人士的引用,有什么想法吗?:

SO 只是一个为在 Unity 序列化中具有方便含义的数据而设计的类。如果您正在创建 SO 的运行时实例,这是确保运行时只读的常见模式,那么您只是在复制根 ScriptableObject 的内存。因为 Object.Instantiate 不会隐式复制任何子资产,如果它们被根引用,则克隆将保持对原始 Scriptable Object 子资产的引用。除非这些 ScriptableObjects 分配大量内存,否则重复的不利影响应该是名义上的。

0 投票
1 回答
349 浏览

c# - 在 Unity 中使用 ScriptableObjects 制作的基于文本的冒险游戏中的保存/加载系统问题

我几乎完成了我的基于文本的冒险游戏,并且正在尝试设置一个有效的保存/加载系统。我似乎无法做到这一点。

我查看了多个教程,我觉得 Json 可能是我需要的。不幸的是,我似乎无法让“加载”部分的 Json 代码正确。我还担心我要保存的数据量对于简单的序列化过程来说太多了,或者我过于复杂了,有一个更简单的解决方案。

这是我试图保存/加载的数据。如您所见,我有字典和列表,以及我试图保存的“房间”ScriptableObject,即保存游戏时玩家所在的 currentRoom。当前房间在 GameController 中被跟踪。

然后这是我的保存系统代码,我正在尝试使用 Json 和二进制文件实现序列化。

我把'????' 上面是我似乎无法让它接受我试图覆盖的对象的地方,我认为它是“SaveData”,因为当玩家点击“加载”按钮时,这是我将信息拉入游戏的地方. 它告诉我“'SaveData' 是一种类型,在给定的上下文中无效”

这是我在使用“保存”和“加载”按钮时调用的代码,它位于我的 GameController 类中,在游戏播放期间跟踪大部分内容。

在游戏中使用时,我收到“SerializationException”错误,所以我尝试尝试 Json。我读到它可以序列化比基本的 Unity 序列化器更多的地方。错误消失了,它似乎可以用 Json 保存,但现在我无法正确获取 Load 语法。

我是一个新手,所以也许我让这变得更难了……我也研究了 Userprefs,但我认为我不能将 Scriptable Object Room 转换为 String 类型。

提前致谢!

[更新] 这是我能够以 .txt 格式保存的内容。这证明它正在保存,只是不确定“instanceIDs”会给我需要的负载。

ˇˇˇˇö{"saveRoomNavigation": {"instanceID":11496},"saveNounsInInventory": ["sword"],"saveUseableItemList":[{"instanceID":11212}, {"instanceID":11588},{"instanceID": 10710},{"instanceID":11578}, {"instanceID":10718},{"instanceID":11388}, {"instanceID":11276}],"saveNounsInRoom":["rocks","hole"]}

0 投票
4 回答
7266 浏览

c# - Unity:ScriptableObject 的自定义检查器不起作用

我为我的一些 ScriptableObject 创建了一个自定义检查器。检查员似乎工作得很好。如果检查器中的值发生更改,则该值将在游戏中使用。但是,一旦我重新启动 Unity,该值就会恢复到原来的值,因此更改不会应用于文件。我已经通过查看文件进行了检查。这是我的自定义检查器:

我已添加该行EditorUtility.SetDirty(bc);,因为我已阅读该行应将更改应用于文件。其他一些线的...代表与点上方的两条线几乎相同。

如何保存对 ScriptableObject 文件的更改。

0 投票
3 回答
4230 浏览

unity3d - 在运行时创建可编写脚本的对象 - 它创建实例但不将它们保存在资产文件夹中?

在此处输入图像描述所以我有一个小问题,我第一次从电子表格数据创建可编写脚本的对象,试图使用数据库自​​动制作它们......

它“部分有效”但是我不明白如何让它正确保存文件。由于在 Assets/Drill_Words/ 文件夹中有某种文件,但没有包含所有信息的可编写脚本的对象(参见图片)但是,DrillWords 列表具有可编写脚本的对象,我尚未测试它们是否具有所有数据,我在停止播放后丢失了这些可编写脚本的对象?

知道我做错了什么,如何保存它们?

谢谢 - N

0 投票
1 回答
72 浏览

c# - 从计算机上的文件导入 Sprite 并在可编写脚本的对象实例中引用它

Character ScriptableObject

我有一个 ScriptableObject“Character”,并且创建了它的一个实例。它有一个 Sprite 字段,但我不想在开始游戏之前引用它。

字符.cs

现在我有一个特定的文件夹,玩家应该在其中放置自定义图像文件(.jpg、.png),比如“我的文档/我的游戏/我的图片”。当玩家在 UI 中按下按钮时,将显示所有图像文件,然后用户可以单击图像,然后该精灵将在 Character ScriptableObject 的实例中被引用。

我还想添加一些要求,例如图像的尺寸应为 200x200。