问题标签 [unity3d-editor]
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# - 非实例化加载的预制件与实例化的预制件相比如何?
例子
在 Unity5 中,假设一个名为“SomeObject”的游戏对象被存储为一个预制件Assets/Resources/SomeObject.prefab
,我知道我可以创建一个预制件的实例,如下所示:
一旦执行,instance
GameObject 将是原始“SomeObject”预制件的副本,并将被放置在名为“SomeObject(Clone)”的当前活动场景中。
据我了解,GameObject prefab
代表实际的预制资产,对其所做的任何更改(设置名称、添加组件等)都会写入原始预制资产,即使在退出编辑器播放模式后这些更改仍然存在。
问题
由于所有游戏对象通常都存储在一个场景中,并且上面示例中的
scene
属性GameObject prefab
似乎是 Unloaded/Invalid/Unnamed,我究竟应该将这个特殊的 GameObject 放在哪里?我似乎可以用它做所有我可以用普通游戏对象做的事情,除了在层次/场景视图中可见。它是有效地处于某种不确定状态,还是特殊的 PseudoScene?它似乎通过
LoadSceneMode.Single
场景变化持续存在,但不像DontDestroyOnLoad
Objects 在传递到时移动到的特殊场景GameObject.DontDestroyOnLoad(...)
。除了生命周期变化、无效场景和彼此不同的对象(具有不同的对象等)之外,上述示例
prefab
之间是否还有其他值得注意的差异?instance
GetInstanceID()
由于调用
GameObject.Instantiate(...)
会prefab
产生一个处于有效场景中的游戏对象,有没有办法手动创建处于类似“无场景”状态的游戏对象?我知道 Unity 打算让所有游戏对象都出现在场景中,所以这纯粹是一个学术问题。
c# - 为什么未加载 ScriptableObject 资产中的嵌套资源引用?
请阅读整个问题,并在发布答案之前运行示例。
概述
在静态编辑器脚本中加载嵌套资产时,我在 Unity 5.6.1 中遇到了一些不一致的行为(因此在标有 的类的静态构造函数中[InitializeOnLoad]
)。
我正在加载一个ScriptableObject
带有 的资产Resources.Load
,并且 ScriptableObject 具有对另一个资产资源的公共引用,让我们假设一个 GameObject Prefab。从这一点开始,我将 ScriptableObject 称为“包装器”,因为在这个简化的示例中,这是它的唯一用途。
虽然Resources.Load
正确返回 Wrapper,但嵌套的 Prefab 引用通常在第一次运行期间尚未加载,但在第二次运行后加载:
据我了解,这是一个执行顺序问题,其中在静态构造期间尚未加载相关的预制资源,并且在随后的运行中它仍然被缓存。
我假设在加载具有对另一个资产的序列化引用的资产时,默认情况下会自动加载嵌套资产,无论这是否是在静态初始化期间。然而,这里似乎并非如此。
证明 Wrapper 资产确实在其序列化数据中正确引用了 Prefab(资产序列化设置为 Force Text):
我也尝试过使用AssetDAtabase.LoadAssetAtPath
(至少在编辑器中),但并没有什么不同。
示例项目
您可以在此处下载 UnityPackage,其中包含以下内容:
或者复制如下:
脚本:
ExampleWrapper.cs:
静态加载器.cs:
在 Hierarchy 中创建一个空的“ExampleObject”游戏对象,然后将其保存为 Prefab
Assets/Resources/ExampleObject.prefab
创建 ExampleWrapper 的资产实例并在
Assets/Resources/Wrapper.asset
请注意,因为有时 unity 确实会正确缓存资产,
基本原理
这里的示例是故意简化的,但它基于ScriptableObjects
用于存储/共享自定义系统配置数据的真实项目。
请不要回复以下内容:
- “Just Use
Object.Instantiate
” - 不改变结果,Resources.Load
在某些情况下修改返回的原始对象是可取的。 - “跳过包装器并直接引用预制件/手动加载它” - 虽然这绕过了加载问题,但它也错过了问题的重点。添加抽象级别可以使系统之间的资源共享更易于维护。此外,此问题不仅限于预制件(此处仅用于简单示例)。更现实的示例将包含多个嵌套对象,例如 Sprites、Materials、其他 ScriptableObjects 等。
- “在静态构建期间不要加载” - Unity 支持静态系统(为什么还要提供
[InitializeOnLoad]
?),并且使用基于 ScriptableObjects 的资产来存储此类系统的配置信息是一个非常真实的用例。在完全重新构建系统之前,我想看看其他潜在的替代方案。
我在找什么:
- 当我在诸如此类的静态上下文中加载它时,我是否可以强制 Unity 预加载在包装器中序列化的资产,而不必通过其路径手动加载其内容?
- 换句话说,我不想只是 run
Resources.Load<GameObject>("ExampleObject")
,因为这首先会否定封装它的全部意义。我可以修改ExampleWrapper
类,但是任何潜在的解决方案都需要足够自动化,以便将预制件添加到检查器中的字段的工作流程将是所有需要的。
编辑:还应该注意的是,奇怪的是,当我关闭项目并再次打开它时,我看到以下内容:
- 在启动过程中,静态构造函数被调用一次,包装器被加载,嵌套的预制件实际上被正确加载。
- 然后(仍然在初始启动中,因为它发生在我可以输入任何动作之前)它再次静态构造,这次加载 Wrapper 时,没有加载嵌套的预制件。
这个,我真的不明白。
unity3d - 对象移动以及在 UNity3d 编辑器中
也许你有一个移动对象的脚本,就像在编辑器 UNity3d 中或在商店中一样,其他人可以看到吗?付费或免费。例如,我点击了一个对象/选择了一个立方体,然后出现了箭头,对于这些箭头我拉,或者类似的东西?谢谢 !
unity3d - Unity - 有孩子的父母分崩离析
我有一个玩家角色,由一些立方体、球体和一个胶囊组成。我创建了空对象Player
,玩家的所有身体部位都是Player
. 我有两架飞机,中间有一个移动平台。我可以在普通平面和墙壁上行走和跳跃,但是当玩家在移动平台上时,玩家的身体部位会分崩离析。也许这真的很愚蠢,但我刚开始使用 Unity。
这就是问题所在,玩家在移动平台上崩溃了:http: //nl.tinypic.com/r/207s3sz/9
下面是关于概述、玩家、身体部位和带有相应角色持有人的移动平台的信息。body
所有身体部位都具有与屏幕截图中的部位相同的属性。谁能帮我解决这里出了什么问题?如何通过移动平台运输整个播放器?
HoldCharacter 脚本:
c# - 如何将新游戏对象设置为组件游戏对象的子对象?
我想创建一个空的GameObject
,它是 Components 的子级GameObject
。
示例:我有一个简单的样条曲线,我使用子对象作为控制点。我有一个添加新控制点的按钮,它使用以下代码创建一个新对象,并且还应该将新的控制点设置GameObject
为脚本对象的子对象。
这个实现不起作用并且没有在检查器中显示对象,我认为这意味着出现问题并且对象被破坏。
编辑:
为了测试设置父级是否正常工作,我打印了g
父级转换的名称。它打印了正确的名称,所以我认为问题在于设置父级没有反映在编辑器中。注意:如果这会影响统一性,我会在[CustomEditor()]
脚本之外使用脚本。MonoBehaviour
编辑 2 - 最小完整代码:
unity3d - 以编程方式将 FBX 导入资产文件(自定义编辑器)
我目前正在使用 Unity3D 中的自定义编辑器,我想在资产的导入过程中添加一些自定义属性(和组件)。
这个想法是为 3D 设计人员提供一个 GUI,他们可以在其中选择一个 FBX 文件,填写一些附加属性,单击“导入”,然后将在 Unity 项目中创建一个新资产,其中已经附加并设置了适当的脚本。
我已经看到了AssetPostprocessor
可以让我们在导入期间进行一些后处理的类,但似乎没有一种方法可以从中显示 GUI。
我也看过这个AssetDatabase.LoadAssetAtPath
方法,但它只加载已经导入的资产。
所以我的问题是,有没有办法在 FBX 文件在 Unity 中导入(处理)之前显示 GUI,然后.asset
通过组合 FBX 文件中的数据和附加组件(统一单行为)来创建统一资产(文件)脚本)我需要添加吗?
这可能不是要走的路,我需要使用预制件来实现这一点吗?(我宁愿不这样做,因为预制件似乎可以用作资产的聚合)
编辑
主要目标是让unity充当关卡设计师的关卡编辑器,因此编辑器中只有一半的参数化资产需要处理。这也意味着项目中已经有很多自定义编辑器。
c# - Unity 自定义检查器和子检查器
我正在 Unity 2017.2 中开发一个小型 ARPG。
我尝试为我的游戏的 AbilityBluePrint 类实现自定义编辑器。
基本上,AbilityBluePrints 包含在运行时生成能力所需的所有信息。包括一个 Effect[] ScritpableObjects 数组,在使用该能力时触发。
我目前拥有我需要实施和工作的一切,但我认为创建能力非常乏味,原因如下。
假设我有一个效果类 DamagePlusX :作为伤害修正值的效果。如果我想让这个效果对两个不同的能力有不同的修饰符值,那么我必须在我的资产目录中创建它的两个实例,并手动将每个实例分配给相应能力的 Effect[] 数组。我担心我最终会得到很多效果实例,每个效果实例基本上都有几个不同的整数和浮点数。
因此,我想我会使用一个有点像Unity Adventure Tutorial中的自定义检查器。
这个想法基本上是创建 AbilityBluePrint 的实例,然后使用自定义检查器能够动态实例化 Effects[] 数组中的效果,并能够直接在 AbilityBluePrint 检查器中编辑每个效果的属性。
基本上我想得到一些类似的东西(为可怜的photoshop道歉):
我试图转换教程中的脚本以满足我的需要,但从昨天开始我一直遇到同样的错误:
我已经尝试了很多事情,我想知道我正在尝试做的事情是否可以使用可编写脚本的对象。在原始教程中,相当于我的 BluePrintAbility 是 Monobehaviour。
我的代码如下:
我的 BluePrintAbility 类:
我的效果类:
我的 DamagePlusX 效果类:
现在是编辑(为长样本道歉,但我现在不知道错误在哪里,但我已经减少了主要课程):
这是教程中的基本编辑器,我的错误来自:
}
ubuntu - 从 Ubuntu 构建 Unity3D
我一直在尝试使用 Gitlab CI 容器从 Ubuntu 映像构建 Unity3D 的几种方法,但似乎总是失败(Ubuntu 16.04.3 LTS)。
我收到以下错误,但我没有在那里找到有用的信息:
该沙盒开发被标记为已弃用,我在这里缺少什么?
除此之外,当我尝试获得 chrome-sandbox 的帮助时,我得到以下信息:
正如我在 Unity Cloud Build 平台中看到的,他们使用 MacOS 系统进行构建,我们在 GitLab CI(云服务)中有这个替代方案吗?Unity Cloud Build 的日志行:
更新:
我添加了我的 gitlab-ci.yml: