godot-start/doc/demo03_lifecycle/lifecycle.md

4.6 KiB
Raw Blame History

1. 场景树

  • Nodes节点是在Godot中创建游戏的基本构建块。当一组节点被添加到树中时它被称为sence场景树被称为sence tree场景树
节点是可以表示各种专用游戏功能的对象。给定类型的节点可以显示图形播放动画或表示对象的3D模型。
该节点还包含一组属性,允许你自定义其行为。
你添加到项目中的节点取决于你需要的功能。
它是一个模块化系统,旨在为你提供构建游戏对象的灵活性。

在项目中,你添加的节点将组织为树结构。在树中,节点被添加为其他节点的子节点。
特定节点可以具有任意数量的子节点,但只能有一个父节点。

Image text

2. 帧率

  • 帧率 Framerate ,指画面每秒更新多少次 (FPS, Frames Per Second)
比如,
  FPS = 50 , 即每 20ms 秒更新一次
  FPS = 60,  约 16.7ms 秒更新一次

通过代码可以设置,要求 godot 引擎尽量以此帧率运行 ,但实际帧率还是会有偏差
Engine.target_fps = 120

Image text Image text

  • delta time上一帧的间隔
匀速移动的优化:
 var step = 0.8f * deltaTime;
其中,
   0.8f  表示每秒位移 0.8 单位

Image text Image text

3. 节点的生命周期

  • 在Godot中一个游戏的启动大致流程如下
Godot的main启动一个进程加载所需的驱动设备如渲染设备GL/GLES/Vulkan等、音频设备输入控制器设备等等

然后进入主循环加载一个自动创建的对象——SceneTree场景管理系统对象它用户管理场景图
这个对象包含一个RootViewPort节点它是一个Node该节点包含一个默认的ViewPort以便提供默认渲染的输出视口。

当用户用Godot编辑器创建一个关卡或场景文件并设置默认的启动的场景文件Godot将该场景文件的根节点附加到RootViewPort节点上
当节点进入场景树SceneTree变为活动状态。
按场景树顺序依次回调各个子节点的_init()_ready()等声明函数。

Image text Image text Image text

4. 节点的获取方式

# 获取当前节点
var currentNode1 = $"."
var currentNode2 = self

# 获取父节点
var parentNode1 = get_parent()
var parentNode2 = $"../"

# 获取子节点
var subNode1 = $SubNode2
var subNode2 = $"SubNode2"
var subNode3 = get_node("SubNode2")

# 根节点查找法,会返回节点树从上到下找到的第一个节点
var subNode4 = get_tree().root.find_node("SubNode2", true, false)

5. process和physics_process

  • 平时我们看到的动画,实际上是由很多静止的画面连续切换组成的
  • 其中每个静止的画面我们都称为一帧比如60帧的动画就是一秒播放60个静止的画面组成的动画
  • godot 的 _process 相当于 unity 的 Update
内部对代码就会在每一帧之前被执行,也就是引擎每渲染一幅的画面之前,都会执行它里面的代码
  • godot 的 _physics_process 相当于 unity 的 FixedUpdate
内部的代码会在每个物理帧之前被执行,
因为godot的物理模拟是单独进行的每次进行物理模拟的时候如计算一个刚体小球的运动轨迹每进行一次计算我们就称为是一进行了一个物理帧
而每次进行物理模拟之前都会执行_physics_process中的代码

Image text Image text Image text Image text

6. Parent和Owner

  • Parent

    • 一个节点的Parent就是场景树上它的父级
  • Owner

    • 如果不修改默认Owner的话可以把它视为节点所在场景的顶部节点如果该节点本身就是顶部节点那么它的Owner为null
  • 静态场景结构中默认的Owner

Image text

extends Node

class_name TestNode

func _ready():
	var parent_name = "NULL"
	var owner_name = "NULL"
	if get_parent() != null:
		parent_name = get_parent().name
	if owner != null:
		owner_name = owner.name
	print(name + "'s parent is <" + parent_name + "> and it's owner is <" + owner_name + ">" )
	
node_3's parent is <node_2> and it's owner is <node_0>
node_2's parent is <node_1> and it's owner is <node_0>
node_1's parent is <node_0> and it's owner is <node_0>
node_0's parent is <root> and it's owner is <NULL>
  • 动态创建的节点的Owner是null