EditorResourcePicker in Godot – Complete Guide

Welcome to our tutorial on the EditorResourcePicker class, an essential feature newly introduced in Godot 4. In this article, we’re going to dive deep into what EditorResourcePicker is, its uses, and how you can leverage it to improve your game development workflow within Godot’s robust editor. Whether you’re starting your coding journey or you’re an experienced developer looking to streamline your creative process, understanding this tool is key to optimizing your use of Godot’s powerful engine. So let’s explore the world of EditorResourcePicker together!

What is EditorResourcePicker?

The EditorResourcePicker is a control node within the Godot 4 editor that facilitates the selection and management of Resource type properties. Think of it as a helpful UI component that allows developers to swiftly create, load, save, and convert resources, thereby enhancing the efficiency of their game development workflow.

What is it for?

Primarily, the EditorResourcePicker is used in the Inspector dock of Godot’s editor for managing resources bound to script properties. Its user-friendly interface allows you to add a level of interactivity to your project settings, enabling you to:

– Quickly associate resources with your game objects
– Create new resources or load existing ones for your nodes
– Save time navigating through your project’s assets
– Organize your resources more effectively

Why Should I Learn It?

Whether you’re a beginner getting to grips with the basics or a seasoned pro refining your toolset, understanding the EditorResourcePicker is beneficial for several reasons:

– **Efficiency:** Automate repetitive tasks and manage your assets conveniently from one place.
– **Customization:** Adapt the picker’s behaviour and appearance to fit your specific project needs.
– **Extension:** Employ it within custom plugins to harness Godot’s extensible architecture and tailor the editor to your workflow.

These capabilities make the EditorResourcePicker not just a nifty feature, but a potentially massive time-saver as you develop more complex games and applications. Let’s find out how to utilize this tool effectively with practical coding examples!

CTA Small Image

Creating Custom Scripts with EditorResourcePicker

Becoming proficient with the EditorResourcePicker begins with creating custom scripts that include Resource type properties. Below, you’ll find a simple code snippet demonstrating how to define a resource property within a custom script:

extends Node

export(Resource) var my_resource

With this code added to your script, Godot’s Inspector dock will automatically display the EditorResourcePicker UI when the variable ‘my_resource’ is selected. This allows you to easily assign an existing resource or create a new one specifically for this property.

Loading and Assigning Resources

Once you have a Resource type property, using the EditorResourcePicker to assign a resource is straightforward:

extends Sprite

export(Texture) var my_texture

func _ready():
    self.texture = my_texture

In the case of a `Sprite` node, assigning a texture resource allows you to visually represent the sprite in your game. The EditorResourcePicker will enable you to load any texture file from your project’s Assets to the sprite directly from the Inspector.

Creating New Resources

To create a new resource via the EditorResourcePicker, simply click the drop-down menu and select “New Resource”. Here’s an example of how to create a new script that includes a custom resource:

extends Node

export(Script) var my_custom_script

func _ready():
    if my_custom_script != null:
        var instance = my_custom_script.new()

Here, we define an exported `Script` property that allows us to use the EditorResourcePicker to create a new Godot script and attach it as a child of the current node.

Using the EditorResourcePicker in Plugins

The EditorResourcePicker can also be incorporated into custom editor plugins for streamlined asset management. Here’s an example of creating an EditorPlugin that utilizes EditorResourcePicker:

extends EditorPlugin

func _enter_tree():
    var picker = EditorResourcePicker.new()
    picker.connect("selected", self, "_on_resource_selected")
    add_control_to_container(CONTAINER_PROPERTY_EDITOR_BOTTOM, picker)

func _on_resource_selected(resource):
    print("Selected Resource Path: ", resource.resource_path)

This plugin snippet adds an EditorResourcePicker to the bottom of the property editor when the plugin is enabled. When a resource is selected, it prints the path of the selected resource to the output console.

Remember, these examples serve as a foundation. We encourage you to experiment with the EditorResourcePicker in different contexts to discover its full potential within your own Godot projects. Stay tuned for more examples in the continuation of this tutorial, where we’ll delve into more advanced applications of this powerful tool.Great, let’s move forward and expand on the advanced applications of the EditorResourcePicker in Godot 4. We’ll delve into how you can utilize this tool to manage various resource types and improve the efficiency of your workflow even further.

Advanced Usage of EditorResourcePicker

When it comes to more complex scenarios, the EditorResourcePicker remains an incredibly versatile tool. Here are some code examples demonstrating its advanced uses.

