【问题标题】:How to get a node in another scene godot?如何在另一个场景godot中获取节点?
【发布时间】:2021-12-26 07:04:49
【问题描述】:

我正在制作一个包含多个场景的游戏,并且需要具有 get_node(来自另一个场景的节点)的变量,但我不知道如何从另一个场景中获取节点。

【问题讨论】:

  • 不,它没有,为了澄清,我想从那个场景中获取一个节点。
  • 另一个场景可能没有被实例化。可能会被实例化。并且可能会被多次实例化。这些实例可能在场景树中,也可能不在场景树中。你到底想做什么?
  • var bullet = preload("res://Bullet.tscn") func _ready(): #var bulletnode = bullet.get_node("Bullet") #bulletnode.connect("a1", self , "a1") #func a1(): #create_planet() 这试图接收信号 a1 扩展 RigidBody2D 信号 a1(value, other_value) func _on_Area2D_area_entered(area): if area.is_in_group("planet"): self. queue_free() emit_signal("a1") 这会发出信号

标签: godot gdscript


【解决方案1】:

如果我理解正确,您想连接到来自另一个场景中节点的信号。


直接方法可行:

const bullet := preload("res://Bullet.tscn")

func create_bullet() -> void:
    var instance := bullet.instance()
    instance.connect("hit", self, "method")
    get_parent().add_child(instance)
    # etc

func method() -> void:
    # whatever
    pass

但是,这并不总是很方便。


为了进一步解耦代码,我建议使用信号总线。

洞察力是对象可以发出其他对象的信号。因此,如果您有一个每个人都可以参考的通用对象,您就可以将信号放在那里。

要拥有一个所有人都可以引用的对象,请创建一个autoload (singleton)。你可以叫它SignalBus

在自动加载中有一个脚本,您可以在其中定义信号。例如:

signal hit

然后在你需要发出信号的地方,这样做:

SignalBus.emit_signal("hit")

要连接到您需要接收它的位置,请执行以下操作:

func _ready() -> void:
    SignalBus.connect("hit", self, "method")

func method() -> void:
    # whatever
    pass

由于每个场景都可以引用自动加载,因此它们中的任何一个都可以发射并且它们中的任何一个都可以接收信号。他们不需要互相认识。

【讨论】:

  • 是的!谢谢我使用直接方法,我遇到的唯一问题是当我启动它时它会创建一个不动的子弹。如果您也能提供帮助,那就太好了。
  • @T-Rex 作为发射它的代码的一部分,每个子弹都必须完成。如果需要信号的代码在发射子弹的脚本中,那很好。但如果它在其他地方,则会导致进一步的复杂性(发射子弹的代码也需要与其他地方的代码进行通信)。因此,信号总线(也称为事件总线)更好,除了最简单的情况。
  • 我的意思是,当我启动游戏时,有一颗子弹不动,射击仍然可以正常工作。这里生病发送我的代码:
  • 扩展 KinematicBody2D 导出 (int) var speed = 100 var target = Vector2() var velocity = Vector2() var bullet_speed = 1000 var bullet = preload("res://Bullet.tscn") var planet = preload("res://Planet.tscn") var RNG = RandomNumberGenerator.new() func _ready(): create_planet() func call_create_planet(): create_planet()
  • func _physics_process(delta): target = get_global_mouse_position() velocity = position.direction_to(target) * speed if position.distance_to(target) > 10: velocity = move_and_slide(velocity) look_at(get_global_mouse_position() ) 如果 Input.is_action_just_pressed("click"): fire()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多