作者momogen (摸光)
看板GameDesign
標題Re: [程式] Godot node/scene structure
時間Wed May 5 22:39:02 2021
推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中顯示的型別
--
Sent from my B.B.Call
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.32.40.146 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/GameDesign/M.1620225563.A.ABD.html
推 wangm4a1: 推 05/05 23:14
推 kyushu: 感謝分享 05/06 13:23
推 oopFoo: 推 05/08 07:56