【Godot_4.2.2】_init()和_ready()的区别

关键词: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()  # 启动目标节点的动画
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
godot中的`class_name`关键字用于为类注册一个新的类型,并在编辑器中显示自定义图标。使用`class_name`关键字时,可以指定可选的图标路径,以使其在编辑器中显示。 以下是一个示例: ```gd # Item.gd extends Node class_name Item, "res://interface/icons/item.png" ``` 这个示例中,`Item.gd`文件中的类被注册为一个新的类型,并且使用`"res://interface/icons/item.png"`作为它在编辑器中的图标。 另外,godot中的类文件可以包含内部类。内部类使用`class`关键字来定义,并可以使用`ClassName.new()`函数来实例化。 以下是一个示例: ```gd # Inside a class file. # An inner class in this class file. class SomeInnerClass: var a = 5 func print_value_of_a(): print(a) # This is the constructor of the class file's main class. func _init(): var c = SomeInnerClass.new() c.print_value_of_a() ``` 在这个示例中,主类文件中包含了一个内部类`SomeInnerClass`,可以通过`SomeInnerClass.new()`来实例化并调用它的方法。 此外,以文件形式存储的类在godot中被视为资源。要在其他类中访问这些类资源,必须从磁盘加载它们。可以使用`load`函数或`preload`函数来加载类资源。 以下是一个示例: ```gd # Load the class resource when calling load(). var my_class = load("myclass.gd") # Preload the class only once at compile time. const MyClass = preload("myclass.gd") func _init(): var a = MyClass.new() a.some_function() ``` 在这个示例中,使用`load`函数来加载一个类资源,并使用`preload`函数在编译时预加载一个类资源。然后可以通过调用类对象上的`new`函数来实例化该类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值