我正在使用以下代码创建贝塞尔曲线.通过在场景视图中移动单击,可以扩展曲线以连接多个贝塞尔曲线.我的代码具有使整个曲线连续或不连续的功能.我意识到我需要使个别点(特别是锚点)具有此功能.
我认为最理想的方法是为具有此功能的点创建一个新类(使点连续或不连续),因为这可以用于添加可能特定于点的其他属性.怎么办呢?
路径
[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) 我正在尝试将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无济于事.现在,它甚至会为我尝试创建的每个新事件添加一个值.
我想让编辑器中的所有句柄显示,即使未选择给定的游戏对象,这样当鼠标点悬停在给定的句柄上时,它变得可选.我怎样才能做到这一点?
我正在尝试编写一个简单的编辑器扩展,仅用于学习目的.此扩展只会检查目标是否为JSON文件,然后计算其键或执行其他任意任务.
这是默认情况下检查器的外观.
然后我开始编写自定义检查器,就像这样.
[CustomEditor(typeof(TextAsset))]
public class TestInspector : Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意对DrawDefaultInspector()的调用.
现在检查员看起来像这样.
为什么不绘制默认检查器?我能理解我的扩展基本上什么都不做,对吧?
我知道这个问题可能被问了很多次,但是通常回答是错误的。
对检查器(例如,图2和图3)和ProjectView(例如,图1)中的特定组件/脚本使用自定义图标
对于每个应该带有图标的组件/类,我在文件夹中都有一个accroding Icon文件
Assets/Gizmos/<Path>/<To>/<Namespace>/<ClassName> icon
Run Code Online (Sandbox Code Playgroud)
并Import Settigns
设置TextureType
为Editor GUI and Legacy GUI
这工作正常..直到现在,我是实现该目标的唯一方法(请记住以下部分,我绝对不想要)。
但是,我想知道是否真的没有更好的方法来让每个脚本具有唯一的Icon文件。这使得项目/ UnityPackage不必要地庞大。同样,如果我重命名一个类,我也总是必须重命名相应的图标文件...这意味着感觉不对!
大多数Unity内置行为和组件都有一个唯一的图标。但是来自新PackageManager的外部Packages也具有内置图标,有时还会Gizmos
文件夹,但是它没有遵循上述命名规则...因此,显然,为它们配置了图标。
因此,我的问题是:
有没有更好的方法来为脚本/组件提供这些图标?
最好编写脚本并重用一个单一的图标文件,而不是在多个不同名称的文件中具有相同的图标。
和/或还有/在哪里/如何为这些图标定义来自PackageManager的脚本?
对于所有GameObjects
附加了这些组件的对象,也要在SceneView中显示图标(例如,图4)。这是由于通过图5中的检查器选择了该脚本的图标(如本文中或此处建议的所有建议,甚至Unity都建议使用Unity-Assign Icons)或使用OnDrawGizmos或DrawGizmo
更新资料
因为这个答案是建议的:我也知道我可以做到这一点,并通过Gizmos
SceneView 的设置将其关闭。但是想象一下,我喜欢25个不同的模块,每个模块都有不同的图标。我不想在每个项目的基础上逐一禁用SceneView设置中的Gizmos!甚至提供的脚本似乎也很庞大。反思将是我永远不会采取的最后手段。另外,我宁愿根本不让那些图标尽可能地显示为Gizmos,而不是全部禁用它们。
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) 我正在构建一款纸牌游戏,我希望有一个干净的纸牌能力架构。我有一个带有卡片属性的 CardData ScriptableObject。我希望将卡牌的能力组合在一起来描述卡牌的作用,例如一张名为DrawAndHealCard的卡牌,它可以抽 2 张卡牌并在使用时恢复 5 点生命值。
我立即意识到这意味着我需要为 CardAbility 的每个变体提供具体资产。因此 DrawAndHealCard 引用了两个资源:DrawCards2和HealPlayer5。这太荒谬了,我希望所有数据都感觉像是在一个 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) 当设置为时,我正在尝试使用第一人称控制器与世界空间UI进行交互.Cursor.lockState
CursorLockMode.Locked
但是当光标被锁定时,光标位置设置为(-1,-1),这是从Inspector告知的.
我进行了图形光线投射EventSystem.RaycastAll
,Sreen.width/2
和PointerEventData
.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) 我在检查器中分配 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”。
我已经在场景中添加了后处理,一切正常。我使用的是单相机。每当我单击场景视图中的任意位置时,我都会在控制台中收到以下警告:
当与内置渲染管道一起使用时,后处理包预计在全屏相机上使用。请注意,使用相机视口可能会导致视觉伪影或某些功能无法正常工作。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代码,我不想改变它。上面的和值有时大于 …