2026-01-12 14:04:08 +08:00
|
|
|
|
##TODO:清楚掉這裏和PhantomCamera相關的部分
|
2026-01-06 16:19:08 +08:00
|
|
|
|
@tool
|
2026-01-12 17:51:15 +08:00
|
|
|
|
@icon("res://addons/reedcamera/icon/camera_anchor_icon.svg")
|
2026-01-06 16:19:08 +08:00
|
|
|
|
class_name CameraAnchor extends Node2D
|
|
|
|
|
|
|
2026-01-12 14:04:08 +08:00
|
|
|
|
const _CONSTANTS = preload("res://addons/reedcamera/_data/CameraSystemConst.gd")
|
|
|
|
|
|
|
2026-01-08 22:39:39 +08:00
|
|
|
|
@export_group("Anchor Config")
|
|
|
|
|
|
##该priority不会直接修改Anchor的priority,只用作初始化
|
2026-01-06 16:19:08 +08:00
|
|
|
|
@export var priority: int = 0
|
2026-01-08 22:39:39 +08:00
|
|
|
|
##此Anchor是否有效
|
2026-01-06 16:19:08 +08:00
|
|
|
|
@export var enabled: bool = true
|
2026-01-12 17:51:15 +08:00
|
|
|
|
## =========================
|
|
|
|
|
|
## Blend Config
|
|
|
|
|
|
## =========================
|
|
|
|
|
|
@export_subgroup("Blending")
|
2026-01-08 22:39:39 +08:00
|
|
|
|
##是否要存在相機過渡時間
|
|
|
|
|
|
@export var use_blend: bool = true
|
|
|
|
|
|
##過度時間
|
2026-01-06 16:19:08 +08:00
|
|
|
|
@export var blend_time: float = 0.3
|
|
|
|
|
|
|
2026-01-08 22:39:39 +08:00
|
|
|
|
@export_group("Camera Config")
|
|
|
|
|
|
@export_subgroup("Sizing")
|
2026-01-08 15:53:30 +08:00
|
|
|
|
@export var zoom: Vector2 = Vector2.ONE:
|
|
|
|
|
|
set(value):
|
|
|
|
|
|
zoom = value
|
|
|
|
|
|
if Engine.is_editor_hint():
|
|
|
|
|
|
queue_redraw()
|
2026-01-08 22:39:39 +08:00
|
|
|
|
@export_subgroup("Limit")
|
|
|
|
|
|
@export var use_camera_limit: bool = false:
|
|
|
|
|
|
set(value):
|
|
|
|
|
|
use_camera_limit = value
|
|
|
|
|
|
if Engine.is_editor_hint():
|
|
|
|
|
|
queue_redraw()
|
|
|
|
|
|
|
|
|
|
|
|
@export var limit_top: int = -10000000:
|
|
|
|
|
|
set(value):
|
|
|
|
|
|
limit_top = value
|
|
|
|
|
|
if Engine.is_editor_hint():
|
|
|
|
|
|
queue_redraw()
|
|
|
|
|
|
@export var limit_bottom: int = 10000000:
|
|
|
|
|
|
set(value):
|
|
|
|
|
|
limit_bottom = value
|
|
|
|
|
|
if Engine.is_editor_hint():
|
|
|
|
|
|
queue_redraw()
|
|
|
|
|
|
@export var limit_left: int = -10000000:
|
|
|
|
|
|
set(value):
|
|
|
|
|
|
limit_left = value
|
|
|
|
|
|
if Engine.is_editor_hint():
|
|
|
|
|
|
queue_redraw()
|
|
|
|
|
|
@export var limit_right: int = 10000000:
|
|
|
|
|
|
set(value):
|
|
|
|
|
|
limit_right = value
|
|
|
|
|
|
if Engine.is_editor_hint():
|
|
|
|
|
|
queue_redraw()
|
2026-01-08 15:53:30 +08:00
|
|
|
|
|
|
|
|
|
|
## 编辑器预览面板设置
|
|
|
|
|
|
@export_group("Editor Preview")
|
2026-01-08 22:39:39 +08:00
|
|
|
|
@export var show_camera_preview: bool = true
|
2026-01-08 15:53:30 +08:00
|
|
|
|
@export var preview_color: Color = Color(0.2, 0.9, 0.4, 0.8)
|
|
|
|
|
|
@export var preview_line_width: float = 2.0
|
2026-01-08 22:39:39 +08:00
|
|
|
|
@export var show_limit_preview: bool = true
|
|
|
|
|
|
@export var limit_preview_color: Color = Color(0.9, 0.3, 0.3, 0.8)
|
|
|
|
|
|
@export var limit_preview_line_width: float = 2.0
|
|
|
|
|
|
|
2026-01-06 16:19:08 +08:00
|
|
|
|
|
2026-01-12 17:51:15 +08:00
|
|
|
|
#@export_subgroup("Follow")
|
|
|
|
|
|
#@export var follow_player: bool = false
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var _camera_global : Node = null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-01-06 16:19:08 +08:00
|
|
|
|
var _priority: int :
|
|
|
|
|
|
set(value):
|
|
|
|
|
|
if _priority != value:
|
|
|
|
|
|
_priority = value
|
|
|
|
|
|
on_priority_change.emit(_priority, self)
|
|
|
|
|
|
|
|
|
|
|
|
signal on_priority_change(_priority:int, anchor: CameraAnchor)
|
|
|
|
|
|
|
|
|
|
|
|
func _ready() -> void:
|
|
|
|
|
|
if not Engine.is_editor_hint():
|
|
|
|
|
|
_runtime_ready()
|
|
|
|
|
|
|
|
|
|
|
|
func _enter_tree() -> void:
|
2026-01-12 14:04:08 +08:00
|
|
|
|
if not Engine.is_editor_hint():
|
|
|
|
|
|
pass
|
|
|
|
|
|
#CameraSystem.register_anchor(self)
|
2026-01-06 16:19:08 +08:00
|
|
|
|
|
|
|
|
|
|
func _exit_tree() -> void:
|
2026-01-12 14:04:08 +08:00
|
|
|
|
if not Engine.is_editor_hint():
|
|
|
|
|
|
pass
|
|
|
|
|
|
#CameraSystem.unregister_anchor(self)
|
2026-01-08 15:53:30 +08:00
|
|
|
|
|
|
|
|
|
|
func _draw() -> void:
|
|
|
|
|
|
if not Engine.is_editor_hint():
|
|
|
|
|
|
return
|
|
|
|
|
|
|
2026-01-12 14:04:08 +08:00
|
|
|
|
if show_camera_preview:
|
2026-01-08 22:39:39 +08:00
|
|
|
|
draw_rect(
|
2026-01-12 14:04:08 +08:00
|
|
|
|
_camera_frame_rect_draw(),
|
2026-01-08 22:39:39 +08:00
|
|
|
|
preview_color,
|
|
|
|
|
|
false,
|
|
|
|
|
|
preview_line_width
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
if show_limit_preview and use_camera_limit:
|
|
|
|
|
|
draw_rect(
|
|
|
|
|
|
_camera_limit_rect(),
|
|
|
|
|
|
limit_preview_color,
|
|
|
|
|
|
false,
|
|
|
|
|
|
limit_preview_line_width
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func _camera_limit_rect() -> Rect2:
|
|
|
|
|
|
var pos := Vector2(limit_left, limit_top)
|
|
|
|
|
|
var size := Vector2(
|
|
|
|
|
|
limit_right - limit_left,
|
|
|
|
|
|
limit_bottom - limit_top
|
2026-01-08 15:53:30 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2026-01-08 22:39:39 +08:00
|
|
|
|
return Rect2(pos, size)
|
|
|
|
|
|
|
2026-01-12 14:04:08 +08:00
|
|
|
|
func _camera_frame_rect_draw() -> Rect2:
|
|
|
|
|
|
var cg = _get_camera_global()
|
|
|
|
|
|
if cg:
|
|
|
|
|
|
var screen_size: Vector2 = cg.get_screen_size()
|
2026-01-08 15:53:30 +08:00
|
|
|
|
|
2026-01-12 14:04:08 +08:00
|
|
|
|
var z := zoom
|
|
|
|
|
|
z.x = maxf(z.x, 0.001)
|
|
|
|
|
|
z.y = maxf(z.y, 0.001)
|
2026-01-08 15:53:30 +08:00
|
|
|
|
|
2026-01-12 14:04:08 +08:00
|
|
|
|
var size := Vector2(
|
|
|
|
|
|
screen_size.x / z.x,
|
|
|
|
|
|
screen_size.y / z.y
|
|
|
|
|
|
)
|
2026-01-08 15:53:30 +08:00
|
|
|
|
|
2026-01-12 14:04:08 +08:00
|
|
|
|
# PhantomCamera:以自身为中心
|
|
|
|
|
|
return Rect2(-size * 0.5, size)
|
|
|
|
|
|
|
|
|
|
|
|
print("沒有找到全局相機")
|
|
|
|
|
|
return Rect2(Vector2.ZERO,Vector2.ZERO)
|
2026-01-08 15:53:30 +08:00
|
|
|
|
|
|
|
|
|
|
func _runtime_ready() -> void:
|
|
|
|
|
|
_priority = priority
|
|
|
|
|
|
|
2026-01-12 14:04:08 +08:00
|
|
|
|
##内部懶加載全局相機管理器
|
|
|
|
|
|
func _get_camera_global() -> Object:
|
|
|
|
|
|
if _camera_global:
|
|
|
|
|
|
return _camera_global
|
|
|
|
|
|
|
|
|
|
|
|
if Engine.has_singleton(_CONSTANTS.CAMERA_SYSTEM_NAME):
|
|
|
|
|
|
_camera_global = Engine.get_singleton(_CONSTANTS.CAMERA_SYSTEM_NAME)
|
|
|
|
|
|
|
|
|
|
|
|
return _camera_global
|
|
|
|
|
|
|
2026-01-08 15:53:30 +08:00
|
|
|
|
func push_camera() -> void:
|
2026-01-12 14:04:08 +08:00
|
|
|
|
#CameraSystem.reset_all_camera_priority()
|
2026-01-08 15:53:30 +08:00
|
|
|
|
_priority = 1000
|
|
|
|
|
|
|
|
|
|
|
|
func pop_camera() -> void:
|
|
|
|
|
|
_priority = 0
|