1. 节点和功能的关系
- 节点 Node ,用于实现一种功能,例如,Sprite 节点,用于图片的显示
- 一个节点的功能取决于它挂载了哪些子节点,它包含了哪些功能的子节点,就包含了对应子节点表示的功能
- 节点是可选的,可以添加、可以删除,就代表添加哪些功能,删除哪些功能
- 先创建一个空的节点,再选择需要的节点
有一个player节点,给player节点挂载一个sprite节点,用来显示一张图片
再挂载一个rigidbody2d节点,把它表示成一个刚体的节点,给player赋予刚体的功能
![![[Pasted image 20240415140522.png]]](https://i-blog.csdnimg.cn/blog_migrate/7f006d84b0e28bcc189cd60addfe08d3.png)
- 先把node2d更改类型
![![[Pasted image 20240415140542.png]]](https://i-blog.csdnimg.cn/blog_migrate/3b6cc999f43a2a858571d5a60e0a5b02.png)
在下面挂载一个node2d节点,命名为player
![![[Pasted image 20240415140632.png]]](https://i-blog.csdnimg.cn/blog_migrate/0828020a79e4853ac5124341d6af4885.png)
![![[Pasted image 20240415140720.png]]](https://i-blog.csdnimg.cn/blog_migrate/8ef76c5e810d2b3d6b5edb8ba20658af.png)
- 再挂载一个图片,说明这个节点是有图片要显示的
- 给player增加一个刚体的功能,继续添加子节点
![![[Pasted image 20240415140928.png]]](https://i-blog.csdnimg.cn/blog_migrate/f8990bfc7f1ad5014f4063daca242e99.png)
![![[Pasted image 20240415140956.png]]](https://i-blog.csdnimg.cn/blog_migrate/5b7b84331e7dad0923a03ef3c3a8ea25.png)
- 这里提示需要再添加一个碰撞体
![![[Pasted image 20240415141050.png]]](https://i-blog.csdnimg.cn/blog_migrate/1282724b8b0dca02225452e1001b3261.png)
![![[Pasted image 20240415141107.png]]](https://i-blog.csdnimg.cn/blog_migrate/abf63f43f1455da8f474e737fb9a439c.png)
-
提示需要给碰撞体选择一个形状
![![[Pasted image 20240415141140.png]]](https://i-blog.csdnimg.cn/blog_migrate/51a83885fee0b2e579e24daaecb8ce21.png)
-
在右边选择一个长方体的样式
![![[Pasted image 20240415141232.png]]](https://i-blog.csdnimg.cn/blog_migrate/56f26736f5845e71a16772aab92a677e.png)
-
再添加一个remotetransform2d
把它关联到刚才的sprite节点
![![[Pasted image 20240415141332.png]]](https://i-blog.csdnimg.cn/blog_migrate/1031f575273d9bed31dcb83a3f5ce358.png)
现在就给player添加了一个刚体的功能
运行这个场景,就会发现player节点会下落
在场景中鼠标左键按住,从右下往左上划,选中player中的所有结点,然后可以拖动改变位置
如果不想要这个功能了,可以删除rigidbody2d节点
在Godot中所有的操作都是基于节点的,节点就是功能,功能就是节点
2. Node节点
- Node节点,是基类节点,所有节点都会继承Node节点,所以其它类型都包含Node节点的功能
- Node节点是最核心的节点,所有其他类型节点都是由Node节点派生出来的
当新建一个场景的时候,会默认创建一个node2d节点
把它改变成node节点
1. Editor Description
在右边检查器里面,node节点第一个功能是可以往里面写描述,相当于注释
![![[Pasted image 20240415143048.png]]](https://i-blog.csdnimg.cn/blog_migrate/ab4c79d9475f219756a1fa4f7eabc288.png)
2. Script
node节点最主要的功能就是可以挂载脚本
![![[Pasted image 20240415143142.png]]](https://i-blog.csdnimg.cn/blog_migrate/93311ce684ee51691d0fe59874d3928c.png)
Script的属性就是挂载脚本
![![[Pasted image 20240415143217.png]]](https://i-blog.csdnimg.cn/blog_migrate/12fca4a0b167d32bcf7b762ff76f61f2.png)
左上角这里点击创建脚本,会自动挂载到node节点上
![![[Pasted image 20240415143341.png]]](https://i-blog.csdnimg.cn/blog_migrate/08317531a3cac88468b54e549ce8b99d.png)
点击添加脚本
![![[Pasted image 20240415143428.png]]](https://i-blog.csdnimg.cn/blog_migrate/05e03b6a39b6ebb69b049946f77217bd.png)
输入print("hello")
点击运行当前场景,发现控制台输出了一个hello
![![[Pasted image 20240415143603.png]]](https://i-blog.csdnimg.cn/blog_migrate/0027853c830a1c489b500d664c8f1e89.png)
刚才添加的脚本会把脚本的属性赋值给Script
![![[Pasted image 20240415143759.png]]](https://i-blog.csdnimg.cn/blog_migrate/f0a6b5be2b4f19b6d0251f99d1e4d3fd.png)
可以点击解除脚本
![![[Pasted image 20240415143813.png]]](https://i-blog.csdnimg.cn/blog_migrate/a567a7961a624dc9ad9cfdabe8b7464a.png)
或者在右边的检查器node属性里面切换Script属性解除脚本
还可以将脚本拖到Script属性这里添加脚本
这些操作都可以实现
挂载好脚本以后,就可以在脚本里面写自己的逻辑
![![[Pasted image 20240415144406.png]]](https://i-blog.csdnimg.cn/blog_migrate/3e694d9e68fc4e035f3c6fba9dc26232.png)
脚本基础函数介绍
_ready函数,脚本初始化会首先调用这个方法,会在_process()这个函数之前调用,就相当于main函数,一个初始化函数
_process函数,每一帧都会调用这个函数,因为游戏是一帧一帧渲染到屏幕上的,每渲染一帧都会自动调用这个函数,可以在这个函数里面写一些游戏逻辑,也就是写逻辑的时候主要用的函数
在这里定义了一个变量,每一帧就把这个变量加1
每60帧输出一个日志
extends Node
# 脚本初始化会首先调用这个方法,会在_process()方法之前调用
func _ready():
# get_tree().paused = true
print("hello")
pass
var count = 0
# 每一帧都会调用这个方法
func _process(delta):
count = count + 1
if (count % 60 == 0):
print("node")
pass
运行这段代码
![![[Pasted image 20240415144957.png]]](https://i-blog.csdnimg.cn/blog_migrate/b01b2045db00c5064b6ad80ac51df9cb.png)
每60帧相当于大概1秒钟,可以观察到脚本的执行顺序
这两个函数是脚本最主要的函数,也是用的最多的函数
3. Process Mode
![![[Pasted image 20240415145504.png]]](https://i-blog.csdnimg.cn/blog_migrate/8a969e4dd6e29b4ad428cbb819e01d3b.png)
![![[Pasted image 20240415145658.png]]](https://i-blog.csdnimg.cn/blog_migrate/c9bdfac5b055ae0734c5f3909d7b1b4e.png)
现在一共有三个node节点
在parentnode和childnode的脚本里面都添加上面的输出hello和node的代码
parentnode里输出parentnode,childnode里输出childnode
![![[Pasted image 20240415150045.png]]](https://i-blog.csdnimg.cn/blog_migrate/be87a608996182ec605ab55df8abe5ea.png)
先默认运行
先会输出parent再输出child,也就是节点的process的执行顺序
因为parent节点是在最上面的,采用深度优先遍历的规则,就会先执行parent的process函数,执行结束以后,再执行child的process函数
当游戏暂停的时候会发生什么呢
先把child脚本的ready函数删除,保留parent节点的ready函数
不对mode进行改变
运行场景
![![[Pasted image 20240415153035.png]]](https://i-blog.csdnimg.cn/blog_migrate/8104036cfb7089bb2e82acdc026630f3.png)
parent先输出,child后输出
processmode主要是控制process函数
就是控制process函数在暂停的时候,是否去执行
- 现在child设置成inherit,parent设置成disabled
get_tree().paused = true
ready函数里的这条语句的意思是
这条代码执行过后,就会把游戏暂停掉
节点的三种可能状态有:
1. Inherit(继承) :处理与否取决于父、祖父等等节点中第一个非 Inherit 状态的节点。
2. disabled(停止) :无条件停止节点(以及 Inherit 模式的子节点)。暂停时该节点不会进行处理。
3. always(处理) :无条件处理节点(以及 Inherit 模式的子节点)。无论暂停与否,该节点都会进行处理。
- parent选择disabled模式
运行了ready里的停止游戏语句后
不会运行process函数,控制台不会打印任何东西
![![[Pasted image 20240415154214.png]]](https://i-blog.csdnimg.cn/blog_migrate/a9af0743b0dee08a779d9acacd3b54c0.png)
选择always模式
控制台会继续先打印parent后打印child
-
parent选择disabled,child选择always
理论上只有子节点会输出日志
![![[Pasted image 20240415154248.png]]](https://i-blog.csdnimg.cn/blog_migrate/70c9a5057bc8f4ed4d19a57ab9f9818a.png)
-
parent选择always,child选择disabled
这时只有父节点会输出日志
![![[Pasted image 20240415154346.png]]](https://i-blog.csdnimg.cn/blog_migrate/e44ebfcee3c75d9bd523dfb1b7cc8498.png)
4. Process Priority
process函数执行的优先级,对于子节点依然有效
遍历的顺序可以通过process函数的优先级来改变
![![[Pasted image 20240415154551.png]]](https://i-blog.csdnimg.cn/blog_migrate/373f0b5e767cab03294313a3fdf312c6.png)
这个process priority
这个优先级是里面的数字越小,优先级越高
把parent的优先级调到100,child的优先级调成1
理论上是childnode先执行
![![[Pasted image 20240415154733.png]]](https://i-blog.csdnimg.cn/blog_migrate/931493966e6b1c1f2c559d2a26f202d8.png)
对于同级节点依然生效
本文详细解释了Godot游戏引擎中节点(Node)的概念,如何通过节点实现功能如图片显示、刚体交互,并介绍了Script的挂载与使用,以及ProcessMode和ProcessPriority对节点执行顺序的影响。
2115

被折叠的 条评论
为什么被折叠?



