标签: unity3d-editor

如何制作bezier连续或不连续的单个锚点

我正在使用以下代码创建贝塞尔曲线.通过在场景视图中移动单击,可以扩展曲线以连接多个贝塞尔曲线.我的代码具有使整个曲线连续或不连续的功能.我意识到我需要使个别点(特别是锚点)具有此功能.

我认为最理想的方法是为具有此功能的点创建一个新类(使点连续或不连续),因为这可以用于添加可能特定于点的其他属性.怎么办呢?

路径

[System.Serializable]
public class Path {

[SerializeField, HideInInspector]
List<Vector2> points;

[SerializeField, HideInInspector]
public bool isContinuous;

public Path(Vector2 centre)
{
    points = new List<Vector2>
    {
        centre+Vector2.left,
        centre+(Vector2.left+Vector2.up)*.5f,
        centre + (Vector2.right+Vector2.down)*.5f,
        centre + Vector2.right
    };
}

public Vector2 this[int i]
{
    get
    {
        return points[i];
    }
}

public int NumPoints
{
    get
    {
        return points.Count;
    }
}

public int NumSegments
{
    get
    {
        return (points.Count - 4) / 3 + 1;
    }
}

public void AddSegment(Vector2 anchorPos)
{
    points.Add(points[points.Count - …
Run Code Online (Sandbox Code Playgroud)

c# unity-game-engine unity3d-editor

18
推荐指数
1
解决办法
938
查看次数

Unity3D Slider onValueChanged仅发送0(或其他定义的值)

我正在尝试将onValueChanged事件附加到我的GUI Slider,但由于某种原因,它给了我一个强制选项来放入一个值(它是"On Value Change(Single)"部分中的第四个框).然后它只发送前面提到的值,而不是滑块的实际值.

在此输入图像描述

该活动的代码如下:

public void ChangeWindDirection(float value)
{
    Debug.Log("New wind direction: " + value);
}
Run Code Online (Sandbox Code Playgroud)

我尝试重启Unity和Visual Studio 2013无济于事.现在,它甚至会为我尝试创建的每个新事件添加一个值.

unity-game-engine unity3d-editor unity3d-gui

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

在选择时突出显示时,如何在场景中始终显示句柄?

我想让编辑器中的所有句柄显示,即使未选择给定的游戏对象,这样当鼠标点悬停在给定的句柄上时,它变得可选.我怎样才能做到这一点?

unity-game-engine unity3d-editor

13
推荐指数
1
解决办法
371
查看次数

Unity Editor - DrawDefaultInspector不起作用

我正在尝试编写一个简单的编辑器扩展,仅用于学习目的.此扩展只会检查目标是否为JSON文件,然后计算其键或执行其他任意任务.

这是默认情况下检查器的外观. 这是默认情况下检查器的外观

然后我开始编写自定义检查器,就​​像这样.

[CustomEditor(typeof(TextAsset))]
public class TestInspector : Editor
{
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意对DrawDefaultInspector()的调用.

现在检查员看起来像这样.

现在检查员看起来像这样.

为什么不绘制默认检查器?我能理解我的扩展基本上什么都不做,对吧?

c# unity-game-engine unity3d-editor

9
推荐指数
1
解决办法
1318
查看次数

除了在Unity3D中使用“资产/ Gizmos”以外,如何具有自定义脚本图标

我知道这个问题可能被问了很多次,但是通常回答是错误的。

我想要的是:

对检查器(例如,图2和图3)和ProjectView(例如,图1)中的特定组件/脚本使用自定义图标 替代文字

到目前为止,我所做的是:

对于每个应该带有图标的组件/类,我在文件夹中都有一个accroding Icon文件

Assets/Gizmos/<Path>/<To>/<Namespace>/<ClassName> icon
Run Code Online (Sandbox Code Playgroud)

Import Settigns设置TextureTypeEditor GUI and Legacy GUI

这工作正常..直到现在,我是实现该目标的唯一方法(请记住以下部分,我绝对不想要)。


但是,我想知道是否真的没有更好的方法来让每个脚本具有唯一的Icon文件。这使得项目/ UnityPackage不必要地庞大。同样,如果我重命名一个类,我也总是必须重命名相应的图标文件...这意味着感觉不对!

大多数Unity内置行为和组件都有一个唯一的图标。但是来自新PackageManager的外部Packages也具有内置图标,有时还会Gizmos文件夹,但是它没有遵循上述命名规则...因此,显然,为它们配置了图标。

因此,我的问题
有没有更好的方法来为脚本/组件提供这些图标?

最好编写脚本并重用一个单一的图标文件,而不是在多个不同名称的文件中具有相同的图标。

和/或还有/在哪里/如何为这些图标定义来自PackageManager的脚本?


!注意!我绝对不想要的是:

对于所有GameObjects附加了这些组件的对象,也要在SceneView中显示图标(例如,图4)。这是由于通过图5中的检查器选择了该脚本的图标(如本文中此处建议的所有建议,甚至Unity都建议使用Unity-Assign Icons)或使用OnDrawGizmosDrawGizmo

替代文字

更新资料

因为这个答案是建议的:我也知道我可以做到这一点,并通过GizmosSceneView 的设置将其关闭。但是想象一下,我喜欢25个不同的模块,每个模块都有不同的图标。我不想在每个项目的基础上逐一禁用SceneView设置中的Gizmos!甚至提供的脚本似乎也很庞大。反思将是我永远不会采取的最后手段。另外,我宁愿根本不让那些图标尽可能地显示为Gizmos,而不是全部禁用它们。

customization unity-game-engine unity3d-editor unity-editor

8
推荐指数
1
解决办法
847
查看次数

如何在CustomEditor中的嵌套ReorderableList中选择元素?

ReorderableList我的CustomEditor脚本中有一个.在drawElementCallback我添加了第二个嵌套ReorderableList.一切正常,我可以像这里一样在两个列表中添加元素

在此输入图像描述

但是你可以看到由于某种原因我不能选择内部元素,ReorderableList所以我也无法删除项目.

如何选择内部列表中的项目?


这里的类分解为基本示例

using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

[Serializable]
public class SomeClass
{
    public string Name;
    public List<SomeClass> InnerList;
}

[CreateAssetMenu(menuName = "Example", fileName = "new Example Asset")]
public class Example : ScriptableObject
{
    public List<SomeClass> SomeClasses;

    [CustomEditor(typeof(Example))]
    private class ModuleDrawer : Editor
    {
        private SerializedProperty SomeClasses;
        private ReorderableList list;

        private void OnEnable()
        {
            SomeClasses = serializedObject.FindProperty("SomeClasses");

            // setupt the outer list
            list = …
Run Code Online (Sandbox Code Playgroud)

c# unity-game-engine unity3d-editor unity-editor

8
推荐指数
1
解决办法
766
查看次数

为嵌套的 ScriptableObjects 构建编辑器以在纸牌游戏中组合能力

我正在构建一款纸牌游戏,我希望有一个干净的纸牌能力架构。我有一个带有卡片属性的 CardData ScriptableObject。我希望将卡牌的能力组合在一起来描述卡牌的作用,例如一张名为DrawAndHealCard的卡牌,它可以抽 2 张卡牌并在使用时恢复 5 点生命值。

我立即意识到这意味着我需要为 CardAbility 的每个变体提供具体资产。因此 DrawAndHealCard 引用了两个资源:DrawCards2HealPlayer5。这太荒谬了,我希望所有数据都感觉像是在一个 DrawAndHealCard 上。

所以我了解到AssetDatabase.AddObjectToAsset(),这似乎是正确的想法,我可以拥有作为 CardData 资产的子资产的能力,而不必处理所有这些单独资产的组织。所以现在我正在尝试建立一个Editor来管理这个问题,这很痛苦。

我读过很多关于 Unity 序列化、SO、编辑器脚本等的内容……在这方面严重碰壁,即将降级到架构上感觉不那么优雅的东西。如果有更好的方法来做到这一点,我也愿意接受有关完全不同路线的建议。

下面的代码被精简了,但这是我想要弄清楚的要点。我现在所处的位置似乎onAddCallback正确添加了子资产,但onRemoveCallback没有删除它。不过,我的“清除所有能力”按钮确实有效。我找不到关于这些东西的任何好的文档或指南,所以我目前很迷失。

// CardData.cs
[CreateAssetMenu(fileName = "CardData", menuName = "Card Game/CardData", order = 1)]
public class CardData : ScriptableObject
{
    public Sprite image;
    public string description;

    public CardAbility[] onPlayed;
}

// CardAbility.cs
public class CardAbility : ScriptableObject
{
    public abstract void Resolve();
}

// DrawCards.cs …
Run Code Online (Sandbox Code Playgroud)

c# unity-game-engine unity3d-editor

8
推荐指数
1
解决办法
4733
查看次数

Unity UI - 在光标锁定时与worldspace UI交互

当设置为时,我正在尝试使用第一人称控制器世界空间UI进行交互.Cursor.lockStateCursorLockMode.Locked

世界空间用户界面和一个角色 世界空间用户界面和一个角色

但是当光标被锁定时,光标位置设置为(-1,-1),这是从Inspector告知的.

光标位置(-1,-1) 光标位置(-1,-1)

我进行了图形光线投射EventSystem.RaycastAll,Sreen.width/2PointerEventData.EventSystem.current.RaycastAll收集屏幕中间的所有UI对象,但不会向它们发送任何事件.

我还试图ExecuteEvents.Execute<IEventSystemHandler>将事件发送到UI目标.当我向其发送'submit'事件时,这适用于按钮.显然这不是一个优雅的解决方案.我也不知道如何向滑块发送消息.

// manully send a 'submit' event to UI elements
List<RaycastResult> results = new List<RaycastResult>();
void Update() {
    if (Input.GetButtonUp("Fire1")) {
        PointerEventData data = new PointerEventData(EventSystem.current);
        data.position = new Vector2(Screen.width / 2, Screen.height / 2);
        EventSystem.current.RaycastAll(data, results);
        foreach (var result in results) {
            ExecuteEvents.ExecuteHierarchy<ISubmitHandler>(
                result.gameObject, data,
                ExecuteEvents.submitHandler
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Windows上全屏播放时,这种疯狂的尝试都有效.2333

[System.Runtime.InteropServices.DllImport("user32.dll")] …
Run Code Online (Sandbox Code Playgroud)

c# unity-game-engine unity3d-editor unity3d-gui unity5

7
推荐指数
1
解决办法
1091
查看次数

无法在检查器中分配 ScriptableObject

我在检查器中分配 ScriptableObjects 时遇到问题。

例如,我有这个类:

using UnityEngine;

public class Buff : ScriptableObject {
    public string buffName;
}
Run Code Online (Sandbox Code Playgroud)

在一个单一行为派生类中,我有一个这样的成员:

public Buff testBuff;
Run Code Online (Sandbox Code Playgroud)

在检查器中,我看到以下内容,但我无法将脚本“Buff”拖放到该成员 在此处输入图片说明
它可以将 Buff 作为新脚本拖放,但我无法将其添加到“测试 Buff”。

我尝试的不是拖放而是简单地创建一个 Buff 实例,如下所示:

public Buff testBuff = new Buff();
Run Code Online (Sandbox Code Playgroud)

这有效: 在此处输入图片说明 但是我相信拖放也应该有效,而且上面给出了警告:

Buff must be instantiated using the ScriptableObject.CreateInstance method instead of new Buff.
UnityEngine.ScriptableObject:.ctor()
Buff:.ctor()
...
Run Code Online (Sandbox Code Playgroud)

我使用的是最新版本的 Unity“5.0.2f1 Personal”。

unity-game-engine unity3d-editor

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

摆脱“后处理包预计用于全屏”警告(Mac,内置管道)

我已经在场景中添加了后处理,一切正常。我使用的是单相机。每当我单击场景视图中的任意位置时,我都会在控制台中收到以下警告:

当与内置渲染管道一起使用时,后处理包预计在全屏相机上使用。请注意,使用相机视口可能会导致视觉伪影或某些功能无法正常工作。UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) (位于 /Users/builduser/buildslave/unity/build/Modules/IMGUI/GUIUtility.cs:187)

当我进入播放模式时,警告不会显示。仅在场景编辑器中。

我在 Mac 上使用 Unity 2019.4.0f1 的内置渲染管道。我已经进入了生成警告的 Unity 后处理代码(他们的代码,不是我的)。我可以看到相机矩形已被检索,并且由于 X 和 Y 值大于零,因此记录了警告。有问题的 Unity 代码如下所示:

{
  Rect r = m_Camera.rect;
  if(Mathf.Abs(r.x) > 1e-6f || Mathf.Abs(r.y) > 1e-6f || Mathf.Abs(1.0f - r.width) > 1e-6f || Mathf.Abs(1.0f - r.height) > 1e-6f)
  {
    Debug.LogWarning("When used with builtin render pipeline, Postprocessing package expects to be used on a fullscreen Camera.\nPlease note that using Camera viewport may result in visual artefacts or some things not working.", m_Camera);
  }
}
Run Code Online (Sandbox Code Playgroud)

再说一次,上面的代码是Unity代码,我不想改变它。上面的和值有时大于 …

unity-game-engine unity3d-editor

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