Comments (5)
I don't think we can support calling add_child()
in a constructor in godot-cpp, because depending on how the class was created, it won't be fully initialized at that point.
I do think NOTIFICATION_POSTINITIALIZE
is the way to go.
Currently, the child node is internal or not is depend on the flag
data.in_constructor
of its parent.
I think we need another way to mark a child node as internal. I had thought that the 3rd argument of add_child()
would let you mark a child as internal, but looking at the code, it seems that doesn't have an effect on duplicate()
. :-/ Maybe it should?
from godot.
What happens if you construct it with NOTIFICATION_POSTINITIALIZE
instead?
See:
from godot.
I have encountered the same signal connecting issue.
To solve this issue, I connect signals when receiving NOTIFICATION_POSTINITIALIZE
.
But in this case, add child in constructor and add child when receiving NOTIFICATION_POSTINITIALIZE
in _notification
will bring the same result.
Currently, the child node is internal or not is depend on the flag data.in_constructor
of its parent. The reason of this issue is that this flag is cleared too early, even before construction, let alone when the NOTIFICATION_POSTINITIALIZE
is received in GDExtension node.
from godot.
The flag isn't cleared until NOTIFICATION_POSTINITIALIZE
is sent, so it should be called on the node first, unless it's not sent to the child first
But this is a limitation that exists for GDScript as well (and C# too possibly, haven't tested), so it's a limitation to expand on, and should be handled directly IMO, a limitation to work around, and existing code works around it if they do create nodes in the constructor, I'd say the solution is to handle that correctly instead of depending on a missing feature
Existing code handling this properly will likely be broken by fixes to that side, as mentioned in the PR
from godot.
Let's clearify the concept first, the "internal node" in the issue is means a node is added in parent's construcotr, and its flags data.parent_owned
will be set by the flag data.in_constructor
of its parent.
"A node owned by its parent" should be a more appropriate statement.
A node owned by its parent will be skiped when duplicating its parent, because an equivalent node will be constructed by the copied parent nodeβs constructor.
I don't think we can support calling
add_child()
in a constructor in godot-cpp, because depending on how the class was created, it won't be fully initialized at that point.
This question need more discussion.
For my situation, I already use a lot of add_child()
in a constructor in godot-cpp. Because there have not explicit prohibition, and this is intuitive like in godot.
Until I encounter this issue, add a node in constructor is not owned by parents like in godot srouce code.
However, this is not due to add_child()
in constructor, _owner
field already be set and can be called successfully.
If a node is not fully initialized in constructor is the reason that we should not support add_child()
in a constructor, it means that use native apis in constructor is not supported. This is obviously very counter intuitive.
So I think we should try to advance the timing of setting instance and setting instance binding in godot-cpp, this is another topic.
I think we need another way to mark a child node as internal. I had thought that the 3rd argument of
add_child()
would let you mark a child as internal, but looking at the code, it seems that doesn't have an effect onduplicate()
. :-/ Maybe it should?
I agree that a new way to mark a node owned by parent should be provided, I think not all internal node can be decided in constructor.
I think the 3rd argument of add_child()
should have similar usage to mark a node to be sikped when duplicating its parent, too.
But now, let this argument can mark a node owned by parent will break compatibility (we can wait for Godot 5.0 π).
from godot.
Related Issues (20)
- In AnimationTree and AnimationPlayer, rapid crossfading in Dominant mode can make inconsistent results.
- OpenBSD build is broken due to compilation errors HOT 2
- Editor Feature Profiles: Selection of CheckBox in Tree does not remember folding for Profile that is not set a Current
- Area 2d in child of instantiated scene behaves differently HOT 2
- get_path() in Resource returns a empty string when it is created on disk. HOT 2
- Linux build error "retrieve: program binary cache file is corrupted. Ignoring and removing." HOT 4
- Can not set back '_subresources' param in import setting to default. HOT 1
- There is still a transparency issue with setting ALPHA=1.0 in the shader script
- Geometry2D.merge_polygons will always return polygons with counter-clock-wise HOT 2
- Compatibility OmniLight turns everything green, only for XRCamera HOT 4
- Godot crashes when script window is made floating and the engine is minimized HOT 3
- Tileset custom data shows as index (not name) in select mode (4.3) HOT 2
- [3.x] `ViewportContainer` unexpectedly turns off physics interpolation HOT 1
- Editor interface doesn't recover after resuming Suspend - Windows 7
- Editor crashes doesn't recover after resuming Suspend - Windows 7 HOT 2
- Built-in scripts of child nodes in editor require editor restart to reload HOT 2
- Animation player not playing animation clips for first time HOT 1
- Godot Export generates build with no main scene selected (no warning or error)
- Remote Debug for web exports is sometimes wrong
- Custom features tags are not respected for custom project settings HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
π Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. πππ
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google β€οΈ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from godot.