Check the example:
@tool
extends EditorScript
func _run() -> void:
var saver = MySaver.new()
var loader = MyLoader.new()
ResourceSaver.add_resource_format_saver(saver)
ResourceLoader.add_resource_format_loader(loader)
var my_res = MyResource.new()
my_res.name = "John"
my_res.age = 30
ResourceSaver.save(my_res, "user://save01.save")
var res2 = load("user://save01.save")
printt(res2.name, res2.age)
class MyResource extends Resource:
@export var name: String
@export var age: int
class MySaver extends ResourceFormatSaver:
func _get_recognized_extensions(resource: Resource) -> PackedStringArray:
if resource is MyResource:
return ["save"]
return []
func _recognize(resource: Resource) -> bool:
return resource is MyResource
func _save(resource: Resource, path: String, flags: int) -> Error:
# Open the file to save
var file = FileAccess.open(path, FileAccess.WRITE)
var err = FileAccess.get_open_error()
if err != OK:
return err
# Gather the properties to save
var save_props = {}
for prop in resource.get_property_list():
if prop.name == "script":
# SKIP script
continue
if prop.usage & PROPERTY_USAGE_STORAGE == PROPERTY_USAGE_STORAGE:
# Only get the ones marked as PROPERTY_USAGE_STORAGE
save_props.set(prop.name, resource.get(prop.name))
# Save them
var json = JSON.stringify(save_props)
file.store_string(json)
return OK
class MyLoader extends ResourceFormatLoader:
func _get_recognized_extensions() -> PackedStringArray:
return ["save"]
func _handles_type(type: StringName) -> bool:
return type == "MyResource"
func _load(path: String, original_path: String, use_sub_threads: bool, cache_mode: int) -> Variant:
# Open and parse the file to load
var file = FileAccess.get_file_as_string(path)
var json = JSON.parse_string(file)
# Create a MyResource
var res = MyResource.new()
# For each entry in the json set the value in the resource
for prop in json.keys():
res.set(prop, json.get(prop))
return res