Unity状态图中自定义Inspector高度控制问题求助
问题:自定义PropertyDrawer在Unity Visual Scripting State Graph中布局异常(高度不足、拥挤)
问题背景
- 自定义
Jump类封装跳跃参数,自动处理加速度并支持缓降特性 - 通过
CustomPropertyDrawer实现自定义Inspector,需右键菜单触发参数验证后才应用值 - 在场景、预制体的普通Inspector中显示正常,但将
Jump变量添加到嵌入的State Graph时,Inspector布局拥挤、高度不足,仅右键菜单功能正常 - 已确认State Graph调用了
GetHeight()方法,但布局Rect的解析逻辑与普通Inspector不同,调整Visual Scripting项目设置无效果
排查要点
- State Graph环境下,
GetHeight()返回值未被正确映射到布局Rect的高度 - 普通Inspector与Visual Scripting的布局系统对PropertyDrawer的Rect处理存在差异
解决方案尝试
1. 强制指定Rect高度
在OnGUI()中手动覆盖Rect高度,绕过State Graph的布局解析逻辑:
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // 强制将Rect高度设置为GetHeight的计算值 position.height = GetHeight(property, label); // 原有绘制逻辑保留 EditorGUI.BeginProperty(position, label, property); // ... 你的属性绘制代码 ... EditorGUI.EndProperty(); }
2. 切换为GUILayout布局API
Visual Scripting的Inspector更适配GUILayout而非固定Rect,改用布局类方法绘制:
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(position, label, property); using (new EditorGUI.PropertyScope(position, label, property)) { // 用GUILayout替代Rect-based绘制,自动适配布局 GUILayout.Label(label, EditorStyles.boldLabel); // 绘制子属性示例 SerializedProperty jumpForce = property.FindPropertyRelative("jumpForce"); GUILayout.PropertyField(jumpForce); SerializedProperty fallMultiplier = property.FindPropertyRelative("fallMultiplier"); GUILayout.PropertyField(fallMultiplier); } EditorGUI.EndProperty(); } public override float GetHeight(SerializedProperty property, GUIContent label) { // 基于GUILayout元素计算总高度 float baseHeight = base.GetHeight(property, label); // 额外添加子属性的行高(每行取EditorGUIUtility.singleLineHeight) return baseHeight + EditorGUIUtility.singleLineHeight * 2; }
3. 针对State Graph环境做适配
检测当前Editor环境是否为State Graph窗口,针对性调整布局:
using Unity.VisualScripting; using UnityEditor; public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // 判断是否处于Visual Scripting的Graph窗口 if (EditorWindow.focusedWindow is GraphViewWindow) { // 增加额外高度避免拥挤 position.height *= 1.2f; // 或者拆分Rect为多行绘制 Rect lineRect = new Rect(position.x, position.y, position.width, EditorGUIUtility.singleLineHeight); // 第一行绘制标签 EditorGUI.LabelField(lineRect, label); lineRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; // 第二行绘制jumpForce SerializedProperty jumpForce = property.FindPropertyRelative("jumpForce"); EditorGUI.PropertyField(lineRect, jumpForce); lineRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; // 后续属性以此类推 } else { // 普通Inspector下的原有绘制逻辑 base.OnGUI(position, property, label); } }
4. 验证SerializedProperty路径正确性
State Graph中变量的属性路径可能带有前缀(如variables.data.xxx),确保FindPropertyRelative()能正确定位子属性,避免因路径错误导致绘制内容重叠。
内容的提问来源于stack exchange,提问作者TT87
相关产品推荐
相关产品推荐

