标签: unity3d-editor

Unity 5:管理动态创建的GameObjects的简洁方法

在Unity 5中,管理动态创建的游戏对象的"干净"方式是什么?

我写了一个MonoBehavior创建/销毁几个的组件()GameObjects.对象作为自定义自定义系统的一部分加载,选择部分字符 - 头发/衣服等.这意味着它们对于播放器是可见的,在编辑器中可见,但不应该在编辑器中可编辑.正在加载的对象是带有骨架的网格.

脚本以这种方式运行:

  1. 从Resources中加载GameObjects(确切的对象在脚本中确定,它们不是预制件)
  2. 将它们附加到场景的某些部分(不一定是它自己的节点)
  3. 销毁时删除.

删除:

protected void unloadLastResource(){
    if (lastResourceInstance){
        if (Application.isEditor){
            GameObject.DestroyImmediate(lastResourceInstance);
        }
        else
            GameObject.Destroy(lastResourceInstance);
        Resources.UnloadUnusedAssets();
        lastResourceInstance = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

创建:

    GameObject target = getEffectiveTargetNode();
    Object resource = Resources.Load(newResourceName);
    instance = Instantiate(resource) as GameObject;

    instance.hideFlags = HideFlags.HideAndDontSave;
    instance.transform.parent = target.transform;
    instance.transform.localPosition = Vector3.zero;
    instance.transform.localRotation = Quaternion.identity;
    instance.transform.localScale = Vector3.one;
Run Code Online (Sandbox Code Playgroud)

销毁处理程序:

void OnDestroy(){
    unloadLastResource();
}
Run Code Online (Sandbox Code Playgroud)

这似乎在编辑器中工作正常,但是当我从游戏模式切换回edito模式时,我收到很多警告:

Destroying object multiple times. Don't use DestroyImmediate on the same object in OnDisable or …
Run Code Online (Sandbox Code Playgroud)

c# unity-game-engine unity3d-editor

5
推荐指数
1
解决办法
6242
查看次数

Unity WebGL的EditorUtility.OpenFilePanel(运行时)

我希望用户在Unity WebGL游戏中从计算机中选择一个图像,但我无法获得任何库或代码.我想要UnityWebGL(Runtime)的EditorUtility.OpenFilePanel的确切功能.

string path = EditorUtility.OpenFilePanel("用png覆盖","","png");

有没有办法在Unity WebGL构建中获得这个打开的对话框?或者我有什么方法可以在java脚本中做到这一点?就像我从用户的java脚本中获取图像并将其传递给我的C#代码.

unity-game-engine unity3d-editor unity5 unity-webgl

5
推荐指数
2
解决办法
4444
查看次数

如何使编辑器句柄可选以显示属性检查器窗口

这是如何使贝塞尔曲线的单个锚点连续或不连续的后续问题。请参考已接受答案中的相关代码(请注意,因为相关代码很长,我这样做是为了使这个问题保持清晰)。

我正在努力实现以下目标:

  1. 使bezier曲线手柄/控制点以如下方式可选:选中后,在检查器窗口中显示单个手柄的属性(例如,连续性)。请注意,我希望在不为手柄/控制点创建游戏对象的情况下完成此操作

  2. 保留用于处理每个点的移动的单个方法,而不要为每个点的移动使用单独的方法。

unity-game-engine unity3d-editor

5
推荐指数
1
解决办法
793
查看次数

如何平稳地旋转相机?

我正在与C#进行二维统一游戏.现在,我正在尝试使相机旋转,我正在使用此代码:

rotateX = Random.Range (0, 50);
Camera.main.transform.eulerAngles = Vector3(0,0,rotateX);
Run Code Online (Sandbox Code Playgroud)

但每次我尝试运行游戏时,它都会给我一个错误.任何人都有关于如何(平滑地)从一侧到另一侧旋转相机的提示?

c# unity-game-engine unity3d-editor

4
推荐指数
1
解决办法
2万
查看次数

在 Unity3d 中,如何将浮动窗口(例如光照贴图)添加到现有的一组选项卡(例如:Inspector)?

在 Unity3d 中,在 Mac 上,如何将生成的浮动窗口(例如光照贴图)添加到现有选项卡集(例如:Inspector)?

我还没有找到一种方法来做到这一点...当我单击检查器右上角的添加选项卡控件时,没有用于光照贴图的选项。一定有一个命令,我试过使用 alt、cmd、ctrl 等,但无济于事..

谢谢 !

configuration user-interface unity-game-engine unity3d-editor

4
推荐指数
1
解决办法
982
查看次数

Unity 4.6 编辑器,使用预定义数据创建脚本

我正在尝试在 Unity 编辑器中创建一个易于使用的按钮,用于创建角色和物品。

我将在这里提供一些额外的信息来帮助解释我的问题。我的游戏结构是这样的;游戏控制器 >> 角色脚本 >> (玩家名称)脚本 角色对象上既有角色脚本,也有以其名称命名的脚本。

我希望能够在 Unity 编辑器中单击“创建新角色”,它会执行以下操作;1) 提示输入要使用的名称。2) 根据用户输入的内容创建名为 Name 的空游戏对象。 3) 创建一个同名的新 C# 脚本,并将其添加到该对象中。-我希望生成的脚本中有一些预先确定的“字符模板”代码。4) 将新脚本附加到新的空游戏对象,并附加一个“角色脚本”。

