[程式] Godot node/scene structure

看板GameDesign (遊戲設計)作者 (meowyih)時間3年前 (2021/04/28 23:06), 3年前編輯推噓9(9011)
留言20則, 10人參與, 3年前最新討論串1/2 (看更多)
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() 的說明 - 雖然我也不知道誰會看,就加減發一下吧 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.113.185 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1619622388.A.A42.html

04/28 23:32, 3年前 , 1F
推godot
04/28 23:32, 1F
真的很棒,又輕又快又精美, 不像某引擎要使用還要硬綁他家的賣場, 寫出來的遊戲也不用硬要擺引擎 logo 上去, 編輯器還是綠色軟體連安裝都不用讓人覺得很乾淨, (我就是在吐槽那個裝完後在背景偷吃資源的某引擎XD) 真希望能多一點人用 (笑) ※ 編輯: meowyih (36.231.100.217 臺灣), 04/29/2021 07:11:41

04/29 08:16, 3年前 , 2F
雖然Unity為人詬病很多.但是他的歷史定位是無可動搖的.
04/29 08:16, 2F

04/29 08:17, 3年前 , 3F
要評Unity要回到十年前的引擎市場.
04/29 08:17, 3F

04/29 08:18, 3年前 , 4F
他能夠把Unreal打到變更販售策略 事前是沒人可以預測到
04/29 08:18, 4F

04/29 08:40, 3年前 , 5F
能把程式分離,讓不懂程式的也能輕易操作在開發上真的很強
04/29 08:40, 5F

04/29 08:41, 3年前 , 6F
不過這也多了不少 "大不了我自己用unity做" "用unity應該
04/29 08:41, 6F

04/29 08:42, 3年前 , 7F
能輕鬆做出來" "我會點unity你就該閉嘴"的非程式人員..
04/29 08:42, 7F

04/29 08:43, 3年前 , 8F
(事實上是跟以前flash狀況一樣,新手也能做點東西出來,但
04/29 08:43, 8F

04/29 08:43, 3年前 , 9F
要做出能用的,還是需要懂程式..)
04/29 08:43, 9F

04/29 09:11, 3年前 , 10F
看完了,感謝分享,雖然還沒用過Godot,不過看完理解不少
04/29 09:11, 10F

04/29 09:42, 3年前 , 11F
Godot真的輕到嚇人 但U家真的開啟自製遊戲大時代
04/29 09:42, 11F

04/29 09:43, 3年前 , 12F
希望godot能發展出自己的生態圈
04/29 09:43, 12F

04/29 09:45, 3年前 , 13F
推 和c++對比是比較奇怪 應該是和unity比
04/29 09:45, 13F

04/29 10:29, 3年前 , 14F
推 簡單易懂
04/29 10:29, 14F

04/29 11:28, 3年前 , 15F
Unity有他的歷史定位阿 但是就事論事 批評也都有道理
04/29 11:28, 15F

04/29 11:59, 3年前 , 16F
well.... Logo的問題就用pro版就解了.
04/29 11:59, 16F

04/29 12:28, 3年前 , 17F

04/29 12:30, 3年前 , 18F
最近買的 Rogue State Revolution 使用Godot
04/29 12:30, 18F

05/05 19:32, 3年前 , 19F
推 11可以用var child_node = load("res://MyNode.tscn")
05/05 19:32, 19F

05/05 19:32, 3年前 , 20F
.instance()
05/05 19:32, 20F
文章代碼(AID): #1WYNdqf2 (GameDesign)
討論串 (同標題文章)
文章代碼(AID): #1WYNdqf2 (GameDesign)