Property Hints with EditorResourcePicker: You can add property hints to your exported Resource variables, which enables the picker to offer more context-sensitive options.

extends Control

export(PackedScene, FILTER_SCRIPTS) var scene_resource

In the above example, a `PackedScene` resource is exported with a filter that allows only resources that are scripts. This narrows down the picker’s selection to relevant items, making your asset management more streamlined.

Customizing the EditorResourcePicker Appearance: You may want to customize the appearance of the EditorResourcePicker to better fit your plugin or project’s visual style.

# Assuming picker is a reference to an EditorResourcePicker instance.
picker.edited_resource = preload("res://path_to_your_resource.tres")
picker.base_type = "Texture" # Limit the picker to only show Texture resources.
picker.size = Vector2(100, 30) # Custom size for the picker button.

Validating Assigned Resources: Sometimes it’s necessary to validate the resources your users try to assign through the EditorResourcePicker to ensure they meet certain criteria.

extends Node

export(Script) var my_validated_script

func _set_my_validated_script(value):
    if value is GDScript:
        my_validated_script = value
        push_warning("Only GDScript files are accepted.")

func _get_my_validated_script():
    return my_validated_script

Using setter and getter functions, you can control exactly what type of script files can be assigned to this export variable.

Pairing EditorResourcePicker with Custom Inspector Plugins: For an even more tailored experience, you can wire the EditorResourcePicker into custom inspector plugins for different types of resources.

extends EditorInspectorPlugin

func can_handle(object):
    return object is MyCustomResource

func parse_property(object, type, path, hint, hint_text, usage):
    if path == "MyCustomResource.data":
        var picker = EditorResourcePicker.new()
        picker.base_type = "MyDataType"
        return true
    return false

The above snippet shows how to add an `EditorResourcePicker` specifically for a property `data` of a custom resource type called `MyCustomResource`.

Streamlining Scene Setup: You can utilize EditorResourcePicker to quickly instantiate scenes or preload scripts in your game nodes.

extends Node2D

export(PackedScene) var player_scene

func _ready():
    if player_scene:
        var player = player_scene.instance()

By exporting a `PackedScene` variable and using the EditorResourcePicker to assign a scene, you can quickly set up your player character in a level, for instance.

Converting Resources: The EditorResourcePicker also allows for easy conversion of resources. This can be incredibly handy when working with different resource types and formats.

# Assuming picker is a reference to an EditorResourcePicker instance.
picker.drop_mode_flags = EditorResourcePicker.DROP_MODE_INPLACE
# When a user tries to assign a resource not matching the base_type,
# the picker will propose to convert it to a proper type.

These examples aim to illustrate the versatility and power of the EditorResourcePicker within Godot 4. As you integrate these snippets into your workflows and play with the possibilities, you’ll quickly see how this tool can adapt to fit nearly any development scenario you encounter. Remember, these examples are starting points – we encourage you to explore and manipulate them to best suit the unique needs of your projects. Keep experimenting, and happy coding!Certainly, we’ll continue delving deeper into the capabilities of Godot’s EditorResourcePicker with more elaborate code examples. These snippets will illustrate the versatility of this tool in different scenarios you might encounter in game development.

Customizing Filters for the ResourcePicker:
You can further refine the types of resources presented in the picker by specifying custom filters. This is particularly useful when you need to restrict the resource selection to a particular subtype or category.

extends Sprite

export(Texture) var sprite_texture setget _set_sprite_texture

func _set_sprite_texture(value):
    if value is StreamTexture or value is ImageTexture:
        sprite_texture = value
        push_error("Only StreamTexture or ImageTexture types are allowed.")

This script ensures that only objects of type `StreamTexture` or `ImageTexture` can be assigned to the `sprite_texture` variable, preventing invalid texture types from being used.

Using Groups with EditorResourcePicker:
Sometimes, you may want to tag resources with groups for better organization. You can set up the picker to filter by these groups.

extends Control

export(Resource) var my_grouped_resource setget _set_grouped_resource

func _set_grouped_resource(value):
    if "desired_group" in value.get_groups():
        my_grouped_resource = value
        push_error("Resource must be part of 'desired_group'.")

func _get_grouped_resource():
    return my_grouped_resource

With this code, the resource won’t be assigned unless it’s a member of the ‘desired_group’, ensuring consistency within your resource groupings.

Providing Custom Resource Creation Options:
EditorResourcePicker allows for the provision of custom resources directly from the picker’s interface by defining custom classes for resource types.

extends EditorInspectorPlugin

func can_handle(object):
    return object is Node2D

