关键词:Godot,4.2.2,_init(),_ready()
前言:本内容由ChatGPT回答后,经楼主整理所得,仅用于笔记。可随意转载,无需授权
【_init()是什么?】
在 Godot 中,_init() 是一个特殊的方法,用于初始化对象的属性。在实例化一个节点或对象时,_init() 会被自动调用。它类似于其他编程语言中的构造函数,当你创建一个类的新实例时,可以使用 “_init()” 来设置初始值或执行启动逻辑。
------------------------------------------------------------------------------->【基本用法】<-------------------------------------------------------------------------------
以下是 _init() 方法的基本结构和用法:
extends Node
class_name MyNode
var my_variable
# 初始化方法
func _init(some_value):
my_variable = some_value # 设置变量的初始值
func _ready():
print("MyNode is ready with value: ", my_variable)
---------------------------------------------------------------------------------->【特点】<-----------------------------------------------------------------------------------
1.参数:
·可以定义参数以便在实例化对象时传递数据。例如,上述代码中 some_value 是 MyNode 类的一个初始化参数。
2.自动调用:
·当你使用 MyNode.new(value) 创建一个新实例时,Godot 会自动调用 _init(value) 方法。
3.多态性:
·如果你的类是从另一个类继承而来的,你可以在子类中重写 _init() 方法,并通过 extends 关键字调用父类的 _init() 方法,从而实现更复杂的初始化逻辑。
------------------------------------------------------------------------------->【示例代码】<--------------------------------------------------------------------------------
父类
# Parent.gd
class_name Parent
extends Node
var parent_value
func _init(initial_value):
parent_value = initial_value
print("Parent initialized with value: ", parent_value)
子类
# Child.gd
class_name Child
Parent
var child_value
func _init(parent_value, child_value):
# 调用父类的 _init 方法
._init(parent_value) # 使用 "." 前缀调用父类方法
self.child_value = child_value
print("Child initialized with value: ", child_value)
func _ready():
print("Child ready with parent value: ", parent_value)
实例化
# Main.gd
Node
func _ready():
var my_child = Child.new(10, 20) # 传递给父类和子类的值
add_child(my_child)
---------------------------------------------------------------------------------->【总结】<-----------------------------------------------------------------------------------
1._init() 方法用于初始化对象的属性,接收参数以设置初始值。
2.它会在创建实例时自动调用,提供灵活性以配置对象行为。
3.你可以在子类中重写 _init() 方法,并通过 ._init() 调用父类的初始化逻辑,以确保父类部分的正确初始化。
【_init()和和_ready()有什么区别?】
_init() 和 _ready() 是 Godot 中两个不同的特殊方法,它们各自有不同的用途和调用时机。下面是它们之间的主要区别:
------------------------------------------------------------------------------>【 _init() 】<----------------------------------------------------------------------------------
1.目的:用于初始化对象的属性。
2.调用时机:在创建实例时自动调用,即当你使用 MyNode.new() 来实例化时,_init() 会立即执行。
3.参数:可以接受参数,以设置对象的初始状态。
4.适用场景:
·用于设定变量的初始值。
·执行任何需要在对象创建时立即完成的逻辑。
5.示例:
extends Node
class_name MyNode
var my_variable
func _init(value):
my_variable = value # 设置初始值
------------------------------------------------------------------------------>【 _ready() 】<-------------------------------------------------------------------------------
1.目的:用于处理节点准备好接收输入、开始游戏逻辑或其他动态操作。
2.调用时机:在节点添加到场景树后自动调用。这意味着所有子节点也已经准备好。
3.没有参数:这个方法不接受参数。
4.适用场景:
·处理与场景交互。
··这意味着在 _ready() 方法中,你可以编写代码来使节点与其他节点进行交互,例如访问其他节点的属性或方法。
··例如,如果你的节点需要获得一个场景中另一个节点的引用,以便与之沟通或执行某些操作,那么你通常会在 _ready() 中
进行这些操作,因为此时所有的节点都已被添加到场景树中。
·启动逻辑。
··启动逻辑指的是在对象准备好之后,初始化某些过程或动画、开始游戏循环等。
··在 _ready() 中,你可以开始播放动画、设置初始界面状态、创建定时器等等,这些都是在节点完全加载后才能安全进行
的。
·初始化可能依赖于其他节点或场景状态的情况。
5.示例:
extends Node
class_name MyNode
func _ready():
print("MyNode is ready!")
---------------------------------------------------------------------------------->【总结】<-----------------------------------------------------------------------------------
特性 | _init() | _ready() |
---|---|---|
调用时机 | 实例化 | 节点添加到场景数后 |
用途 | 初始化属性 | 设置与其他节点的交互、启动游戏相关的逻辑 |
参数 | 可接受参数 | 无参数 |
------------------------------------------------------------------------------->【使用建议】<--------------------------------------------------------------------------------
1.使用 _init():
·当你希望在对象创建时设置一些重要的初始状态或数据时。
2.使用 _ready():
·当你需要在节点完全初始化并准备好与其他节点交互时执行代码,比如访问其他节点、启动动画等。
3.为了更好地理解,以下是补充示例:
_init() 示例
class_name MyNode
Node
var speed
func _init(initial_speed):
speed = initial_speed # 设置初始速度
_ready() 示例
class_name MyNode
Node
var target_node
func _ready():
target_node = get_node("TargetNode") # 访问场景树中的目标节点
target_node.start_animation() # 启动目标节点的动画