作者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://webptt.com/cn.aspx?n=bbs/GameDesign/M.1620225563.A.ABD.html
1F:推 wangm4a1: 推 05/05 23:14
2F:推 kyushu: 感谢分享 05/06 13:23
3F:推 oopFoo: 推 05/08 07:56