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

102 lines
2.2 KiB
GDScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@tool
extends Node
class_name ReedSceneID
##此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()
)
func has_id() -> bool:
return scene_id >= 0
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
## 獲取Scene id的接口
func get_scene_id() ->int:
return _scene_id