问题标签 [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.
c# - 关于 scriptableObject 的困惑
当我们仍然制作 ScriptableObject 的多个副本/实例时,它对内存优化有什么好处。?
在过去,脚本附加到预制件上,并且在实例化时,每个脚本都用于在内存中创建/保留自己的插槽,这是一种不好的方法,因为同一脚本有多个副本。
我们在可编写脚本的对象中所做的是:创建可编写脚本的对象,从 Asset>Create> 创建其多个实例,在这些实例中提供数据并在需要时访问数据。它与在预制件上附加脚本并实例化它或制作包含数据的 ScriptableObject 的多个副本并从中访问数据有何不同。毕竟,我们也在 scriptableobject 中制作了多个副本。
请解释一下 ScriptableObject 的多个副本如何对内存友好,然后是实例化的预制件的多个副本。
c# - 使用 GIT 丢失 Unity 可编写脚本的对象引用
我目前正在开发一个项目,我们使用可脚本对象来存储游戏中的所有配置。问题来自使用 git,因为有时我们会丢失存储在这些 SO 上的引用。
例如,我有一个名为 A 的配置,带有一个 GameObject 变量。在我的分支“Branch1”上,变量为空,在我的分支上“Branch2”被分配给一个预制件。我正在研究 Branch1,然后移至 Branch2,但 SO 没有更新,变量仍然为 null,尽管在 Branch2 上该变量实际上有一个值。
我们试图重新导入资产,但没有解决任何问题。唯一似乎起作用的是一个奇怪的过程。如果我们在移动到 BranchB 后对 SO 进行更改,我们保存然后丢弃来自 git(我们使用 sourcetree)的更改,SO 配置现在很好,因为它应该在当前分支上。
这是一种奇怪的行为,我们拥有的更奇怪的解决方案会导致大量时间损失和一些错误。
任何人都知道正在发生的事情并知道如何解决它?
我们正在使用 Unity2019.1.14f1,我们使用 Odin 作为 SO 的自定义检查器(也许是相关的)。
c# - 在 Unity 的 ScriptableObject 中序列化脚本实例
我知道这是可以做到的,因为神奇的插件Odin有一些史诗般的序列化工具。
我希望我可以使用 Odin 来做到这一点,但即使他们的 [Serialize] 标签也不起作用。
我想在 Scriptable Object 中序列化一个新的脚本实例。
使用 Odin,您可以序列化字典,如果您序列化包含接口(脚本)实例的字典,它允许您在字典中创建该脚本的新实例,如下所示:
由于可以将脚本的实例存储在字典中,我很好奇如何自行完成。
我要保存的脚本是一个只有函数和一个空构造函数的通用脚本。
你知道为什么要在 ScriptableObject 中序列化接口(脚本)的实例吗?
理想情况下,我可以以某种方式创建一个属性,然后强制它像这样进行序列化:
然后在检查器中,我只需单击该框并创建该脚本的一个新实例以附加到该对象。
unity3d - 使用 ScriptableObjects 动态生成界面
你好伙计们!
目前正在开发一个 AR 应用程序,我正在学习和使用ScriptableObjects。
由于几乎没有编程背景(不到有效的一年),我在某些方面有点挣扎。
我正在尝试为带有交互式元素(又名按钮)的“自制”视频播放器
创建一个框架。
到目前为止,这些按钮(社交媒体、商店、网站)的 sprite 和外部链接都存储在ScriptableObjects 中(帧的 sprite 和视频播放器相关的元素,如 renderTexture 或 videoClip)也是如此。
我想更进一步,通过创建一个预制件让我选择按钮的数量和它们的位置。
例如,假设我必须创建 2 个不同的视频播放器:
- VideoPlayer_A 播放器和框架,以及 3 个按钮(facebook、twitter 和网站)
- VideoPlayer_B 播放器和框架,以及 2 个按钮(facebook 和网站)
考虑到按钮(无论是 1、2 还是 4 -maximum-)必须保持并且在框架顶部具有相等的空间(参见下面的屏幕截图),我该如何实现这一点。最终目标是拥有一个非常模块化的系统,根据我拥有的数据创建框架。
最后一点,我不是要求“已经制定”的解决方案,而是更多地要求实现我所期待的路径。由于我仍在学习,我正在寻找提示,“方法”,但不是直接的解决方案。
谢谢,提前;)
unity3d - ScriptableObject 是一个好的数据库设计吗?
我正在尝试制作一个简单的游戏数据库,其中包含简单的项目。
我的数据库只是一个 ScriptableObject,包含其他 ScriptableObject(项目)的列表,其中包含有关项目的信息并持有一个字符串键。
1 - 有没有比使用密钥字符串识别项目更好的解决方案?
2 - 如果我想生成项目。例如,将随机统计信息添加到现有的“模板”项目中,我是否被迫为项目创建 MonoBehaviour 脚本并从模板脚本对象中实例化它?我使用流媒体资产来保存播放器的库存,因此我需要能够在流媒体资产中使用那些生成的项目。
PS:我更喜欢避免使用真正的数据库(例如 sql)
c# - 在 Unity3D 游戏过程中创建/初始化可编写脚本的游戏对象
可编写脚本的对象可以用作 Unity3d 中的数据容器。它们不需要附加到场景中的游戏对象,但可以在我们的项目中保存为资产。大多数情况下,它们被用作仅用于存储数据的资产。
我们可以如下创建和添加数据。
然后我们可以通过 Create->Card 创建资产。
我想做的不是为游戏创建资产,而是根据游戏过程中的数据创建资产。并在游戏或场景结束时摧毁它们。有没有人有这样做的想法?任何指南/想法将不胜感激。谢谢你。
c# - 如何从 Unity 中的 Scriptable Objects 打印随机选择的字符串?
我想从可编写脚本的对象中随机选择一个项目,然后将随机选择的项目打印到控制台。
如何继续将以下值打印到控制台?
c# - 序列化 ScriptableObject 参考 (InstanceID)
假设我有一个 PlayerData ScriptableObject 包含对 AvatarData ScriptableObject 的引用,如下所示:
在游戏过程中,玩家可以将头像更改为另一个。所有 AvatarData 对象都保存在 .asset 文件中。我想保存对当前选择的 AvatarData 实例的引用并将其保存在 json/binary 文件中以供加载。
在内存中创建对象的情况下,InstanceID 将更改每个游戏会话。在 .asset 文件中序列化的对象实例呢?由于实例已保存到文件中,我们可以依赖它/确保 InstanceID 不会更改吗?JsonUtility.ToJson
将为每个对象生成带有 InstanceID 的 json,但我需要确保在调用JsonUtility.FromJsonOverwrite
. 我知道它不适用于在内存中创建的对象,但我认为它应该适用于保存为资产文件的实例。恐怕每次构建应用程序时 InstanceID 都可能会发生变化。
这个事情谁有经验?创建自己的 UUID/Hashtable 来引用 Unity3D 中的对象会更好吗?
我发现的大多数答案都建议使用 UnityEditor 命名空间,但它不能在构建中使用。
c# - 计数器未在统一 UI 上更新,但变量为
在我正在开发的钓鱼迷你游戏中,玩家捕获的每条独特的鱼都被写入“日志”类型的 UI。如果玩家再次钓到了那种鱼,而不是在 UI 中写一个全新的条目,分数会增加 1 以显示他们钓到了多少次这种鱼。
我正在使用可编写脚本的对象来存储有关每条鱼的信息(名称、大小、图片等)以及它被捕获的次数。我可以在检查器中看到,每次捕获鱼时变量都会增加,并且每次捕获独特的鱼以及次数时,我都会调试一条消息。
UI 似乎会更新第一次捕获的次数,但是,每次捕获鱼后它似乎总是保持在 1,即使我正在写入 UI 的变量正在改变。
这是更新 UI 的代码:
下面是当玩家钓到鱼时我调用该方法的方式:
我希望有人可以阐明我可能做错了什么。
非常感谢您的时间和帮助!
c# - Scriptable Object 实例的空引用异常,但它真的有效吗?
我正在制作一个带有 Enemy 定义的 SO,如下所示:
我将它附加到 Enemy GameObject 上,如下所示:
在播放控制台输出时:
所以它在第 29 行抛出了一个空引用,但随后它正确地输出了第 29 行,并且所有代理变量在播放期间都在检查器中正确设置。有没有办法摆脱错误?我只是忽略它吗?