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