Repository: godot
Issue: Value Initialization in both C# and GDScript only work when using the [Tool] Attribute on classes that derive from any Godot Engine Type (e.g Node, Resource)
Labels: discussion,topic:dotnet

### Godot version

4.2-dev3

### System information

Godot v4.2.dev3.mono - Windows 10.0.19045 - Vulkan (Forward+) - dedicated NVIDIA GeForce RTX 3080 (NVIDIA; 31.0.15.3623) - AMD Ryzen 7 3800X 8-Core Processor (16 Threads)

### Issue description

I'm not sure if this "by design", a bug or still open for discussion, 
but is the following true about value initialization?

- The Idea: Whenever you want a Custom Node or Resource to Initialize its values, you're supposed to...
-> override the _init() function in GDScript
-> create a default constructor and do it ithere in C#

- The Problem: Checking this out in Godot 4.2-dev3 or even Godot 4.1.1-stable this does not work.
It only works in both languages (C# / GDScript) when making the class a [Tool] class.


- A Simple Example
In GDScript -> testnode.gd
```
@tool
extends Node

@export var vec : Vector3;

func _init():
    vec = Vector3(1.0,2.0,3.0);
```

In C# -> TestNode.cs
```cs
[Tool]
public partial class TestNode : Node
{
    public Vector3 Vec;

    public TestNode()
    {
        Vec = new Vector3(1.0f, 2.0f, 3.0f);
    }
}
```

- My Expectation: This should work without the Tool Attribute by simply calling new TestNode() in C# or _init() in GDScript when adding the script to a Node or creating a new resource object via the inspector

- The Question: Is this value initialization behaviour "by design" or a valid bug report? Also am i wrong or is the constructor / _init() usage not really documented at all?

- Links to the Documentation(s) where i'd expect such a explanation
-> https://docs.godotengine.org/en/stable/tutorials/scripting/c_sharp/c_sharp_basics.html
C# basics only tells about _ready() beeing used for initialization, but doesnt tell anything about constructors and default values  
```cs
    public override void _Ready()
    {
        // Called every time the node is added to the scene.
        // Initialization here.
        GD.Print("Hello from C# to Godot :)");
    }
```
->https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html
GDScript basics tells about the _init() beeing the constructor and also about _static_init() beeing a static constructor, 
```
# Constructor
func _init():
    print("Constructed!")
    var lv = Something.new()
    print(lv.a)
```

### Steps to reproduce

Take any project, and copy these steps:

(1) Open up any Godot version from the 4.X releases or dev-snapshots

(2) Create a .cs or .gd file and copy the following code
GDScript -> testnode.gd
```
@tool
extends Node

@export var vec : Vector3;

func _init():
    vec = Vector3(1.0,2.0,3.0);
```
In C# -> TestNode.cs
```cs
[Tool]
public partial class TestNode : Node
{
    public Vector3 Vec;

    public TestNode()
    {
        Vec = new Vector3(1.0f, 2.0f, 3.0f);
    }
}
```

(3) Add a simple "Node" and attach the script to it. You'll see the values are there.

(4) Remove the [Tool] or (at)tool, Save the script.

(5) Remove the script from the "Node" object 

(6) Re-add the script to the Node. The value wont update

### Minimal reproduction project

(see steps above)