Unity3D Editor ControlID 简单介绍

环境:Unity2021.1.14 Odin3.0.4 语言:C#

面向:Editor开发人员

总起

当我在工具代码中看到这行代码时:

GUIUtility.hotControl = id;

我产生了一个疑问,ControlID是什么?

第19章 GUI を自作する - エディター拡張入門中的介绍也只是寥寥几笔:

为每个GUI分配一个ControlID,此ID使每个GUI独立,如果没有正确分配这个ID,你最终会遇到多个GUI操作的冲突。比如

### 如何在Unity中创建或自定义Tooltip #### 使用UGUI实现简单的Tooltip效果 为了实现在Unity中的简单Tooltip功能,可以利用Unity的UI系统(UGUI)。通过脚本控制来显示和隐藏带有提示信息的游戏对象。 ```csharp using UnityEngine; using UnityEngine.UI; public class SimpleTooltip : MonoBehaviour { public GameObject tooltipPanel; // 绑定一个Canvas下的空物体作为tooltip容器 private RectTransform canvasRectTransform; void Start() { canvasRectTransform = Canvas.main.GetComponent<RectTransform>(); HideTooltip(); } public void ShowTooltip(string message) { tooltipPanel.SetActive(true); tooltipPanel.transform.GetChild(0).GetComponent<Text>().text = message; UpdateTooltipPosition(Input.mousePosition); // 显示时立即更新位置 Vector2 localMousePos; RectTransformUtility.ScreenPointToLocalPointInRectangle( canvasRectTransform, Input.mousePosition, null, out localMousePos); tooltipPanel.transform.localPosition = new Vector3(localMousePos.x + 15f, localMousePos.y - 15f, 0f); } public void HideTooltip() { tooltipPanel.SetActive(false); } } ``` 此代码片段展示了如何基于鼠标指针的位置动态调整`tooltipPanel`的位置[^1]。当调用`ShowTooltip()`方法并传入想要展示的消息字符串参数时,会激活绑定好的面板,并设置其子Text组件的内容为指定消息;而`HideTooltip()`用于关闭该提示框。 #### 自定义Inspector属性绘制以支持Tooltip特性 对于编辑器端更复杂的场景下,可以通过继承`PropertyDrawer`来自定义字段上的工具提示行为: ```csharp using UnityEditor; using UnityEngine; [CustomPropertyDrawer(typeof(MyAttribute))] public class MyAttributeDrawer : PropertyDrawer { public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { return base.GetPropertyHeight(property, label); } public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { var myAttr = (MyAttribute)this.attribute; if (!string.IsNullOrEmpty(myAttr.tooltip)) { TooltipHelper.Add(position, myAttr.tooltip); } EditorGUI.PropertyField(position, property, true); } } // Helper Class for adding tooltips in editor static class TooltipHelper { static readonly Dictionary<int, string> _tooltips = new Dictionary<int, string>(); internal static void Add(Rect rect, string text) { int id = GUIUtility.GetControlID(FocusType.Passive); _tooltips[id] = text; Event e = Event.current; switch (e.type) { case EventType.Repaint: HandleRepaint(rect, id); break; case EventType.MouseMove: HandleMouseMove(id); break; } } static void HandleRepaint(Rect rect, int controlId) { Handles.BeginGUI(); GUIStyle style = "window"; foreach (var pair in _tooltips.Where(p => p.Key == controlId)) { GUIContent content = new GUIContent(pair.Value); Vector2 size = style.CalcSize(content); Rect r = new Rect(Event.current.mousePosition.x + 8, Screen.height - Event.current.mousePosition.y - 8 - size.y, size.x, size.y); GUI.Label(r, content, style); } Handles.EndGUI(); } static void HandleMouseMove(int currentId) { if (_tooltips.ContainsKey(currentId)) { RepaintAll(); } } static void RepaintAll() { EditorWindow.focusedWindow?.Repaint(); } } ``` 上述代码实现了对特定属性添加自定义的Editor窗口内悬浮提示功能[^3]。这里的关键在于使用了静态字典存储临时性的提示文字映射关系,在每次重绘(`Repaint`)期间检查当前是否有匹配项存在,则会在屏幕相应坐标处渲染对应的文本标签。 #### 配合Dialogue System处理带Tooltip的对话界面 如果项目中有集成类似的对话管理系统,那么还需要特别注意确保所有涉及交互控件都已正确定位并且能够响应用户的输入操作。这通常涉及到验证对话系统的布局设定以及各个元素之间的相对尺寸配置等问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值