Godot中批量生成Stickman节点后信号响应异常求助
问题原因
你写的生成节点脚本里,Swordman是单个变量——每次生成新角色时,这个变量都会被覆盖成新实例的引用,之前生成的角色就没被保存下来。按钮触发时只会修改这个变量指向的最后一个实例,所以只有最后一个Stickman会动。
解决思路
用数组存储所有生成的Stickman实例,按钮触发时遍历数组,给每个实例设置状态。
修改后的代码
生成节点的脚本(控制按钮和生成的主脚本)
extends Node2D var Stickboi = preload("res://StickBoy.tscn") var swordmen = [] # 用数组存所有生成的角色 func _on_StickBoi_pressed(): # 实例化新角色 var new_swordman = Stickboi.instance() new_swordman.global_position = $Position/behind_allied_base.global_position add_child(new_swordman) swordmen.append(new_swordman) # 把新角色加入数组 func _on_Attack_pressed(): # 遍历所有角色,设置攻击状态 for man in swordmen: man.state = man.ATTACK func _on_Defense_pressed(): # 遍历所有角色,设置防御状态 for man in swordmen: man.state = man.DEFENSE # 可选:处理角色销毁时从数组移除,避免空引用 func remove_swordman(man): if man in swordmen: swordmen.erase(man)
Stickman节点脚本
可以删掉原来的_on_Attack_pressed和_on_Defense_pressed函数(因为现在由主脚本统一控制),如果角色会被销毁,再加个通知主脚本的逻辑:
extends KinematicBody2D var speed = 30 var velocity = Vector2.ZERO onready var enemy_base = get_node("../Position/enemy_base").global_position onready var allied_base = get_node("../Position/allied_base").global_position enum { ATTACK, DEFENSE, RETREAT } var state = DEFENSE func _physics_process(delta): match state: ATTACK: attack(delta) DEFENSE: defense(delta) func attack(delta): var direction = (enemy_base - global_position).normalized() var desired_velocity = direction * speed var steering = (desired_velocity - velocity) * delta * 2.5 velocity += steering velocity = move_and_slide(velocity) func defense(delta): var direction = (allied_base - global_position).normalized() var desired_velocity = direction * speed var steering = (desired_velocity - velocity) * delta * 2.5 velocity += steering velocity = move_and_slide(velocity) # 可选:角色销毁时通知主脚本移除自己 func _exit_tree(): get_parent().remove_swordman(self)
额外提示
- 确保按钮的
pressed信号是连接到生成节点的脚本上,而不是单个Stickman节点 - 如果需要单独控制某个Stickman,可以给每个角色加标识(比如ID),但当前需求是全局控制所有角色,数组遍历就足够
内容的提问来源于stack exchange,提问作者Jellyfish
相关产品推荐
相关产品推荐

