Plugins inspecteur

Le dock inspecteur prend en charge des plugins personnalisés pour créer vos propres widgets pour modifier les propriétés. Ce tutoriel explique comment utiliser les classes EditorInspectorPlugin et EditorProperty pour écrire de tels plugins avec l'exemple de la création d'un éditeur de valeur personnalisé.

Configuration

Tout comme Création de plugins, nous commençons par créer un nouveau plugin, en créant un fichier plugin.cfg, et nous commençons avec notre EditorPlugin. Cependant, au lieu d'utiliser add_custom_node ou add_control_to_dock, nous utiliserons add_inspector_plugin.

tool
extends EditorPlugin


var plugin


func _enter_tree():
    # EditorInspectorPlugin is a resource, so we use `new()` instead of `instance()`.
    plugin = preload("res://addons/MyPlugin/MyInspectorPlugin.gd").new()
    add_inspector_plugin(plugin)


func _exit_tree():
    remove_inspector_plugin(plugin)

EditorInspectorPlugin

Pour se connecter réellement à l'inspecteur, nous créons une classe EditorInspectorPlugin. Ce script fournit les "hooks" à l'inspecteur. Grâce à cette classe, l'éditeur appellera les fonctions de l'EditorInspectorPlugin pendant qu'il construira l'interface utilisateur de l'inspecteur. Le script est utilisé pour vérifier si nous devons nous activer pour tout Object qui se trouve actuellement dans l'inspecteur (y compris tout Resource qui est intégré !).

Une fois activé, EditorInspectorPlugin a des méthodes qui permettent d'ajouter des nœuds EditorProperty ou simplement de personnaliser les nœuds Control au début et à la fin de l'inspecteur pour ce Object, ou pour remplacer ou modifier des éditeurs de propriétés existants.

# MyInspectorPlugin.gd
extends EditorInspectorPlugin


func can_handle(object):
    # Here you can specify which object types (classes) should be handled by
    # this plugin. For example if the plugin is specific to your player
    # class defined with `class_name MyPlayer`, you can do:
    # `return object is MyPlayer`
    # In this example we'll support all objects, so:
    return true


func parse_property(object, type, path, hint, hint_text, usage):
    # We will handle properties of type integer.
    if type == TYPE_INT:
        # Register *an instance* of the custom property editor that we'll define next.
        add_property_editor(path, MyIntEditor.new())
        # We return `true` to notify the inspector that we'll be handling
        # this integer property, so it doesn't need to parse other plugins
        # (including built-in ones) for an appropriate editor.
        return true
    else:
        return false

EditorProperty

Ensuite, nous définissons l'éditeur de valeurs personnalisées EditorProperty que nous voulons instancier pour éditer les entiers. C'est un Control personnalisé et nous pouvons ajouter toutes sortes de nœuds supplémentaires pour créer des widgets avancés à intégrer dans l'inspecteur.

# MyIntEditor.gd
extends EditorProperty
class_name MyIntEditor


var updating = false
var spin = EditorSpinSlider.new()


func _init():
   # We'll add an EditorSpinSlider control, which is the same that the
   # inspector already uses for integer and float edition.
   # If you want to put the editor below the property name, use:
   # `set_bottom_editor(spin)`
   # Otherwise to put it inline with the property name use:
   add_child(spin)
   # To remember focus when selected back:
   add_focusable(spin)
   # Setup the EditorSpinSlider
   spin.set_min(0)
   spin.set_max(1000)
   spin.connect("value_changed", self, "_spin_changed")


func _spin_changed(value):
    if (updating):
        return
    emit_changed(get_edited_property(), value)


func update_property():
    var new_value = get_edited_object()[get_edited_property()]
    updating = true
    spin.set_value(new_value)
    updating = false