提前致谢。

最后一个子问题。通过角色脚本上的公共单一行为从游戏控制器访问 PlayerNamedScript 会更好吗?

或者,CharacterScript 可以动态扩展同级的 PlayerNamedScript。

我希望这是清楚的。再次感谢。

c# unity-game-engine unity3d-editor

4
推荐指数
1
解决办法
3921
查看次数

如何使自定义检查器在Unity中添加对象引用

我无法弄清楚如何在我的自定义检查器中显示纹理字段,文档解释了如何做到这一点.

我有一个脚本,在我的主脚本中有一个带有纹理类型的Icon字段,但需要将其写入自定义检查器.请解释我如何做到这一点.我的主脚本存储为ItemReference,以便我可以访问它的变量.

我已经离开了下面的内容,所以你可以看到我在重写检查员的位置.

using UnityEngine;
using System.Collections;
using UnityEditor;
[CustomEditor(typeof(Item))]
public class ItemCustomEditor : Editor {

    //IMPORTANT!! TWEAKING THIS SCRIPT WITHOUT KNOWLEDGE OF THE UNITY EDITOR API MAY BREAK FUNCTIONS OF OTHER SCRIPTS IN GAME SUCH AS MAKING ALL VARIABLES INVISIBLE.
    public override void OnInspectorGUI(){
        base.OnInspectorGUI();
        Item ItemReference = (Item)target;
        EditorGUILayout.Separator();
        EditorGUILayout.Separator();
        ItemReference.ID = EditorGUILayout.IntField("Item ID", ItemReference.ID);

    }
}
Run Code Online (Sandbox Code Playgroud)

这是编辑器脚本,这是编辑器脚本引用的普通脚本.

    using UnityEngine;
using System.Collections;

public class Item : MonoBehaviour {
    //First we declare variables that the database will use
    public …
Run Code Online (Sandbox Code Playgroud)

c# unity-game-engine unity3d-editor

4
推荐指数
1
解决办法
1万
查看次数

Unity 自定义检查器和子检查器

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

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

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

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

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

因此,我想我会使用一个自定义检查器,有点像Unity 的冒险教程中的检查器。

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

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

在此输入图像描述

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

NullReferenceException: Object reference not set to an instance of an object
AbilityBluePrintEditor.SubEditorSetup (.EffectEditor editor) (at Assets/Scripts/Editor/AbilityBluePrintEditor.cs:90)
EditorWithSubEditors`2[TEditor,TTarget].CheckAndCreateSubEditors (.TTarget[] subEditorTargets) (at Assets/Scripts/Editor/EditorWithSubEditors.cs:33)
Run Code Online (Sandbox Code Playgroud)

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

我的代码如下:

我的 BluePrintAbility 课程:

[CreateAssetMenu(fileName = "New Ability BluePrint", menuName = "Ability BluePrint")]
public class AbilityBluePrint : ScriptableObject {
    public Effect[] effects = new Effect[0];
    public string description;
} …
Run Code Online (Sandbox Code Playgroud)

c# unity-game-engine unity3d-editor

3
推荐指数
1
解决办法
6156
查看次数

编辑器窗口截图

我想从自定义编辑器窗口捕获屏幕截图,我将其用作我正在开发的游戏的关卡编辑器,但我不确定如何执行此操作。

我想要的是捕获 EditorWindow,而不是游戏视图或场景视图。

你能帮助我吗?谢谢!

编辑:我想在按下 GUILayout.Button 时通过代码截取屏幕截图:)

unity-game-engine unity3d-editor unity-editor

3
推荐指数
1
解决办法
7445
查看次数

Unity,编辑器时脚本,在游戏对象上添加到场景事件

假设您有一个简单的预制件“盒子”,我们会说它只不过是一个标准的米立方体。

  • 1 - 预制框在您的项目面板中

  • 2 - 将其拖到场景中

  • 3 - 显然它现在也出现在 Hierarchy 面板中,并且可能被选中并显示在 Inspector 中

需要明确的是,当您执行此操作时,游戏不是 Play,您只是处于普通编辑器模式。

是否可以制作脚本(“编辑器脚本”?),以便,

  • 当你做上面的“1”和“2”时,(再次这是在编辑器模式下,而不是在游戏中)

  • 当 3 发生时,我们可以影响场景中的新 Box 项目

  • 所以,简单的例子:我们将始终将 Z 位置设置为“2”,无论您将它放在哪里。

简而言之:编辑器代码,以便每次将预制件 P 拖到场景中时,它将位置 z 设置为 2.0。

这在 Unity 中可能吗?我对“编辑器脚本”一无所知。

很明显,这应该是可能的。

c# unity-game-engine unity3d-editor

3
推荐指数
1
解决办法
3060
查看次数