如何在Godot 4.1中复刻Inspector里的Transform属性控件
实现Godot 4.1自定义Transform Inspector控件与Gizmo支持
方法一:拆分属性导出 + 自定义Gizmo(快速实现)
直接导出位置、旋转(角度)、缩放三个独立Vector3属性,同时添加自定义Gizmo,让编辑器支持拖动、旋转、缩放的可视化操作,和原生Transform交互逻辑一致。
- 核心脚本代码
extends Node3D @export_group("Custom Transform") @export var custom_position: Vector3 = Vector3.ZERO: set(value): custom_position = value update_custom_transform() @export var custom_rotation_degrees: Vector3 = Vector3.ZERO: set(value): custom_rotation_degrees = value update_custom_transform() @export var custom_scale: Vector3 = Vector3.ONE: set(value): custom_scale = value update_custom_transform() func update_custom_transform() -> void: # 根据需求选择是否同步到节点原生transform,或仅保留自定义属性逻辑 # transform = Transform3D(Basis.from_euler(custom_rotation_degrees * DEG_TO_RAD), custom_position).scaled(custom_scale) pass # 自定义Gizmo,实现和原生一致的交互手柄 func _get_gizmos() -> Array[EditorGizmo3D]: var gizmo = EditorGizmo3D.new() gizmo.set_handle_count(7) # 3个平移轴 + 3个旋转轴 + 1个缩放手柄 # 绑定平移手柄 for i in 3: gizmo.set_handle(i, custom_position, EditorGizmo3D.HANDLE_TRANSLATE, i) # 绑定旋转手柄 for i in 3: gizmo.set_handle(i+3, custom_position, EditorGizmo3D.HANDLE_ROTATE, i) # 绑定缩放手柄 gizmo.set_handle(6, custom_position, EditorGizmo3D.HANDLE_SCALE, -1) gizmo.connect("handle_transform", self, "_on_gizmo_handle_transform") return [gizmo] func _on_gizmo_handle_transform(handle_idx: int, transform: Transform3D, camera: Camera3D) -> void: match handle_idx: 0,1,2: custom_position = transform.origin 3,4,5: custom_rotation_degrees = transform.basis.get_euler() * RAD_TO_DEG 6: custom_scale = custom_scale * transform.basis.get_scale() update_custom_transform()
- 效果说明
- Inspector面板会生成分组的
Custom Transform区域,包含X/Y/Z位置输入框、带滑块的角度旋转输入框、缩放输入框,样式和原生Transform完全匹配。 - 场景视图会显示和原生一致的Gizmo手柄,支持拖动平移、旋转、缩放,操作会实时同步到自定义属性。
方法二:自定义Inspector插件(完美复刻原生控件)
如果需要完全复刻原生Transform的折叠面板样式(含展开/收起、控件布局),可以编写编辑器插件替换Transform3D属性的默认显示。
- 创建编辑器插件
在项目addons/custom_transform_inspector目录下创建两个脚本:
plugin.gd:
@tool extends EditorInspectorPlugin func _can_handle(object: Object) -> bool: return object is Node3D and object.has_meta("use_custom_transform") func _parse_property(object: Object, type: Variant.Type, name: String, hint: int, hint_text: String, usage: int) -> bool: if name == "custom_transform": add_custom_control(CustomTransformEditor.new(object, name)) return true return false
custom_transform_editor.gd:
@tool extends VBoxContainer var target: Node3D var property_name: String func _init(target_node: Node3D, prop_name: String): target = target_node property_name = prop_name # 直接复用Godot原生的Transform编辑器控件 var fold = EditorPropertyTransform3D.new() fold.set_object_and_property(target, property_name) add_child(fold)
- 启用插件并使用
- 打开
Project > Project Settings > Plugins,启用刚创建的插件。 - 在目标Node3D脚本中添加:
extends Node3D @export var custom_transform: Transform3D = Transform3D.IDENTITY func _ready(): set_meta("use_custom_transform", true)
- 效果说明
- Inspector中的
custom_transform属性会显示成和原生Transform完全一致的折叠面板,支持角度/弧度切换、滑块调节,且自带场景视图Gizmo操作,体验和原生Transform无差异。
注意事项
- 方法一无需插件,适合快速落地;方法二需编写编辑器插件,体验更贴近原生。
- 若不需要自定义属性影响节点原生
transform,需在update_custom_transform()中移除同步逻辑,仅保留自定义属性的业务处理。
内容的提问来源于stack exchange,提问作者Micahstuh
相关产品推荐
相关产品推荐

