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

163 lines
5.2 KiB
GDScript3
Raw Normal View History

2025-12-30 10:15:32 +08:00
@tool
@icon("uid://p0oxphym6oqg")
'''
level的最小单元prop和act
leveln个小关卡n = scene的数量
Scene
1.Act Manager
2.Prop
ActManager下ActProp的不同stateAct切换时Prop对应的状态也会切换
ActManager的主要作用就是管理这些Act的切换
Prop可以简单的理解为场景中的非地形碰撞的AI
Prop会自带一个PropComponentProp自身的state和state的切换
State1 -> State2state1是关闭状态state2是打开状态
1. State1中定义State2中定义
2. State1 -> State2的流转函数State1->State2的具体行为
Scene的PropPropComponentScene会默认的给他发一个PropComponent
Prop上直接挂载PropComponentScene来添加更为合适
SceneScene通过PropComponent上的IDID获取到PropComponent所挂载的组件
PropComponent必须是处于Prop的最上层子节点集
2025-12-31 13:07:31 +08:00
Scene自身也有SceneIDSceneID是实现跨Scene修改的核心SceneID是插件内置的系统主动生成的
Scene来说SceneID是唯一且绝对的2D游戏可能没有这些问题
Scene1的时候Scene9的一个ActChange西Scene的玩家所
2025-12-30 10:15:32 +08:00
'''
2025-12-30 10:15:32 +08:00
class_name ReedScene extends Node2D
2025-12-31 13:07:31 +08:00
## ==============================
## Const Config
## ==============================
##Act管理器的命名
const ACT_MANAGER_NAME := "ActManager"
##Prop的根节点命名
const PROPS_ROOT_NAME := "Props"
##场景管理器的根节点命名
const SCENE_MANAGER_NAME := "SceneManager"
## ==============================
## Export Config
## ==============================
@export var props_root_path: NodePath = ^"Props"
@export var auto_attach_prop_component := true
@export var debug_log := true
## ==============================
## Internal State
## ==============================
var _act_manager: ActManager
var _props_root: Node
var _prop_map: Dictionary = {} # prop_id -> PropComponent
## ==============================
2025-12-31 13:07:31 +08:00
##
## ==============================
func _enter_tree() -> void:
if Engine.is_editor_hint():
2025-12-31 13:07:31 +08:00
_editor_ensure_scene_nodes() ##进入场景树自动添加ActManager,PropsRoot,和SceneManager
## ==============================
## Resolve References
## ==============================
func _resolve_act_manager() -> void:
_act_manager = get_node_or_null("ActManager")
if _act_manager == null:
push_error("[ReedScene] ActManager not found.")
return
func _resolve_props_root() -> void:
_props_root = get_node_or_null(props_root_path)
if _props_root == null:
push_error("[ReedScene] Props root not found: %s" % props_root_path)
## ==============================
## Prop Collection
## ==============================
func _collect_props() -> void:
_prop_map.clear()
if _props_root == null:
return
for prop in _props_root.get_children():
if not prop is Node:
continue
var prop_comp := _find_prop_component(prop)
if prop_comp == null:
continue
var prop_id := prop_comp.prop_id
if prop_id < 0:
push_warning("[ReedScene] Prop has invaild ID: %s" % prop.name)
continue
if _prop_map.has(prop_id):
push_error("[ReedScene] Duplicate Prop ID: %s" % prop_id)
continue
_prop_map[prop_id] = prop_comp
if debug_log:
print("[ReedScene] Registered Prop:", prop_id)
func _find_prop_component(prop: Node) -> PropComponent:
for child in prop.get_children():
if child is PropComponent:
return child
return null
## ==============================
## Act Binding
## ==============================
func _bind_act_events() -> void:
if _act_manager == null:
return
_act_manager.act_changed.connect(_on_act_changed)
2025-12-31 22:59:51 +08:00
func _on_act_changed(from_act: int, to_act: int) -> void:
if debug_log:
print("[ReedScene] Act changed:", from_act, "->", to_act)
2025-12-31 13:07:31 +08:00
##进入场景树自动添加ActManager,PropsRoot,和SceneManager
func _editor_ensure_scene_nodes() -> void:
_editor_ensure_node(SCENE_MANAGER_NAME, SceneManager)
_editor_ensure_node(ACT_MANAGER_NAME, ActManager)
_editor_ensure_node(PROPS_ROOT_NAME, PropManager)
2025-12-31 13:07:31 +08:00
##添加命名和节点
func _editor_ensure_node(name: String, type: Variant) -> Node:
var node := get_node_or_null(name)
if node != null:
return node
2025-12-31 13:07:31 +08:00
node = type.new()
node.name = name
add_child(node)
2025-12-31 13:07:31 +08:00
node.owner = get_tree().edited_scene_root
2025-12-31 13:07:31 +08:00
if debug_log:
print("[ReedScene][Editor] Created node:", name)
2025-12-31 13:07:31 +08:00
return node
func _ready() -> void:
_resolve_act_manager()
_resolve_props_root()
_collect_props()
_bind_act_events()