问题标签 [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.

0 投票
1 回答
1039 浏览

c# - 非实例化加载的预制件与实例化的预制件相比如何?

例子

在 Unity5 中,假设一个名为“SomeObject”的游戏对象被存储为一个预制件Assets/Resources/SomeObject.prefab,我知道我可以创建一个预制件的实例,如下所示:

一旦执行,instanceGameObject 将是原始“SomeObject”预制件的副本,并将被放置在名为“SomeObject(Clone)”的当前活动场景中。


据我了解,GameObject prefab代表实际的预制资产,对其所做的任何更改(设置名称、添加组件等)都会写入原始预制资产,即使在退出编辑器播放模式后这些更改仍然存在。

问题

  1. 由于所有游戏对象通常都存储在一个场景中,并且上面示例中的scene属性GameObject prefab似乎是 Unloaded/Invalid/Unnamed,我究竟应该将这个特殊的 GameObject 放在哪里?我似乎可以用它做所有我可以用普通游戏对象做的事情,除了在层次/场景视图中可见。

    它是有效地处于某种不确定状态,还是特殊的 PseudoScene?它似乎通过LoadSceneMode.Single场景变化持续存在,但不像DontDestroyOnLoadObjects 在传递到时移动到的特殊场景GameObject.DontDestroyOnLoad(...)

  2. 除了生命周期变化、无效场景和彼此不同的对象(具有不同的对象等)之外,上述示例prefab之间是否还有其他值得注意的差异?instanceGetInstanceID()

  3. 由于调用GameObject.Instantiate(...)prefab产生一个处于有效场景的游戏对象,有没有办法手动创建处于类似“无场景”状态的游戏对象?我知道 Unity 打算让所有游戏对象都出现在场景中,所以这纯粹是一个学术问题。

我曾尝试查看所涉及函数的文档没有人深入了解调用预制资源时具体发生的情况的技术细节。 Resources.Load

0 投票
1 回答
2460 浏览

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”游戏对象,然后将其保存为 PrefabAssets/Resources/ExampleObject.prefab

  • 创建 ExampleWrapper 的资产实例并在Assets/Resources/Wrapper.asset

    • 由于 Unity 5 不提供用于生成 ScriptableObjects 的 UI,因此要么创建您自己的菜单项,要么使用自动化解决方案。这个问题假设您对 ScriptableObjects 足够熟悉,可以拥有自己的首选方法。
  • 将 Wrapper 资产的Value字段设置为 ExampleObject 预制件 在此处输入图像描述

  • 请注意,因为有时 unity 确实会正确缓存资产,


基本原理

这里的示例是故意简化的,但它基于ScriptableObjects用于存储/共享自定义系统配置数据的真实项目。

不要回复以下内容:

  • “Just Use Object.Instantiate - 不改变结果,Resources.Load在某些情况下修改返回的原始对象是可取的。
  • “跳过包装器并直接引用预制件/手动加载它” - 虽然这绕过了加载问题,但它也错过了问题的重点。添加抽象级别可以使系统之间的资源共享更易于维护。此外,此问题不仅限于预制件(此处仅用于简单示例)。更现实的示例将包含多个嵌套对象,例如 Sprites、Materials、其他 ScriptableObjects 等。
  • “在静态构建期间不要加载” - Unity 支持静态系统(为什么还要提供[InitializeOnLoad]?),并且使用基于 ScriptableObjects 的资产来存储此类系统的配置信息是一个非常真实的用例。在完全重新构建系统之前,我想看看其他潜在的替代方案。

找什么:

  • 当我在诸如此类的静态上下文中加载它时,我是否可以强制 Unity 预加载在包装器中序列化的资产,而不必通过其路径手动加载其内容?
  • 换句话说,我不想只是 run Resources.Load<GameObject>("ExampleObject"),因为这首先会否定封装它的全部意义。我可以修改ExampleWrapper类,但是任何潜在的解决方案都需要足够自动化,以便将预制件添加到检查器中的字段的工作流程将是所有需要的。

编辑:还应该注意的是,奇怪的是,当我关闭项目并再次打开它时,我看到以下内容:

在此处输入图像描述

  • 在启动过程中,静态构造函数被调用一次,包装器被加载,嵌套的预制件实际上被正确加载。
  • 然后(仍然在初始启动中,因为它发生在我可以输入任何动作之前)它再次静态构造,这次加载 Wrapper 时,没有加载嵌套的预制件。

这个,我真的不明白。

0 投票
1 回答
3052 浏览

c# - Unity 自定义检查器列表更改场景(或关闭统一)时不保存值

我正在尝试为我在 Unity 中的一个类创建一个自定义检查器:

我的主要课程如下所示:

我的 Tile 类如下所示:

这是我的编辑器类:

在我的编辑器中看起来像这样: 在此处输入图像描述

我的问题是,如果我更改 Tiles List 的任何属性,这意味着如果我修改枚举或将纹理添加到变量之一,一旦我更改场景或 Unity 关闭,分配的值或纹理将被删除。

这是我第一次在编辑器中尝试这样的事情。任何帮助表示赞赏。

0 投票
2 回答
473 浏览

c# - (Unity3D) 如何在脚本上添加注释或文档

:) 有没有办法让我们在我们制作的自定义脚本下设置可以显示在Inspector视图上的注释文档?

请查看图片以获取示例。

