我正在try 用C#在Godot4中创建一个交互和对话系统.使用互动系统,我想与一个NPC互动,这将触发任务对话.对话系统似乎工作得很好,但我遇到了关于使用Async/AWait的交互系统的问题.以下是代码:
public async override void _Input(InputEvent @event)
{
if (@event.IsActionReleased("Interact") && canIneract && activeAreas.Count > 0)
{
canIneract = false;
interactDisplay.Hide();
var result = activeAreas[0].Interact.Call(otherBody);
await ToSignal((GodotObject)result, "DialogueComplete");
canIneract = true;
}
}
我正在翻译我正在观看的tutorial 个GDSript代码,他们的代码看起来像这样:
func _input(event):
if event.is_action_pressed("interact") && can_interact:
if active_areas.size() > 0:
can_interact = false
label.hide()
await active_areas[0].ineract.call()
can_interact = true
我的代码与他的代码略有不同,但await
行才是最重要的.我正在try 在我的交互系统上使用await
,直到我的对话系统结束.然而,在C#中,我必须使用toSignal方法来等待,就像您在第一个示例中看到的那样.我有点困惑,因为在GDScript中实现相同操作的方式可能与C#版本非常不同.我try 在线查找解决方案并阅读文档,得到的唯一提示是使用toSignal方法,并传入我想要的信号名称.但我一直收到这个错误.
E 0:00:05:0142 Godot.NativeInterop.NativeFuncs.generated.cs:108 @ Godot.Error Godot.NativeInterop.NativeFuncs.godotsharp_internal_signal_awaiter_connect(IntPtr , Godot.NativeInterop.godot_string_name& , IntPtr , IntPtr ): Parameter "p_source" is null.
<C++ Source> modules/mono/signal_awaiter_utils.cpp:37 @ gd_mono_connect_signal_awaiter()
<Stack Trace> Godot.NativeInterop.NativeFuncs.generated.cs:108 @ Godot.Error Godot.NativeInterop.NativeFuncs.godotsharp_internal_signal_awaiter_connect(IntPtr , Godot.NativeInterop.godot_string_name& , IntPtr , IntPtr )
SignalAwaiter.cs:18 @ Godot.SignalAwaiter..ctor(Godot.GodotObject , Godot.StringName , Godot.GodotObject )
GodotObject.base.cs:174 @ Godot.SignalAwaiter Godot.GodotObject.ToSignal(Godot.GodotObject , Godot.StringName )
InteractionManager.cs:88 @ void InteractionManager+<_Input>d__15.MoveNext()
:0 @ void System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start<TStateMachine >(TStateMachine& )
:0 @ void InteractionManager._Input(Godot.InputEvent )
Node.cs:2075 @ Boolean Godot.Node.InvokeGodotClassMethod(Godot.NativeInterop.godot_string_name& , Godot.NativeInterop.NativeVariantPtrArgs , Godot.NativeInterop.godot_variant& )
CanvasItem.cs:1374 @ Boolean Godot.CanvasItem.InvokeGodotClassMethod(Godot.NativeInterop.godot_string_name& , Godot.NativeInterop.NativeVariantPtrArgs , Godot.NativeInterop.godot_variant& )
Node2D.cs:516 @ Boolean Godot.Node2D.InvokeGodotClassMethod(Godot.NativeInterop.godot_string_name& , Godot.NativeInterop.NativeVariantPtrArgs , Godot.NativeInterop.godot_variant& )
InteractionManager_ScriptMethods.generated.cs:66 @ Boolean InteractionManager.InvokeGodotClassMethod(Godot.NativeInterop.godot_string_name& , Godot.NativeInterop.NativeVariantPtrArgs , Godot.NativeInterop.godot_variant& )
CSharpInstanceBridge.cs:24 @ Godot.NativeInterop.godot_bool Godot.Bridge.CSharpInstanceBridge.Call(IntPtr , Godot.NativeInterop.godot_string_name* , Godot.NativeInterop.godot_variant** , Int32 , Godot.NativeInterop.godot_variant_call_error* , Godot.NativeInterop.godot_variant* )
我不知道我的信号名称是否正确,我已经try 了所有方法,但似乎都不起作用.我引用的信号来自名为DialogueManager EventHandler的对话管理器,但显然DialogueManager不是信号名称.
在这一点上,我不知道我是否在朝着正确的方向前进,是否只是简单地没有在C#API中实现我正在寻找的东西,或者可能我犯了一个简单的拼写错误.有什么 idea 吗?