如何在 GDScript 中添加信号到视觉脚本

基本上,我对如何使用“检测到信号”感到有些困惑。不知何故,我在处理多键输入时遇到了问题:当我按住“方向键”时,我可以移动到任何位置,但如果我持续按住某个键,我就无法启动我设置的“冲刺动作”。它仅在我不按住任何“方向键”时才有效。基本上就是原地站立,这对玩家移动来说感觉不太好。

我有一个想法,即使用 GDScript检测按键按下并发送一个**“动作值”**,这效果不错,但我该如何在可视化脚本中检测这个声明的 GDScript 值呢? 我对此感到困惑,希望我的截图能帮助说明我想实现的目标。如果不行,为什么多键按下通常不起作用。

ps:“我知道截图中显示的是行走,而不是连接到冲刺,但我故意这样做的,因为无论我放入什么逻辑,角色都只能在原地冲刺,无法移动。”

另外,抱歉只有一张照片,我想新用户只能上传一张照片。

(˶º⤙º˶)

嘿,我在这篇帖子中做了一个简单的指南来帮助你完成这个操作!

抱歉回复晚了。我承认我已经看过这个教程以及论坛中的其他教程。我困惑的是如何将 gd 脚本中的“信号”链接到玩家根节点与可视化脚本。主要是,我在过滤信号列表中应该链接哪个“信号”来接收。2) 我是否需要通过名称将“playerAction”声明给可视化脚本?如果这很明显,请原谅,但我无论如何都看不到答案。

在其中的第 4 点中,您可以看到必须将其连接到 receive_signal,随后该名称即为您在链路条件中将要检测到的名称。

1 个赞

感谢 baz 再次进行双重检查。它现在可以工作了!!

对于那些想知道需要哪些步骤的人,以下是:

  1. 在你的视觉脚本控制的"PlayerObject"中添加一个"Child"节点对象。

→ 在我的情况下,该对象名为"NativeSignalToVS"。

  1. 将脚本附加到"Child 节点”上,→ 并命名为你喜欢的任何名称。

→ 例如:“NativeSignalToVS.gd” → gd 指的是 gd 脚本。

  1. 在你的脚本中添加以下内容:
extends Node

# 老实说,我不知道这是否必要
@onready var player:GameObject = $".."

var Action_Value := 0

# 基本上这指的是信号 Your_Name_Here(Action_Value: float)
signal playerAction(Action_Value: float)

func_ready() -> void:
 playerAction.emit(Action_Value)

func _unhandled_input(event) -> void:
 if event.is_action_pressed("Key_Dash"):
  Action_Value = 6
  playerAction.emit(Action_Value)
  print("Dash Action Initiated: ", Action_Value)

# 想知道"Key_Dash"来自哪里?Input_Map 中的"Name_of_Action"
  1. 保存后 → 点击"Child 节点”,在我的情况下再次点击"NativeSignalToVS"

→ 查看编辑器右侧,点击"Node"标签,然后点击"Signals"表格。

→ 右键单击并点击第一个包含 gd 脚本中"Your Signal Name"的项的"Connect"。

  1. 高亮显示视觉脚本对象父级,在我的情况下是"Player1_Base",然后点击"Pick",它有一个铅笔图标。

6) 在"Pick"中,确保仅高亮"Scripts Methods Only",禁用"Combatible Methods only"

  1. 点击"Attached Script",它显示类似"recieve_signal_signal_name:string……"的文字。

  2. 点击"Okay" → 然后点击"Connect"。

  3. 你应该在节点子对象的节点标签中看到"..:: receive_signal()"。

→ 它应该位于你的"Named_Signal"下方,在我的情况下是"playerAction"。

  1. 从视觉脚本父对象开始,使用你的视觉编程"箭头"指向指定的框(例如 Dash)。

例如:Standing_Still —————→ Dash

在 (——→) 连接的箭头中添加"SignalDetected"。

现在设置"Signal Filter" → 无过滤器。

Argument Type → 数值。

Condition Numeric → =。

Comparison Target → 常量值。

Constant Value → 你 gd 脚本中分配的任何值,在我的情况下是"6"。

  1. 点击"Okay",如果玩家处于静止状态,它应该可以工作,你应该能够使用值"6"或你分配的任何值执行某些操作。

对我来说是这样工作的,我不知道这是否是完全正确的方法,但它能工作,这很好 :slight_smile:

现在如果有人能告诉我为什么……我无法在行走时启动冲刺,请告诉我。

例如:

Player_Still ——————→ PlayerWalking —————–> “Player_Still_Shortcut”

“Player_Still_Shortcut” ——————> PlayerDashing //可以从静止状态冲刺

“Player_Walking_Shortcut” ————→ PlayerDashing //如果我处于行走状态就无法冲刺?

PlayerActionValues:

0 => 静止

PlayerActionValues >0 且 PlayerActionValues<5 => “Player Walks”

Player Action Value = 6 //使玩家在静止时冲刺,但在行走时不行,即使在我的控制台中值 6 当前正在被调用。

如果我在信息过载方面做得不对,我很抱歉,我只是不明白,即使只是直接使用数字而没有按键,我仍然无法在行走 + 冲刺的同时进行,只能静止……