3.5 KiB
3.5 KiB
2026-10-09
简易准心(Crosshair)
- 新增
ui/crosshair.gd:@tool extends Control,用_draw()画十字(gap/length/thickness/dot 可导出调参),mouse_filter = IGNORE,监听NOTIFICATION_RESIZED重绘。 - 挂载约定:
CanvasLayer > Crosshair(Control),Control 锚点为 Full Rect,中心即屏幕中心;推荐挂在CameraRig之下 —— 因为player.gd _ready()对非 authority 会camera_rig.queue_free(),远端玩家准心随之一并释放,无需额外代码。 - 项目 stretch 模式为
canvas_items+expand,CanvasLayer 会自动跟随缩放。
后续改动:只保留「点」
- 最终形态:准心 = 屏幕中心一个点,无十字、无样式开关(
enum Style已移除)。 - 导出参数:
dot_color/dot_radius(默认 2.5) /outline/outline_color/outline_width。 _draw()先画描边圆再画主体圆,保证浅背景可见。
player.gd 拆解方案(待执行)
- 现状:
character/player/player.gd155 行,混了视角 / 移动跳跃 / 拾取 / 多人权限四类职责。 - 方案:子节点组件化(与既有
PlayerAnimator同模式)。根节点降为协调器(~40 行),新增Look/Motor/Pickup三个 Node 子节点,各自挂player_look.gd/player_motor.gd/player_pickup.gd。 - 三条硬约束:①
move_and_slide()留在根节点,Motor 只写body.velocity;② 物理顺序由根节点显式编排(motor.step → move_and_slide → animator → pickup),不让子节点各写_physics_process;③ 非 authority 时三个组件的输入/物理必须一并关闭。 - 范式定位:组合优于继承 + 组件模式(Component Pattern);协调器部分带 Facade/Mediator 色彩;
setup()注入属手工依赖注入。不是 ECS(Godot 节点是「带行为的对象」,非纯数据组件)。 - 状态:已落地(2026-10-09)。新增
player_look.gd/player_motor.gd/player_pickup.gd(均带class_name:PlayerLook / PlayerMotor / PlayerPickup);player.gd重写为协调器(~65 行);player.tscn追加 Look / Motor / Pickup 三个 Node 子节点(挂 FaceRig 之后,ext_resource id 13_look / 14_motor / 15_pickup,未写 uid 由 Godot 补)。 - 场景格式注意:本项目的 .tscn 节点带非标准
unique_id=(Godot 4.7 特性),unique_id与load_steps均可省略;paint_panel.tscn就完全没写,可作参照。 - 已确认无外部脚本引用被搬走的属性(仅
world/main.tscn通过场景 uid 引用玩家场景)。 - 顺手去掉了原
_pickObject里的两行print()调试输出。
拾取改为长按拖拽
player_pickup.gd:由「按一下切换」改为「按下抓起、松开放下」——is_action_pressed("carry")→_grab(),is_action_released("carry")→_drop()。carry动作确认绑定鼠标左键(button_index: 1);项目里另有未被任何脚本使用的throw_carry(绑 Q 键),可作投掷功能的预留。- 加了
Input.mouse_mode != MOUSE_MODE_CAPTURED早退,并在player.gd重新锁定鼠标那一支补get_viewport().set_input_as_handled(),避免「点一下重新锁定鼠标」顺带抓起物体(两种分支执行顺序下都成立)。 physics_step()与has_object()改用is_instance_valid()—— 防止拖拽途中物体被 destroy 时取属性报错。_drop()保留线速度(松手有惯性 / 可甩出);想要「就地放下」需补set_linear_velocity(Vector3.ZERO)。