godot-plateformer/addons/reedscene/scene/ReedSceneID.gd

102 lines
2.2 KiB
GDScript3
Raw Normal View History

2026-01-01 16:33:32 +08:00
@tool
extends Node
class_name ReedSceneID
2026-01-02 18:37:09 +08:00
##此Scene的描述ID无法主动修改你可以向編輯器申請。
@export_custom(
PROPERTY_HINT_NONE,
"",
PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY
)
var scene_id: int = -1:
set(value):
if _scene_id == value:
return
_scene_id = value
if Engine.is_editor_hint():
_sync_node_name()
update_configuration_warnings()
get():
return _scene_id
var _scene_id: int = -1
var _is_syncing_name := false
const DB_PATH := "res://addons/reedscene/demo/data_base/GLOBAL_SCENE_ID.tres"
## ==============================
## Build In
## ==============================
## 進入Tree
func _enter_tree() -> void:
if Engine.is_editor_hint():
_sync_node_name()
## 初始化完成后
func _ready() -> void:
if Engine.is_editor_hint():
renamed.connect(func():
_sync_node_name()
)
2026-01-01 16:33:32 +08:00
func has_id() -> bool:
return scene_id >= 0
2026-01-02 18:37:09 +08:00
func _get_display_name() -> String:
if not has_id():
return "[Invalid!]"
return "[ID: %d]" % scene_id
func _sync_node_name() -> void:
if _is_syncing_name:
return
_is_syncing_name = true
var desired := _get_display_name()
if name != desired:
name = desired
_is_syncing_name = false
func _get_configuration_warnings() -> PackedStringArray:
var warnings := PackedStringArray()
# 1. 结构校验(只跟 Node 结构有关)
var parent := get_parent()
if parent == null or not (parent is ReedScene):
warnings.append("ReedSceneID must be a child of ReedScene.")
return warnings
# 2. 自身状态
if not has_id():
warnings.append("Scene ID is not assigned.")
return warnings
# 3. DB 一致性校验(委托给 DB
var scene_path := parent.scene_file_path
if scene_path.is_empty():
warnings.append("Parent scene is not saved; cannot validate Scene ID.")
return warnings
var uid := ResourceUID.path_to_uid(scene_path)
var db := load(DB_PATH) as SceneIDDatabase
if not db:
warnings.append("SceneIDDatabase not found.")
return warnings
var result := db.validate_scene_id(scene_id, uid, scene_path)
if result == null:
return warnings
for msg in result.messages:
warnings.append(msg)
return warnings
2026-01-02 23:56:22 +08:00
## 獲取Scene id的接口
func get_scene_id() ->int:
return _scene_id