记录一次关于GetNode方法的GoDot 4.2 (采用c#脚本)的踩坑
前言:笔者是第一次使用godot,c#的一些高级特性也不是很精通.今天在跟着b站上视频教程时遇到了奇怪的问题,具体报错如下
xxxxxxxxxx
E 0:00:00:0426 object System.Runtime.CompilerServices.CastHelpers.ChkCastAny(System.Void*, object): System.InvalidCastException: Unable to cast object of type 'Godot.Node' to type 'Fsm'.
<C++ 错误> System.InvalidCastException
<C++ 源文件> :0 @ object System.Runtime.CompilerServices.CastHelpers.ChkCastAny(System.Void*, object)
<栈追踪> :0 @ object System.Runtime.CompilerServices.CastHelpers.ChkCastAny(System.Void*, object)
NodeExtensions.cs:47 @ T Godot.Node.GetNode<T>(Godot.NodePath)
Main.cs:10 @ void Main._Ready()
Node.cs:2137 @ bool Godot.Node.InvokeGodotClassMethod(Godot.NativeInterop.godot_string_name&, Godot.NativeInterop.NativeVariantPtrArgs, Godot.NativeInterop.godot_variant&)
Main_ScriptMethods.generated.cs:48 @ bool Main.InvokeGodotClassMethod(Godot.NativeInterop.godot_string_name&, Godot.NativeInterop.NativeVariantPtrArgs, Godot.NativeInterop.godot_variant&)
CSharpInstanceBridge.cs:24 @ Godot.NativeInterop.godot_bool Godot.Bridge.CSharpInstanceBridge.Call(nint, Godot.NativeInterop.godot_string_name*, Godot.NativeInterop.godot_variant**, int, Godot.NativeInterop.godot_variant_call_error*, Godot.NativeInterop.godot_variant*)
在这里我实现了Fsm类,并在一个Main.cs
文件中导入这个节点GetNode<Fsm>("%Fsm")
x
using Godot;
public partial class Main : Node
{
private Fsm _fsm;
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
_fsm = GetNode<Fsm>("%Fsm");
GD.Print(_fsm.GetType().Name);
_fsm.Initialize();
}
// Called every frame. 'delta' is the elapsed time since the previous frame.
public override void _Process(double delta)
{
_fsm.Update();
}
}
将此行_fsm = GetNode<Fsm>("%Fsm");
注释并使用GetNode("%Fsm")
,发现返回值为Node,并且该Node实例没有任何属性.
原因和解决
windows的godot4.2没有对场景的自动保存,因此在为场景添加c#脚本后需要手动保存,否则即使创建了c#脚本文件,但是没有和场景进行绑定.
由此,在前面的代码中实际上节点Fsm是不在节点Main下的.
手动指定Script后恢复正常.
0 评论:
发表评论