拾起物品同步

This commit is contained in:
2026-10-03 18:48:04 +08:00
parent 0dcfb88bfe
commit 3d23804fa5
10 changed files with 359 additions and 86 deletions
+37 -1
View File
@@ -19,6 +19,8 @@ const PLAYER_SCENE_PATH := "res://character/player/player.tscn"
const INTERACT_ACTION := "interact"
## 挂在编辑中场景下。前缀 _McpTest 是测试运行器兜底清理认的标记
const TEST_NODE_NAME := "_McpTestZipline"
## 测试自己造的父节点:不带任何变换,免得编辑中场景的缩放漏进来
const TEST_PARENT_NAME := "_McpTestZiplineHolder"
var _zip: Zipline = null
@@ -40,10 +42,13 @@ func suite_setup(_ctx: Dictionary) -> void:
## 每个测试拿一个干净实例:有些测试会故意篡改锚点,共享实例会让结果依赖执行顺序。
## 挂在**编辑器根节点**下的测试父节点里,而不是编辑中场景根下 ——
## 滑索的几何是在它自己的空间里定义的,挂在场景根下会被那个场景的变换带偏
## (player.tscn 的根节点就带 0.2 缩放,实测把中点下垂从 1.2 变成 0.24)。
func setup() -> void:
_zip = _instantiate_zipline()
if _zip != null:
EditorInterface.get_edited_scene_root().add_child(_zip)
Engine.get_main_loop().root.add_child(_make_holder(Vector3.ONE, _zip))
func teardown() -> void:
@@ -127,6 +132,27 @@ func test_tangent_points_from_a_to_b() -> void:
assert_gt(_zip.tangent(t).dot(along), 0.9, "tangent(%s) 没从 A 指向 B" % t)
## 父节点带缩放时,整条缆要跟着一起缩 —— 形状(下垂比例)不能走样。
## 这里踩过:曲线用 global 锚点 lerp、却加未缩放的 sag,父节点一缩放形状就偏,
## 挂在带缩放的父节点下 tangent 会歪到 27°,直接把人往错方向送。
func test_shape_survives_parent_scale() -> void:
var packed := load(ZIPLINE_SCENE_PATH) as PackedScene
if packed == null:
return
var zip := packed.instantiate() as Zipline
if zip == null:
return
zip.name = TEST_NODE_NAME
Engine.get_main_loop().root.add_child(_make_holder(Vector3(0.2, 0.2, 0.2), zip))
var along := (zip.anchor_b.global_position - zip.anchor_a.global_position).normalized()
for t in [0.0, 0.5, 1.0]:
assert_gt(zip.tangent(t).dot(along), 0.9, "缩放父节点下 tangent(%s) 形状走样了" % t)
# 中点的世界下垂量应该是 sag × 父节点缩放
var dip := zip.anchor_a.global_position.lerp(zip.anchor_b.global_position, 0.5).distance_to(zip.sample(0.5))
assert_true(absf(dip - zip.sag * 0.2) < 0.01,
"缩放后中点下垂 %.4f,期望 sag×0.2 = %.4f" % [dip, zip.sag * 0.2])
## 玩家挂索靠这个接口。返回的点必须在曲线上,distance 必须是真实欧氏距离。
func test_closest_point_lands_on_curve() -> void:
var probe := _zip.sample(0.3) + Vector3(1.0, 1.0, 0.0)
@@ -186,3 +212,13 @@ func _instantiate_zipline() -> Zipline:
return null
zip.name = TEST_NODE_NAME
return zip
## 造一个父节点(可带缩放)并把 node 挂进去,返回那个父节点。测试用它把滑索和编辑中场景隔开。
func _make_holder(scale_factor: Vector3, node: Node) -> Node3D:
var holder := Node3D.new()
holder.name = TEST_PARENT_NAME
holder.scale = scale_factor
holder.add_child(node)
track(holder)
return holder