You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:40:31