【杂谈】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