Unity在Scene下不能点击到UI

F:Unity再Scene下无法点击到UI?

Q:

图片.png 点击打开Gizmos就可以点击到UI了。

### 创建自定义UI用于Unity Scene场景 #### 使用 `VisualElement` 和 `Overlay` 为了在 Unity 场景视图中创建自定义 UI,可以通过继承 `Overlay` 类并重写 `CreatePanelContent()` 方法来实现。此方法返回一个 `VisualElement` 对象作为面板的内容。 ```csharp using UnityEditor; using UnityEditor.Overlays; using UnityEngine.UIElements; [Overlay(typeof(SceneView), "面板自绘例子", true)] public class MyToolButtonOverlay : Overlay { public override VisualElement CreatePanelContent() { var root = new VisualElement() { name = "UI工具面板" }; root.Add(new Label() { text = "这是个自定义面板" }); return root; } } ``` 这段代码展示了如何通过 `VisualElement` 构建简单的用户界面组件,并将其添加到场景视图中[^1]。 #### 利用 `Handles` 和 `GUILayout` 绘制即时GUI 另一种方式是在每次绘制场景时动态生成 GUI 控件。这通常涉及到订阅 `SceneView.duringSceneGui` 事件,在回调函数内部调用 `Handles.BeginGUI()/EndGUI()` 来包裹标准的 IMGUI 调用: ```csharp using UnityEditor; using UnityEngine; public class SceneGUI : Editor { [InitializeOnLoadMethod] static void InitializeOnLoad() { SceneView.duringSceneGui += (sceneView) => { Handles.BeginGUI(); if (GUILayout.Button("test2", GUILayout.Width(100))) { Debug.Log("test2"); } GUILayout.Label("弦风课堂"); Handles.EndGUI(); }; } } ``` 这种方法允许更灵活地控制何时何地显示特定控件,适用于需要频繁更新或交互性强的情况[^2]。 #### 添加菜单项启动自定义逻辑 如果希望提供一种便捷的方式让用户触发某些操作,则可以在编辑器脚本里注册新的菜单命令。下面的例子说明了如何利用 `[MenuItem]` 属性向编辑器窗口增加新条目: ```csharp using System; using UnityEngine; /// <summary> /// 自定义场景菜单特性 /// </summary> [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public class SceneViewMenuAttribute : PropertyAttribute { public string MenuName { get; private set; } public SceneViewMenuAttribute(string menuName) { MenuName = menuName; } } // 实际的方法实现部分... [MenuItem("Tools/My Custom Tool")] static void OpenCustomWindow() { // 执行一些初始化工作或者打开一个新的窗口 } ``` 上述代码片段解释了如何定义属性类以便于后续关联具体功能,并展示了一个简单示例——即当用户选择指定路径下的菜单选项时所应采取的动作[^4]。 #### 结合 `CustomEditor` 进行对象级定制 对于更加复杂的交互需求,比如针对某个游戏物体上的组件进行特殊处理,可以考虑使用 `[CustomEditor]` 特性和 `OnSceneGUI()` 函数配合完成。这种方式使得开发者能够精确捕捉用户的输入行为并与选定的游戏对象建立联系。 ```csharp using UnityEditor; using UnityEngine; [CustomEditor(typeof(Light))] public class LightEditor : Editor { private void OnSceneGUI() { Transform transform = ((Light)target).transform; // 处理光照方向调整或其他互动逻辑 if(GUI.changed){ // 更新数据结构以反映更改后的状态 } } } ``` 这种技术特别适合那些涉及物理位置变换或是其他空间关系的操作,因为它可以直接作用于选中的实体之上[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值