子オブジェクトが同じ変数を共有する問題について

Today, when testing the card generation issue in the card game, I found that when using the following method to generate multiple cards, a problem occurred where each card shared the same health value. When one card’s health drops to zero, all objects disappear.
and the process of being destroyed repeats continuously, followed by an error.

extends GameScene
@onready var pre_card_scn = preload("res://卡片保存/卡片.tscn")
@onready var card_test = preload("res://卡牌对象新建测试.tscn")
var dragging_card: Card  = null
var mounse_card_offset : Vector2 = Vector2.ZERO


# Called when the node enters the scene tree for the first time.
func _ready() -> void:
	_new_card_test(Vector2(600, 500))
	_new_card_test(Vector2(700, 500))
	_new_card_test(Vector2(800, 500))
	pass # Replace with function body.



# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
	#if  dragging_card:
		#dragging_card.position = get_global_mouse_position() + mounse_card_offset
	pass
		
func _new_card_test(posititon: Vector2):
	var card_test = load("res://卡牌对象新建测试.tscn")
	var card = card_test.instantiate()
	card.position = posititon  # 设置卡牌位置
	add_child(card)
	pass



I want to find a way to generate a large number of cards to build the deck of my game. When using the Visual Studio Editor as the script, generating objects can only be done by specifying the generation path, and calling database data can only be specified by constants, which troubles me. When I tried to batch generate using the add_child method, I encountered such an error. I would like to ask the experts in the forum if there is a good solution.
If you can reply, I would be extremely grateful.

VS スクリプトを使用して複数の子オブジェクトを生成する際に、この問題を再現することはできますか?

ご提案いただいた通り、VS のスクリプトを使用して 3 つのカードオブジェクトを生成しました。今回はコンソールにエラーコマンドは表示されませんでしたが、興味深い現象が発生しました。最初のカードが破棄されると、他の 2 つのカードの破棄アニメーションも同時にトリガーされました。最初は同じことが起こると予想していましたが、破棄アニメーションの後に、そのトリガーに使用したボタンノードがその場に留まっていることに気づきました。その後、そのボタンをクリックすると、残りの 2 つのカードが初期アニメーション状態に戻りました。その後、2 番目のカードで同じ実験を繰り返したところ、同様の効果が発生しました。つまり、2 つのカードが同時に破棄アニメーションに入り、クリックすると再び初期状態に戻るというものです。しかし、最初の 2 つのカードは確かに破棄されており、これが私を混乱させました。私が設定した変数条件はそれぞれの独自の変数に基づいていたはずなのに、生成された同一の GameObject に影響を与えていたからです。




スコープをさらに絞り込み、新規の空プロジェクトで関連する変数の値の問題を実証することを提案します。この最小限の再現プロジェクトを使用してバグを報告してください。このようにすれば、このバグが修正された際に、すべての問題が解決するかもしれません。

ご提案ありがとうございます。時間ができましたら再現を試み、バグ報告として提出いたします。

偶然の試行が解決策につながる可能性があります。アニメーション内のシェーダーを編集する際、目的の溶解効果を得るために shader_parameterdissolve_value を変更した可能性があります。resource_local_to_scene を確認したところ、問題が解決しました。これは、VS スクリプトからオブジェクトを生成することで問題に対処できることを示唆していますが、この生成方法は柔軟性に欠けます。さらに、add_child() メソッドは依然としてエラーをスローします。より多くの機能や他の解決策を待つしかありません。


resource_local_to_scene は問題に対する究極の解決策ではないと思います。単に問題を回避しているに過ぎません。何らかのリソースが共有されていることが原因ではないかと感じますが、それが何なのかはまだ分かりません。なぜ異なるオブジェクト間の変数の値が互いに影響し合うのでしょうか?最小限の再現プロジェクトを提供できれば、この問題は修正可能です。

「いいね!」 1

ご提案ありがとうございます。最小限の再現プロジェクトを作成し、バグ報告セクションへ送信いたしました。