Re: [程式] Godot node/scene structure

看板GameDesign (遊戲設計)作者 (摸光)時間3年前 (2021/05/05 22:39), 編輯推噓3(300)
留言3則, 3人參與, 3年前最新討論串2/2 (看更多)
推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

05/05 23:14, 3年前 , 1F
05/05 23:14, 1F

05/06 13:23, 3年前 , 2F
感謝分享
05/06 13:23, 2F

05/08 07:56, 3年前 , 3F
05/08 07:56, 3F
文章代碼(AID): #1WaguRgz (GameDesign)
討論串 (同標題文章)
文章代碼(AID): #1WaguRgz (GameDesign)