Re: [程式] Godot node/scene structure

作者: momogen (Mo光)   2021-05-05 22:39:02
推Godot 還有web版本 雖然我沒用過
補充一下血與淚
※ 引述《meowyih (meowyih)》之銘言:
: 1. Godot 裡的最基本元素是 Node,概念上等同 C++ Class
Godot的基底是Object, Node繼承Object
原始碼
object.h
class Object {
node.h
class Node : public Object {
這點很重要, Node有很多成員
如果新增的Class不需要被畫出來, 盡量避免繼承Node
離題一下, 通常新的Class也不會繼承Object 因為使用Object要自己free()
有一個繼承Object的Class Reference
Reference在沒有被使用的狀況下會自己free()
或是使用繼承Reference的Class Resource
這個Reference不是C++的Reference
在GDScript中 所有非core types(int,float...)的變數都是傳Reference 但是更離題了
: 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,
: 某個角度看還是有不同的。
instance()是Class PackedScene的成員
PackedScene 是 scene(.tscn)檔案的介面
在儲存scene的時候 PackedScene會記下這個scene中child nodes的資料*註1
如properties, connections, index 然後存成scene(.tscn)檔案
instance()時, PackedScene會用這些資料, 重新經歷new(), set()...等過程恢復原狀
PackedScene不一定要經過Editor *註2
使用 export (PackedScene) var MyNode 然後在Editor選擇檔案的過程等於是
var path:String = "res://MyNode.tscn"
var MyNode:PackedScene = load(path)
var child_node:Node = MyNode.instance()
硬是要塞成一行就是var child_node = load(path).instance()
但是建議還是檢查一下load有沒有成功
註1: 嚴格來說不是child nodes, 因為是用child node的owner來判斷要不要存起來
註2: 因為只有註1只好補一個註2, export是讓Script的變數顯示在Inspector的方式
括號內是這個變數在Inspector中顯示的型別
作者: wangm4a1 (水兵)   2021-05-05 23:14:00
作者: kyushu (蘇打綠嚇倒我了)   2021-05-06 13:23:00
感謝分享
作者: oopFoo (3d)   2021-05-08 07:56:00

Links booklink

Contact Us: admin [ a t ] ucptt.com