[程式] Godot node/scene structure

楼主: meowyih (meowyih)   2021-04-28 23:06:26
Node/Scene structure in Godot
C++ Programmer Perspective
写给熟悉 C++,且依文件写完 Godot 的 2D范例游戏后,
依然对 node/scene 的观念感觉有点混乱的人看的
1. Godot 里的最基本元素是 Node,概念上等同 C++ Class
2. 当我们为一个 Node 附加 GDScript 时,
就是准备在 script 里面覆写 (override) 原来的
member function 或增加 member variable,
也就是继承的概念。
3. 当我们在 Godot 接口左边的 Scene Panel 加一个 Node 时,
实际上是同时宣告 (declare) 并实体化 (instance) 了一个 Class,
跟 C++ 不同,在 Scene Panel 被实体化的物件名可以
和 Class 名字一样。不过只限于 Scene Panel,
因为在 script 里面是不可以用 Node 名字当变量名的。
4. 所有的 Node 都是可以被执行的,如果要让执行有意义,
以下是比较常被覆写 (override) 的 member function
- func _init()
- func _ready()
- func _process(delta)
- func _physics_process(delta)
- func _input(event)
- func _enter_tree() # check sec8 ~ 13
- func _exit_tree() # check sec8 ~ 13
5. 每个 Node 里面都可以加入多个 Child Node,
可以想像 Node 有个 private member variable - node container。
当 Node 的如 _ready() 或 _process(delta) 等 member 被呼叫时,
Godot 会自动呼叫所有 node container 里面的同样的 member func。
*check Node.propagate_call() for similar mechanism
6. Scene 指的就是 root Node,root Node 与所有的 child Nodes
的集合叫 scene tree 或一样叫 scene。
一个 project 里面可以有很多的 scene,
指定第一个被执行的 scene (i.e. entry point) 的方法
project -> project settings -> application -> run -> Main Scene
7. 每个 scene 都一定要一个对应的 *.tscn 档案,该档案不能直接编辑,
可以在左下的 FileSystem 找到。
8. 在 Coding time 要在某个 Node 下加入 API 中定义的 Node,
在 node 上右点鼠标选 "add child node" 再选择 Node 类型。
9. 在 Coding time 要在某个 Node 下加入自定义的 root Node (i.e. scene)
在 node 上右点鼠标选 "instance child scene" 再选择 scene *.tscn。
10. 在 Runtime (in script) 要在某个 Node 下加入 API 中定义的 Node,
在 Node's script 下写
var child_node = Node.new()
add_child( child_node )
11. 在 Runtime (in script) 要在某个 Node 下加入自定义的 root Node (i.e. scene)
在 Node's script 下先宣告一个 PackedScene name
export (PackedScene) var MyNode
然后把 MyNode 这名字跟你要实体化的 scene 做连结,
连结方法是到右上方的 Inspector panel 里 Script Variable -> MyNode
连结完后再回到 script 写
var child_node = MyNode.instance()
add_child( child_node )
*从 C++ 的角度,instance() 和 new() 名字不一样,
但做得事好像没差别?
有人对这疑惑的说法是 new() 是实体化一个 Class
instance() 除了实体化 Class,还实体化了 scipt
内定义的 member variable 与 node 里面的 child nodes,
某个角度看还是有不同的。
12. Parent Node 要取得 Child Node
get_child( path )
Coding time 加入的 Node's path 可以参照 Scene Panel。
Runtime 加入的 Node's path 可以在 add_child() 结束后
用 get_path() 取得,不过与其记下路径,
不如把 child node reference 存下来就好。
13. 要移除一个 Child Node,
最常用的方法是 Child Node 呼叫自己的 queue_free() func,
当 Child Node 自行消灭时,Parent Node 也会自动将之移除。
另一个方法是 Parent Node 呼叫 remove_child(ref),
不过这不会消灭 Child Node,如果 code 同时有这二种方法存在,
有可能会造成 reference 指向一个已经释放的 Object 的问题。
*参考 queue_free() 的说明
-
虽然我也不知道谁会看,就加减发一下吧
作者: oopFoo (3d)   2021-04-28 23:32:00
推godot
作者: NDark (溺于黑暗)   2021-04-29 08:16:00
虽然Unity为人诟病很多.但是他的历史定位是无可动摇的.要评Unity要回到十年前的引擎市场.他能够把Unreal打到变更贩售策略 事前是没人可以预测到
作者: LayerZ (無法如願)   2021-04-29 08:40:00
能把程式分离,让不懂程式的也能轻易操作在开发上真的很强不过这也多了不少 "大不了我自己用unity做" "用unity应该能轻松做出来" "我会点unity你就该闭嘴"的非程式人员..(事实上是跟以前flash状况一样,新手也能做点东西出来,但要做出能用的,还是需要懂程式..)
作者: MaxWei (想下象棋可以找我喔~)   2021-04-29 09:11:00
看完了,感谢分享,虽然还没用过Godot,不过看完理解不少
作者: triplee (none)   2021-04-29 09:42:00
Godot真的轻到吓人 但U家真的开启自制游戏大时代希望godot能发展出自己的生态圈
作者: wangm4a1 (水兵)   2021-04-29 09:45:00
推 和c++对比是比较奇怪 应该是和unity比
作者: SecondRun (雨夜琴声)   2021-04-29 10:29:00
推 简单易懂
作者: chchwy (mat)   2021-04-29 11:28:00
Unity有他的历史定位阿 但是就事论事 批评也都有道理
作者: NDark (溺于黑暗)   2021-04-29 11:59:00
well.... Logo的问题就用pro版就解了.
作者: cnoize (泥巴星球Server)   2021-04-29 12:28:00
https://github.com/heybechill/godot-scn-to-tscn最近买的 Rogue State Revolution 使用Godot
作者: momogen (Mo光)   2021-05-05 19:32:00
推 11可以用var child_node = load("res://MyNode.tscn").instance()
作者: DrFord (MIB)   2021-05-09 22:48:00
unity是免费的就已经很好了(对比autodesk公司)

Links booklink

Contact Us: admin [ a t ] ucptt.com