type
status
date
slug
summary
tags
category
icon
password
对于一个游戏引擎来讲,要模拟现实,最重要的就是引擎的循环逻辑,有一个一直在执行的循环
类似于 unity 的生命周期,godot 也提供了相应的接口
📝 基础解释
Godot 引擎的生命周期主要涉及到几个关键的回调函数,这些函数在游戏或应用程序的不同阶段被调用,以管理资源、处理输入、更新游戏状态等。以下是 Godot 生命周期的主要阶段:
- _Init ():这是节点被创建后立即调用的第一个方法。它用于初始化变量和设置状态,但此时节点还没有进入场景树。
- _Ready ():当节点及其所有子节点都被添加到场景树中后,会调用此方法。这是进行初始化操作的理想位置,比如设置节点引用或调用其他节点的方法。
- _Process (delta):这个方法在每一帧都会被调用,无论场景是否正在播放。
delta
参数表示自上一帧以来经过的时间(以秒为单位)。这里是处理游戏逻辑的好地方。
- _PhysicsProcess (delta):与
_Process(delta)
类似,但是它遵循物理帧的节奏调用,适用于处理物理相关的逻辑。
- _Input (event):当有输入事件发生时,如键盘按键、鼠标移动或触摸屏幕时,会调用此方法。可以在这里处理用户输入。
- _EnterTree () 和 _ExitTree ():当节点被添加到场景树时,
_EnterTree()
会被调用;当节点从场景树中移除时,_ExitTree()
会被调用。这些方法适合执行需要在节点成为场景树一部分时进行的操作。
- _Draw ():对于绘制自定义图形的节点(如 2 D 游戏中的 CanvasItem),
_Draw()
方法在节点需要重新绘制时被调用。
- _PhysicsPreProcess (delta) 和 _PhysicsPostProcess (delta):这两个方法分别在物理处理之前和之后调用,允许你在物理步骤的不同阶段执行代码。
- _UnhandledInput (event) 和 _UnhandledKeyInput (event):当输入事件未被
_Input(event)
处理时,会调用这些方法。这对于处理全局输入事件很有用。
- _Dispose ():当节点即将被销毁时调用,用于清理资源。
这些方法提供了对游戏或应用程序生命周期的细粒度控制,允许开发者根据需要在正确的时间执行代码。在开发 Godot 项目时,合理利用这些生命周期方法可以帮助你更有效地管理游戏的状态和资源。
与 unity 对比
Unity 和 Godot 都是流行的游戏开发引擎,它们各自有着独特的生命周期管理方式。通过比较 Unity 的生命周期方法和 Godot 的生命周期方法,可以帮助熟悉 Unity 的开发者更好地理解 Godot 的工作流程。
Unity 生命周期的关键方法:
- Awake ():在加载脚本实例时调用。
- Start ():在脚本启用之前,Start 在第一帧更新之前调用。
- Update ():每帧调用一次,用于常规更新。
- FixedUpdate ():每个固定帧率帧调用,用于物理更新。
- LateUpdate ():在所有 Update 函数调用后调用。
- OnEnable () 和 OnDisable ():当对象变得可用或不可用时调用。
- OnDestroy ():当对象被销毁时调用。
Godot 生命周期的关键方法:
- _Init ():类似于 Unity 的构造函数,但更多用于变量初始化而不是游戏逻辑。
- _Ready ():类似于 Unity 的 Start (),在节点及其子节点进入场景树时调用,用于初始化代码。
- _Process (delta):与 Unity 的 Update () 相似,每帧调用,用于常规更新。
- _PhysicsProcess (delta):类似于 Unity 的 FixedUpdate (),按物理帧调用,用于物理相关更新。
- _EnterTree () 和 _ExitTree ():没有直接的 Unity 等价物,但它们类似于 OnEnable () 和 OnDisable (),分别在节点进入和退出场景树时调用。
- _Input (event):处理输入事件,Unity 中通常在 Update () 或特定的输入事件处理函数中处理输入。
- _Draw ():用于自定义绘制,Unity 中可能通过 OnGUI () 或自定义渲染代码实现。
- _Dispose ():类似于 Unity 的 OnDestroy (),用于清理资源。
通过这种比较,可以看出 Godot 和 Unity 在生命周期管理上有一定的相似性,但也有它们各自的特点。例如,Godot 的
_Ready()
方法和 Unity 的 Start()
方法都是初始化代码的好地方,而 Godot 的 _Process(delta)
和 Unity 的 Update()
方法都是处理常规更新的地方。理解这些相似性和差异有助于 Unity 开发者更快地适应 Godot的开发环境。一些需要注意的地方
Q :godot的这套生命周期是不是只有node类型的节点才会执行
A:是的,Godot中的生命周期方法主要与
Node
类及其子类相关。在Godot中,Node
是场景树中所有元素的基类,几乎所有的游戏对象都是 Node
的子类,包括2D和3D的可视化对象、脚本、定时器等。这意味着这些生命周期方法(如 _Ready()
, _Process(delta)
, _PhysicsProcess(delta)
, _Input(event)
等)是为 Node
类及其派生类设计的,用于管理节点的行为和游戏逻辑。当你在Godot中创建游戏或应用程序时,你会操作许多不同类型的节点,每个节点都可以重写这些生命周期方法来执行特定的任务,比如初始化资源、处理输入、更新状态等。这种设计使得在Godot中管理游戏的状态和行为变得非常灵活和强大。
Q :是不是类似于unity万物基于gameobject的思想
A:是的,Godot中万物基于
Node
的概念与Unity中万物基于 GameObject
的思想有相似之处。这两种设计都采用了一种面向对象的层次结构,用于构建和管理游戏世界中的各种元素。Unity中的GameObject
在Unity中,
GameObject
是所有场景对象的基础。它本身几乎没有任何功能,但可以通过添加各种Component
(如Transform
、Renderer
、Collider
等)来扩展其功能。这种设计允许开发者灵活地构建和组合游戏对象的行为和外观。Godot中的Node
与此类似,Godot的
Node
系统是其场景树结构的基础。Node
可以包含其他Node
,形成一个树状结构,这允许开发者构建复杂的游戏场景和逻辑。不同类型的Node
提供了不同的功能,比如Sprite
用于显示2D图像,RigidBody
用于物理模拟等。通过组合不同的Node
,开发者可以创建出丰富多样的游戏元素。相似性与差异
- 相似性:两者都采用了组件化的思想,允许开发者通过组合不同的构建块(Unity中的
Component
或Godot中的Node
)来创建游戏对象。
- 差异:Unity的
Component
系统更侧重于给单个GameObject
添加多种功能,而Godot的Node
系统则侧重于通过节点的层次结构来组织游戏逻辑和场景结构。
尽管两者在实现细节上有所不同,但这种将游戏世界构建为一系列对象或节点的基本思想,在很大程度上是相似的,都旨在提供灵活性和可扩展性,以支持复杂游戏逻辑和场景的构建。
- 作者:BWmol233
- 链接:http://www.bwmol234.fun/article/GODOTDev240812-1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。