class_name UTIL_DATA
'''
UTIL_DATA.array_merge_alternating(array1, array2)
'''
# 公共方法
static func array_merge_alternating(left_list: Array, right_list: Array) -> Array:
var merged_list = []
var left_index = 0
var right_index = 0
# 交替添加左右列表的元素
while left_index < left_list.size() or right_index < right_list.size():
if left_index < left_list.size():
merged_list.append(left_list[left_index])
left_index += 1
if right_index < right_list.size():
merged_list.append(right_list[right_index])
right_index += 1
return merged_list
static func duplicate_custom(original):
if original == null:
push_error("duplicate_custom: 传入 null,无法拷贝")
return null
match typeof(original):
TYPE_NIL, TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING:
return original # **基本类型直接返回**
TYPE_ARRAY:
var new_array = []
for item in original:
new_array.append(duplicate_custom(item)) # **递归拷贝**
return new_array
TYPE_DICTIONARY:
var new_dict = {}
for key in original.keys():
new_dict[key] = duplicate_custom(original[key]) # **递归拷贝**
return new_dict
TYPE_OBJECT:
if original is Resource:
var new_instance = original.get_script().new() # **手动创建相同类型的实例**
if not new_instance:
push_error("duplicate_custom: `new()` 失败,返回原对象: %s" % original)
return original # **保证不返回 `null`,避免影响业务**
# **复制所有属性**
for prop in original.get_property_list():
var prop_name = prop["name"]
if prop_name == "script": # **跳过脚本,避免冲突**
continue
var value = original.get(prop_name)
new_instance.set(prop_name, duplicate_custom(value)) # **递归拷贝**
return new_instance
push_error("duplicate_custom: 不支持的对象类型 %s" % original)
return original # **确保不返回 `null`,避免影响业务**
_:
push_error("duplicate_custom: 不支持的类型 %s" % typeof(original))
return original # **保证不返回 `null`**