func parse_property(object, type, path, hint, hint_text, usage):
    if type == TYPE_OBJECT and hint == PROPERTY_HINT_RESOURCE_TYPE and hint_text == "Texture":
        var picker = EditorResourcePicker.new()
        picker.connect("resource_created", self, "_on_texture_created")
        return true

func _on_texture_created(resource):
    resource.set_as_typed_textures() # Custom function call on your newly created resource

This snippet shows an example of how to define a custom resource creation function that’s automatically called when a new resource is created using the picker.

EditorResourcePicker and Asynchronous Loading:
In cases where resources might be large or take time to load, you can employ asynchronous loading within the EditorResourcePicker, resulting in a more responsive editor experience.

extends Node

var my_async_resource: Resource setget _set_async_resource

func _set_async_resource(value):
    var loader = ResourceLoader.load_interactive(value.get_path())
    if loader:
        while loader.poll() == ERR_FILE_EOF:
            OS.delay_msec(10) # Wait for loading to complete without freezing the editor
        my_async_resource = loader.get_resource()

This is a way to implement asynchronous resource loading inside your custom scripts when using EditorResourcePicker to avoid stalling the editor with long synchronous load operations.

Integrating EditorResourcePicker into UI Widgets:
You’re not limited to using the EditorResourcePicker solely within the inspector. It can be embedded in custom docks or other parts of the editor UI.

extends Control

export(Resource) var resource_for_widget

var picker = EditorResourcePicker.new()

func _ready():
    picker.connect("selected", self, "_on_resource_selected")

func _on_resource_selected(res):
    resource_for_widget = res

Here, we embed the EditorResourcePicker into a custom control and update the widget based on the resource selected.

Enhancing Plugin Functionality:
When creating editor plugins, the EditorResourcePicker can be used to extend Godot’s editor’s UI and functionality, providing specific resource management features.

extends EditorPlugin

func _enter_tree():
    var dock = preload("res://my_custom_dock.tscn").instance()
    add_control_to_dock(DOCK_SLOT_LEFT_BL, dock)
    var picker = dock.get_node("EditorResourcePicker")
    picker.connect("resource_selected", self, "_on_resource_selected")

func _on_resource_selected(resource):

Above, we add a custom dock to the editor that includes an EditorResourcePicker. When a resource is selected in the picker, it triggers a custom process within the plugin.

These examples show a few of the many ways the EditorResourcePicker can be adapted to suit a wide range of specific requirements in Godot 4, from refining the types of resources displayed to embedding the picker in custom UIs and plugins. Remember, each example should be seen as a starting point for your exploration and customization. Take these snippets and use them to craft a user experience that is seamless, efficient, and tailored to your needs. With Godot’s flexible editing framework, the possibilities for innovation and optimization are almost limitless.

Where to Go Next?

With the foundational knowledge of Godot 4’s EditorResourcePicker you’ve gained today, you’re well-prepared to take your Godot abilities to the next level. But why stop there? The world of game development is vast and constantly evolving, and there’s always more to learn—to sharpen your skills, expand your knowledge, and bring your innovative game ideas to life.

For a structured learning path that encompasses not just the essentials but dives deep into the world of game programming, our Godot Game Development Mini-Degree is an excellent next step. You’ll explore everything from the nuts and bolts of the GDScript language to the creation of engaging game mechanics across diverse genres. These courses are crafted to take you from beginner to pro at your own pace, ensuring that no matter where you start, you’ll end with a comprehensive skill set ready for the industry.

If you’re eager to explore more courses that cater to a variety of experience levels and interests within the Godot ecosystem, visit our broad collection of Godot courses at Zenva Academy. Here at Zenva, we prioritize high-quality content and flexible learning experiences, enabling you to turn your creative visions into reality and boost your career with the valuable skills that you can earn certifications for. Whatever your aspirations in game development are, we’re here to support your journey every step of the way!


As we wrap up this exploration of the EditorResourcePicker in Godot 4, remember that your journey in game development is filled with continuous learning and creative experimentation. The EditorResourcePicker is just one of the many tools in Godot that can dramatically streamline your development process, opening up a world of possibilities for both your current and future projects.

Embrace the power of Godot’s rich features and refine your skills with us at Zenva Academy, where each course is designed to help you achieve your game development dreams. Whether you’re looking to build your next indie game hit or aiming to join a professional game development team, our Godot Game Development Mini-Degree is the perfect place to start. Let’s continue this exciting coding adventure together—your game awaits!

Python Blog Image

FINAL DAYS: Unlock coding courses in Unity, Godot, Unreal, Python and more.