Godot Version
4.1.2
Question
I try create custom data type for my dialoge system. How i can do it? i try make inner class.But in inspector when i export it. it is null.
4.1.2
I try create custom data type for my dialoge system. How i can do it? i try make inner class.But in inspector when i export it. it is null.
I haven’t done it, but I think I’ve seen it in a tutorial and as far as I can remember:
TextPart should 1) extend Resource, and 2) have all variables you want to be exposed also be marked as @export
ps: and it may help to indicate type, such as @export var text_parts: Array[TextPart], but probably isn’t needed.
You will need to create a seperate file for TextPart
TextPart.gd
extends Resource # This can be any Node type, but for your purposes you only need a resource
class_name TextPart # This line makes the class available to other scripts
var text_content = "text"
# Rest of your variables...
func _init(_text_content:= "", ): #Default parameters as per @mrcdk's reply
# Definition
With this script saved (not attached to anything), you can use it as a custom type.
@export my_text_part: TextPart
Edit:The docs have a tutorial on this exact topic, which is worth a look here.
Inner classes can’t be exported. Classes with no extends <class>
automatically extend RefCounted
.
Create a script that extends Resource
and export the variables you want to have in the inspector. Resource
with an _init()
function with parameters will fail to load if the parameters don’t have a default value.
that is good, but what if i need create an array with it in inspector?
Sorry, didn’t notice you needed an array. You can create an exported array of type TextPart
like this:
#main.gd
extends Node2D
@export var text_parts: Array[TextPart] = []
func _ready():
text_parts.append(TextPart.new("Foo", "Bar", 42))
Note, I don’t instantiate any TextPart
objects until _ready()
. Not sure if there’s a way around this, but I couldn’t get it working otherwise.
Also, here’s an updated TextPart
script to fix an issue with _init() not running properly due to weak typing of the optional parameters:
# text_part.gd
extends Resource
class_name TextPart
@export var text_content = ""
@export var text_name = ""
@export var text_speed = 1
func _init(_text_content:= "", _text_name:= "", _text_speed:= 1):
text_content = _text_content
text_name = _text_name
text_speed = _text_speed
Hope that helps; feel free to ask any questions
also, what if i create text_part.gd like this?
by the way, it still works
Perfectly fine; static typing is great practice, and improves autocompletion in the editor.
So I discovered that if I write a new data type on top of the TextPart, it won’t work fine:
Everything in your screenshot look okay, so I couldn’t say for sure where the issue is.
Here’s a working version attempting to recreate your setup: (Apologies for the image format)
Note, it looks like the default parameter’s aren’t nessesary as previously thought - although they weren’t giving me any trouble either.
If you can’t get it working, you’re welcome to share project files and I can take a look.
I see everything is ok, how can I share the project with you? github or something like that? (thank you for helping)
No problem. GitHub is fine; alteratively, you can zip the project folder and share via Google Drive, OneDrive, etc.
here:
I’ve never seen this problem before, so am not 100% certain why this is the case, but the problem is that ActionTextPart
, which is a Resource
-derived class cannot export an Action
, because it is a Node
-derived class.
If you change action.gd
to extend from Resource
instead of Node
, everything works for me. If you needed node functionality here, you may need to rethink your system.
Fixed action.gd
:
extends Resource
class_name Action
func do_action():
pass
not sure, but I change action.gd to Resource. Nothing changed. oh i reload godot and it work! thanks!
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.