Godot 场景树及常见调用顺序

Godot场景树func调用顺序

-Root

    -Child1

        -GrandChild1

    -Child2


 后面接的数字代表当时子节点数

init时不能获取name

 

 init0

 init0

 init0

 init0

 

Root enter tree!2

Child1 enter tree!1

GrandChild1 enter tree!0

Child2 enter tree!0


GrandChild1 ready!0

Child1 ready!1

Child2 ready!0

Root ready!2


Child2 exit tree!0

GrandChild1 exit tree!0

Child1 exit tree!1

Root exit tree!2


可以看到-enter tree
自上往下,并且必须子节点全部enter tree后才能继续下一个节点,exit tree顺序相反。ready则是最上面的最子节点先完成,然后是父节点。只有一个node的所有子节点全部ready后,父节点ready,然后才会向下继续。

_ready函数

_ready()函数只在节点第一次添加入树内触发,如果想在节点移除再添加后仍旧触发_ready(),请手动调用request_ready(),注意,该方法不会立即被调用,但会在节点再次添加到场景树时自动触发ready的调用
onready在_ready前,onready的节点进入树内时调用
使用tool关键字后,节点在创建时调用(后面切换scenetab不再调用)

_enter_tree函数

进入树内时调用
使用tool关键字后,切换scenetab时调用

添加子节点

添加子节点无需父节点在树中,但是被添加的节点_enter_tree不会执行,只有父节点进入树内后,enter_tree,ready等才会依次开始执行

从场景树移除节点

使用remove_child(node)移除节点,注意此时节点并未删除,只是不在场景树内,相关函数如process不会得到执行。你可以再次使用add_child(node)将节点还原回场景树。同一个node移入和移除场景树其instance_id不变

_ready()时执行get_parent().remove_self()移除自身不会得到执行,需要配合call_deferred使用

关于remove_and_skip()--
如果写在根节点的enter_tree中,则所有子节点都会废弃。比queue_free更快。

场景树函数的启用

以下函数默认都是启用的,如果不需要(如暂停角色)可取消函数自动执行

node.set_process(!pause)

node.set_process_input(!pause)

node.set_process_internal(!pause)

node.set_process_unhandled_input(!pause)

node.set_process_unhandled_key_input(!pause)

node.set_physics_process(!pause)

node.set_physics_process_internal(!pause)

toolmode

tool mode下只切换编辑场景触发_enter_tree,编辑器首次打开场景执行_ready

tool mode下_input不能正常触发 Input function does not run in tool scripts · Issue #20319 · godotengine/godot (github.com) ,必须使用plugin,或配合plugin editor panel使用

toolscript的enter_tree, exit_tree, _process等可以正常使用





Comments

Popular posts from this blog

活在当下-从尾巴摇狗的荒谬中解放自我

Metroidvania银河恶魔城游戏开发指南(一)

折衷主义建筑