拾起物品同步
This commit is contained in:
+37
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user