How do you mean you imported the resource? Into what script? Do you mean you assigned it in the editor to a property?
I mean this:
Resource loaded_resource = GD.Load<Resource>(path + file_name);
And I’d like to refer to resource fields, for example:
string name = loaded_resource.Name
But of course it doesn’t work and I’m looking for a solution
You need to load it as your custom resource type, instead if Resource
, so GD.Load<CellTemplate>
I tried it, but it doesn’t work. Here is the error:
E 0:00:01:0266 object System.Runtime.CompilerServices.CastHelpers.ChkCastAny(System.Void*, object): System.InvalidCastException: Unable to cast object of type 'Godot.Resource' to type 'Template'.
My bad it autocorrected: GD.Load<CellTemplate>
No, you wrote everything correctly, it’s just that I have two scripts. One is GDScript and the other is C#. Based on GDScript I create resources in the editor itself, because using C# there is no button to create a resource.
I guess I should have written about it, my mistake.
Here are both codes:
Template.gd:
extends Resource
class_name Template
@export_subgroup("Base")
@export var name: String = "Error"
@export_enum("Code", "World", "Ground") var type: = "Code"
@export_subgroup("Icon")
@export var icon_name: String = "error"
@export_enum(".png") var icon_type = ".png"
@export_subgroup("Texture")
@export var texture_name: String = "error"
@export_enum(".png") var texture_type = ".png"
@export_subgroup("Features")
@export var is_destructible: bool = false
@export_subgroup("Collision")
@export var collision_layers: int
@export var collision_masks: int
#@export_flags_2d_physics var collision_layers
#@export_flags_2d_physics var collision_masks
@export_subgroup("Size")
@export_enum("1x1", "2x2", "3x3") var size = "1x1"
@export var count_cells: int = 1
Template.cs
using Godot;
public partial class Template : Resource
{
[Export]
public string name;
[Export]
public string type;
[Export]
public string icon_name;
[Export]
public string icon_type;
[Export]
public string texture_name;
[Export]
public string texture_type;
[Export]
public bool is_destructible;
[Export]
public int collision_layers;
[Export]
public int collision_masks;
[Export]
public string size;
[Export]
public int count_cells;
}
I apologize for writing nonsense in the question. Well, I found the answer. The Resource fields can be accessed by calling the Get(“FIELD_NAME”) method;
For example:
Resource resource = GD.Load<Resource>("path");
string name = (string)resource.Get("name");
P.S: There’s more information about cross-language development here
1 Like
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.