0 投票
1 回答
39 浏览

unity3d - 对象移动以及在 UNity3d 编辑器中

也许你有一个移动对象的脚本,就像在编辑器 UNity3d 中或在商店中一样,其他人可以看到吗?付费或免费。例如,我点击了一个对象/选择了一个立方体,然后出现了箭头,对于这些箭头我拉,或者类似的东西?谢谢 !

0 投票
2 回答
818 浏览

unity3d - Unity - 有孩子的父母分崩离析

我有一个玩家角色,由一些立方体、球体和一个胶囊组成。我创建了空对象Player,玩家的所有身体部位都是Player. 我有两架飞机,中间有一个移动平台。我可以在普通平面和墙壁上行走和跳跃,但是当玩家在移动平台上时,玩家的身体部位会分崩离析。也许这真的很愚蠢,但我刚开始使用 Unity。

这就是问题所在,玩家在移动平台上崩溃了:http: //nl.tinypic.com/r/207s3sz/9

下面是关于概述、玩家、身体部位和带有相应角色持有人的移动平台的信息。body所有身体部位都具有与屏幕截图中的部位相同的属性。谁能帮我解决这里出了什么问题?如何通过移动平台运输整个播放器?

在此处输入图像描述

在此处输入图像描述

HoldCharacter 脚本:

0 投票
1 回答
2292 浏览

c# - 如何将新游戏对象设置为组件游戏对象的子对象?

我想创建一个空的GameObject,它是 Components 的子级GameObject

示例:我有一个简单的样条曲线,我使用子对象作为控制点。我有一个添加新控制点的按钮,它使用以下代码创建一个新对象,并且还应该将新的控制点设置GameObject为脚本对象的子对象。

这个实现不起作用并且没有在检查器中显示对象,我认为这意味着出现问题并且对象被破坏。

编辑:

为了测试设置父级是否正常工作,我打印了g父级转换的名称。它打印了正确的名称,所以我认为问题在于设置父级没有反映在编辑器中。注意:如果这会影响统一性,我会在[CustomEditor()]脚本之外使用脚本。MonoBehaviour

编辑 2 - 最小完整代码:

0 投票
0 回答
934 浏览

unity3d - 以编程方式将 FBX 导入资产文件(自定义编辑器)

我目前正在使用 Unity3D 中的自定义编辑器,我想在资产的导入过程中添加一些自定义属性(和组件)。

这个想法是为 3D 设计人员提供一个 GUI,他们可以在其中选择一个 FBX 文件,填写一些附加属性,单击“导入”,然后将在 Unity 项目中创建一个新资产,其中已经附加并设置了适当的脚本。

我已经看到了AssetPostprocessor可以让我们在导入期间进行一些后处理的类,但似乎没有一种方法可以从中显示 GUI。

我也看过这个AssetDatabase.LoadAssetAtPath方法,但它只加载已经导入的资产。

所以我的问题是,有没有办法在 FBX 文件在 Unity 中导入(处理)之前显示 GUI,然后.asset通过组合 FBX 文件中的数据和附加组件(统一单行为)来创建统一资产(文件)脚本)我需要添加吗?

这可能不是要走的路,我需要使用预制件来实现这一点吗?(我宁愿不这样做,因为预制件似乎可以用作资产的聚合)

编辑

主要目标是让unity充当关卡设计师的关卡编辑器,因此编辑器中只有一半的参数化资产需要处理。这也意味着项目中已经有很多自定义编辑器。

0 投票
1 回答
4931 浏览

c# - Unity 自定义检查器和子检查器

我正在 Unity 2017.2 中开发一个小型 ARPG。

我尝试为我的游戏的 AbilityBluePrint 类实现自定义编辑器。

基本上,AbilityBluePrints 包含在运行时生成能力所需的所有信息。包括一个 Effect[] ScritpableObjects 数组,在使用该能力时触发。

我目前拥有我需要实施和工作的一切,但我认为创建能力非常乏味,原因如下。

假设我有一个效果类 DamagePlusX :作为伤害修正值的效果。如果我想让这个效果对两个不同的能力有不同的修饰符值,那么我必须在我的资产目录中创建它的两个实例,并手动将每个实例分配给相应能力的 Effect[] 数组。我担心我最终会得到很多效果实例,每个效果实例基本上都有几个不同的整数和浮点数。

因此,我想我会使用一个有点像Unity Adventure Tutorial中的自定义检查器。

这个想法基本上是创建 AbilityBluePrint 的实例,然后使用自定义检查器能够动态实例化 Effects[] 数组中的效果,并能够直接在 AbilityBluePrint 检查器中编辑每个效果的属性。

基本上我想得到一些类似的东西(为可怜的photoshop道歉):

在此处输入图像描述

我试图转换教程中的脚本以满足我的需要,但从昨天开始我一直遇到同样的错误:

我已经尝试了很多事情,我想知道我正在尝试做的事情是否可以使用可编写脚本的对象。在原始教程中,相当于我的 BluePrintAbility 是 Monobehaviour。

我的代码如下:

我的 BluePrintAbility 类:

我的效果类:

我的 DamagePlusX 效果类:

现在是编辑(为长样本道歉,但我现在不知道错误在哪里,但我已经减少了主要课程):

这是教程中的基本编辑器,我的错误来自:

}

0 投票
1 回答
1745 浏览

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: