简易联机实现

This commit is contained in:
2026-09-22 16:56:35 +08:00
parent 020ab88606
commit db60e35766
12 changed files with 434 additions and 5 deletions
+14
View File
@@ -45,9 +45,21 @@ var _gravity: float = float(ProjectSettings.get_setting("physics/3d/default_grav
var _yaw: float = 0.0
var _pitch: float = 0.0
var _jump_buffer: int = 0
## 本节点是否由本机玩家操控。由世界节点在生成时设置 authority 决定,见 world/main.gd。
var _is_local: bool = true
func _ready() -> void:
_is_local = is_multiplayer_authority()
if not _is_local:
# 远端玩家只是一具「回放身体」:
# 拆掉相机 —— 否则每多一个玩家就多一台 Camera3D 互相抢渲染;
# 关掉输入与物理 —— 否则与权威端双重模拟,表现为抖动、漂移、穿地。
# 它的 position 与 Body.rotation 由子节点 Sync 同步过来。
camera_rig.queue_free()
set_physics_process(false)
set_process_unhandled_input(false)
return
_yaw = camera_rig.rotation.y
_pitch = clampf(spring_arm.rotation.x, deg_to_rad(pitch_min_deg), deg_to_rad(pitch_max_deg))
spring_arm.rotation.x = _pitch
@@ -77,6 +89,8 @@ func set_mouse_captured(captured: bool) -> void:
func _physics_process(delta: float) -> void:
if not _is_local:
return
# --- 重力 ---
if is_on_floor():
if velocity.y < 0.0: