I have resources that I want to remap for different exports. For example, I want to remap “res://default.tscn” to “res://mobile.tscn” for mobile exports. I also want to remap audio and texture files.
I have some code that works fine for .tscn files, but it doesn’t work for other resources types, such as textures:
func _export_file(path: String, type: String, features: PackedStringArray) -> void:
if (features.has("mobile")):
# Works great for .tscn files
if (path == "res://default.tscn"):
add_file(path, FileAccess.get_file_as_bytes("res://mobile.tscn"), true)
# Does not work for other resource types like this SVG or WAV file:
if (path == "res://icon-default.svg"):
add_file(path, FileAccess.get_file_as_bytes("res://icon-mobile.svg"), true)
if (path == "res://audio-default.wav"):
add_file(path, FileAccess.get_file_as_bytes("res://audio-mobile.wav"), true)
How should I write this so that it works for any resource type?
Ah, it seems that I should use _customize_resource for non-scene resources and _customize_scene for scenes. This is the full EditorExportPlugin that seems to be working…
@tool
extends EditorExportPlugin
var _res_features: PackedStringArray
var _scn_features: PackedStringArray
func _get_name() -> String:
return "Resource Remaps Export Plugin"
func _get_customization_configuration_hash() -> int:
return randi() # TODO: This is definitely the wrong way to do this...
func _begin_customize_resources (platform: EditorExportPlatform, features: PackedStringArray) -> bool:
_res_features = features
return true
func _end_customize_resources() -> void:
_res_features.clear()
func _customize_resource(resource: Resource, path: String) -> Resource:
if (_res_features.has("mobile")):
if (path == "res://icon-default.svg"):
return load("res://icon-mobile.svg")
if (path == "res://audio-default.wav"):
return load("res://audio-mobile.wav")
return null
func _begin_customize_scenes(platform: EditorExportPlatform, features: PackedStringArray) -> bool:
_scn_features = features
return true
func _end_customize_scenes() -> void:
_scn_features.clear()
func _customize_scene(scene:Node, path: String) -> Node:
if (_scn_features.has("mobile")):
if (path == "res://default.tscn"):
# Use GEN_EDIT_STATE_INSTANCE because that's what
# EditorExportPlatform::_export_customize uses to load a packed scene into a Node.
return (load("res://mobile.tscn") as PackedScene).instantiate(PackedScene.GEN_EDIT_STATE_INSTANCE)
return null