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
|