gdscriptからビジュアルスクリプトにシグナルを追加するにはどうすればいいですか?

基本的に**「シグナル検出」の使い方がよくわかりません。なぜかマルチキー入力問題が発生しています。「方向キー」を押しながらならどこでも移動できるのですが、キーを押したままにすると設定した「ダッシュアクション」**を開始できません。方向キーを何も押していない場合のみ機能します。つまり、キャラクターが静止している状態になり、プレイヤーの動きとしては心地よくありません。

GDScriptを使ってキー入力を検出し、**「アクション値」**を送信するというアイデアはありますが、このGDScriptで宣言された値をビジュアルスクリプトでどのように検出すればよいのかわかりません。私のスクリーンショットが何を達成しようとしているかを理解する助けになれば幸いです。もしそれでもわからない場合は、なぜマルチキー入力が一般的に機能しないのでしょうか。

ps: 「スクリーンショットではダッシュに接続されていない歩行が表示されていますが、これは意図的なものです。どんなロジックを試しても、キャラクターは移動せずにダッシュするだけだったからです。」

また、1枚の写真しかアップロードできないようですので、1枚だけ申し訳ありません。

(˶º⤙º˶)

こんにちは、まさにそれを行うための簡単なガイドをこの投稿に作成しました!

返信が遅くなり申し訳ありません。このチュートリアルおよびこのフォーラムの他のチュートリアルも確認しましたが、gd スクリプトからプレイヤーのルートへの「シグナル」をビジュアルスクリプティングとどのようにリンクするかについて混乱しています。主に、受信するために「シグナル」のフィルタリングリストのどの「シグナル」をリンクすればよいのか。2) 「playerAction」をビジュアルスクリプトに名前によって宣言する必要がありますか?おそらく自明なことかもしれませんが、どうしても答えが見つかりません。

その#4では、それをreceive_signalに接続し、その名前はリンク条件で検出する名前であることがわかります。

「いいね!」 1

baz 氏に再確認していただきありがとうございます。動作しました!!

手順がわからない方のために

  1. ビジュアルスクリプトで制御されている"Player0bject"に"Child"ノードオブジェクトを追加します。

→私の場合、オブジェクト名は"NativeSignalToVS"です。

  1. "Child node"にスクリプトをアタッチし、任意の名前を付けます。

→例:“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 node"をクリックします。私の場合は再度"NativeSignalToVS"です。

→エディタの右側にある"Node"タブをクリックし、次に"Signals"テーブルをクリックします。

→最初の項目で"YOur Signal Name"(gd スクリプトのもの)があるものを右クリックし、"Connect"をクリックします。

  1. ビジュアルスクリプトオブジェクトの親を強調表示します。私の場合は"Player1_Base"でした。次に"PIck"という単語をクリックします(鉛筆アイコンがあります)。

  2. "Pick"で"Scripts Methods Only"のみが強調表示され、"Combatible Methods only"が無効になっていることを確認します。

  3. "Attached Script"をクリックします。"recieve_signal_signal_name:string"などの文字が表示されます。

  4. "Okay"をクリックし、次に"Connect"をクリックします。

  5. ノードの子オブジェクトのノードタブに"..:: receive_signal()"が表示されるはずです。

→私の場合、"playerAction"という"Named_Signal"の下にあるはずです。

  1. ビジュアルスクリプトの親オブジェクトに戻り、ビジュアルプログラミングの"Arrows"を使用して、指定されたボックス(例:“Dash”)を指します。

例: Standing_Still —————→ Dash

(——→) で接続された矢印に"SignalDetected"を追加します。

次に"Signal Filter"を設定します → No Filter

Argument Type → Numeric

Condition Numeric → =

Comparison Target → Constant Value

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 が現在呼び出されているにもかかわらずです。

情報過多で申し訳ありませんが、単なる数値だけでキーを押さなくても、なぜ静止中のみしか歩行とダッシュを同時に行えないのかがわかりません。