gadzhi kharkharov

Using custom resources in Godot

2020-03-08

The concept of separating data and logic in Godot is quite powerful: you're using Resources to store some data about a class and custom scripts to define logic. Of course, it's not as simple as that and scripts are technically resources too, but that's not the point.

What you'll learn

In this post you'll learn how to create your own custom resources to hold data of various types that can be accessed and modified through the inspector panel and scripts.

We'll start with the most basic example and then dig into how you can take it one step further by creating a fully dynamic inspector interface that changes depending on which variables are set in the resource.

1. Basic example

As a basic example, we're going to create a character class resource that defines a variety of stats for different playable classes (such as Warrior, Wizard, etc...).

structure

1.1. Creating a resource script

Start by creating a script file called CharacterStats.gd in the Filesystem dock.

We want this script to extend Godot's Resource type. Additionally, we can register the class globally as CharacterStats to utilize Godot's auto-completion when we'll be referencing it from other scripts.

extends Resource
class_name CharacterStats

Next we'll define some starting variables like the name of the character class and a description.

extends Resource
class_name CharacterStats

var name: = "Character name"
var description: = "Character description"

1.2. Exporting script variables

TODO: remove this section and just start with empty variables

Prefixing a variable with export keyword serializes it in the Godot Inspector for easier editing. Godot serializes a variable based on its type, so a String will be show as a text field, bool will be a checkbox and so on.

extends Resource
class_name CharacterStats

export var name: = "Character name"
export var description: = "Character description"

Exported variables in Godot inspector

In this case the variable type is inferred from the value, but if we were to declare an empty variable and export it, we could write it like so:

export(String) var name
export(String) var description

This is called export hints and you can learn more about different examples in the Godot documentation.

In our case, we want the description variable to be exported as a large text area, as we might have longer descriptions for each class. Adding a MULTILINE flag in the export hint makes exactly that:

export(String) var name
export(String, MULTILINE) var description

Now we can add variables for all character stats we're planning to use in our game.

extends Resource
class_name CharacterStats

export var name: String
export(String, MULTILINE) var description: String
export var icon: Texture

export var health: int
export var armor: int
export var damage: int
export var attack_speed: float # attacks per second