【杂谈】Godot4.4 对象池(附脚本)
如切如磋,如琢如磨。
目录
- 一、展示
- 二、什么是对象池
- 三、对象池脚本
一、展示
这是一个发射球的游戏,发射出的球每过1.5秒又被回收到对象池,等待玩家下一次发射。
二、什么是对象池
所以,对象池就像个收纳盒,用的时候,拿出来,不用的时候放回去。无论玩家在游戏中打死多少怪物,亦或者发射多少子弹,游戏都不会因为内存不够而卡死,因为玩家只是打死了同一批怪物,发射了同一批的子弹。
三、对象池脚本
class_name ObjectPool
extends Node
# scene是对象池里面要放的东西,比如说子弹或者怪物
@export var scene: PackedScene
# 对象池
var object_pool: Array[Node2D]
# 把死亡的怪物或者到时间的子弹,添加到对象池
func add_to_pool(object: Node2D) ->void:
object_pool.append(object)
#彻底禁用整个节点及其子节点的所有处理逻辑(包括输入、_process、_physics_process 等)
object.process_mode = Node.PROCESS_MODE_DISABLED
object.hide()
# 从对象池中取怪物或者子弹出来
func pull_from_pool() ->Node2D:
var object: Node2D
if object_pool.is_empty():
object = scene.instantiate() # 对象池里没对象就创建一个
else:
object = object_pool.pop_front() # 有就弹出对象池中的第一个对象
object.process_mode = Node.PROCESS_MODE_INHERIT
object.show()
if not object.is_inside_tree(): # 确保已移出场景树的节点重新加入
get_parent().add_child(object) # 根据需要自行修改在哪里放子节点!
return object