You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Godot 4.1中复刻Inspector里的Transform属性控件

实现Godot 4.1自定义Transform Inspector控件与Gizmo支持

方法一:拆分属性导出 + 自定义Gizmo(快速实现)

直接导出位置、旋转(角度)、缩放三个独立Vector3属性,同时添加自定义Gizmo,让编辑器支持拖动、旋转、缩放的可视化操作,和原生Transform交互逻辑一致。

  1. 核心脚本代码
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()
  1. 效果说明
  • Inspector面板会生成分组的Custom Transform区域,包含X/Y/Z位置输入框、带滑块的角度旋转输入框、缩放输入框,样式和原生Transform完全匹配。
  • 场景视图会显示和原生一致的Gizmo手柄,支持拖动平移、旋转、缩放,操作会实时同步到自定义属性。

方法二:自定义Inspector插件(完美复刻原生控件)

如果需要完全复刻原生Transform的折叠面板样式(含展开/收起、控件布局),可以编写编辑器插件替换Transform3D属性的默认显示。

  1. 创建编辑器插件
    在项目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)
  1. 启用插件并使用
  • 打开Project > Project Settings > Plugins,启用刚创建的插件。
  • 在目标Node3D脚本中添加:
extends Node3D

@export var custom_transform: Transform3D = Transform3D.IDENTITY
func _ready():
    set_meta("use_custom_transform", true)
  1. 效果说明
  • Inspector中的custom_transform属性会显示成和原生Transform完全一致的折叠面板,支持角度/弧度切换、滑块调节,且自带场景视图Gizmo操作,体验和原生Transform无差异。

注意事项

  • 方法一无需插件,适合快速落地;方法二需编写编辑器插件,体验更贴近原生。
  • 若不需要自定义属性影响节点原生transform,需在update_custom_transform()中移除同步逻辑,仅保留自定义属性的业务处理。

内容的提问来源于stack exchange,提问作者Micahstuh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:39:57