问题标签 [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.
unity3d - 如何使用 ScriptableObject 进行关卡的预制转换?
我有 3 种预制件:A、B 和 C
在设计关卡时,在播放模式下,我在关卡中添加和定位它们。
如何创建一个 ScriptableObject 来保存对这些预制件及其转换的所有实例的引用?
具体来说,在 PlayMode 中,Scriptable 对象应动态响应预制件在 PlayMode 中的位置和旋转变化。
我无法想象如何做到这一点,尽管这似乎是对 Scriptable Objects 的一种很好的使用。
c# - 重新加载程序集以访问新的 ScriptableObject 脚本类型
我正在从模板创建一个新脚本。但是,在程序集有机会重新编译之前,无法访问这种新的脚本类型。我正在尝试创建新 ScriptableObject 的实例,以便通过代码生成它。
一切正常,直到我使用 CreateInstance(); 此时,该类型还不存在。我必须等待大会重新编译并投降类型......
我在谷歌上搜索了刷新大会的概念,但没有找到任何东西。
我还使用 async/await 谷歌搜索,以延迟调用 CreateInstance(),直到在程序集之后,肯定有新类型......到目前为止,这些尝试要么锁定了编辑器,要么没有按预期工作...(我是 C# 中这种异步风格的新手)
我对解决此问题的组装解决方案或异步解决方案持开放态度。
c# - 从一个保存文件中反序列化多个不相关的 ScriptableObjects
我想将多个不相关ScriptableObjects
的对象保存到一个保存文件中。这样,我可以保存/加载我可能想要跟踪的任何数据。IE。门解锁,库存,高分,找到宝箱等。这样我仍然可以使用ScriptableObjects
,保存和/或重新加载任何受DataManager
. 我只想DataManager
保存并重新加载ScriptableObjects
他们保存的数据。
ScriptableObjects
在我看来,将不同的文件保存到一个文件似乎可以正常工作。如果我打开data_editor.sav
文件,我可以看到数据已经序列化并放入文件中。
但是,读回数据并尝试重新填充 myDataManager
的managedData
属性是不断破坏的原因。我一生都无法弄清楚如何将 JSON 字符串反序列化回ScriptableObjects
.
我得到错误:
ArgumentException:无法将 JSON 反序列化为“ScriptableObject”类型的新实例。
我已经查看了几个 SO 问题,包括这个问题,但我似乎找不到任何可以将多个不同的ScriptableObjects
问题合二为一的方法。
有什么帮助吗?
我已经尝试过各种变化JsonUtility.FromJsonOverwrite
,JsonUtility.FromJson<ScriptableObject>
但我无法让它发挥作用。
DataStore 这是写入磁盘的类。
从保存文件中读回数据后,我可以输出查看 SO 的数据。
这是 SO 的外观
数据管理器
IDataSaver
JsonSaver
unity3d - 全局脚本对象
假设我有这个 ScriptableObject 来表示卡片列表:
然后我创建 ScriptableObject 并用我所有的卡片信息填充它。
有没有办法修改此代码,以便任何脚本都可以静态访问它?例如,是否可以给出CardList
单例行为?
我不想创建另一个类,创建一个ScriptableObjectManager
可以引用的类很容易CardList
。我宁愿CardList.instance.cardName[i]
直接打电话给类似的东西。
c# - 如何在更改其值后在运行时保存 ScriptableObject
我在使用 ScriptableObjects 作为 Unity 应用程序中的保存对象时遇到问题。当我尝试将值写入它们时,一切都很好,但是如果我想关闭应用程序并加载 ScriptableObject 的值,这些值将重置为它的最后一个值。这破坏了我使用它们来保存游戏值的想法。
我尝试调试将值保存到我的一个 Scriptableobjects 的整个过程,这似乎有效,每当我暂停场景时,我的 Scriptableobject 中的所有值。但是,只要我不暂停场景,Scriptableobject 就不会像看起来那样采用任何值(这里有一些关于此的示例代码)
(这只是一些示例代码,应该是对该主题感兴趣的所有内容。如果您有任何问题或需要更多背景知识,请询问,我可以尝试提供)
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 分配大量内存,否则重复的不利影响应该是名义上的。
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"]}
c# - Unity:ScriptableObject 的自定义检查器不起作用
我为我的一些 ScriptableObject 创建了一个自定义检查器。检查员似乎工作得很好。如果检查器中的值发生更改,则该值将在游戏中使用。但是,一旦我重新启动 Unity,该值就会恢复到原来的值,因此更改不会应用于文件。我已经通过查看文件进行了检查。这是我的自定义检查器:
我已添加该行EditorUtility.SetDirty(bc);
,因为我已阅读该行应将更改应用于文件。其他一些线的...
代表与点上方的两条线几乎相同。
如何保存对 ScriptableObject 文件的更改。
c# - 从计算机上的文件导入 Sprite 并在可编写脚本的对象实例中引用它
Character ScriptableObject
我有一个 ScriptableObject“Character”,并且创建了它的一个实例。它有一个 Sprite 字段,但我不想在开始游戏之前引用它。
字符.cs
现在我有一个特定的文件夹,玩家应该在其中放置自定义图像文件(.jpg、.png),比如“我的文档/我的游戏/我的图片”。当玩家在 UI 中按下按钮时,将显示所有图像文件,然后用户可以单击图像,然后该精灵将在 Character ScriptableObject 的实例中被引用。
我还想添加一些要求,例如图像的尺寸应为 200x200。