extends SceneTree ## Wegwerf-Probe (Karte t_1da96275): tickt echte Physik (CharacterBody3D + ## StaticBody-Trimesh) in einem SubViewport mit own_world_3d — so lebt der ## Playtest im Editor. Exit 0 = ja. func _initialize() -> void: _run.call_deferred() func _run() -> void: var vp := SubViewport.new() vp.own_world_3d = true root.add_child(vp) var welt := Node3D.new() vp.add_child(welt) # Boden: Box als StaticBody (Oberkante y=0) var boden := StaticBody3D.new() var cs := CollisionShape3D.new() var box := BoxShape3D.new() box.size = Vector3(40, 0.2, 40) cs.shape = box boden.add_child(cs) boden.position = Vector3(0, -0.1, 0) welt.add_child(boden) # Wand zum Blocken var wand := StaticBody3D.new() var cs2 := CollisionShape3D.new() var box2 := BoxShape3D.new() box2.size = Vector3(2, 3, 0.6) cs2.shape = box2 wand.add_child(cs2) wand.position = Vector3(0, 1.5, -5) welt.add_child(wand) # PlaytestBody via Autopilot var body: CharacterBody3D = load("res://core/editor/playtest/playtest_body.gd").new() welt.add_child(body) body.auto_move_dir = Vector3(0, 0, -1) body.global_position = Vector3(0, 1.2, 5) for i in 40: await physics_frame print("PROBE nach Fall: feet=%.3f on_floor=%s" % [body.fuss_hoehe(), str(body.is_on_floor())]) var ok_fall: bool = body.is_on_floor() and absf(body.fuss_hoehe()) < 0.05 for i in 240: await physics_frame if body.global_position.z < -4.2: break body.auto_move_dir = Vector3.ZERO var z: float = body.global_position.z print("PROBE vor Wand gestoppt: z=%.3f (Wand-Fläche bei -4.7)" % z) var ok_block: bool = z > -4.6 # RayQuery gegen den Space des SubViewports var raum := body.get_world_3d().direct_space_state var hit := raum.intersect_ray(PhysicsRayQueryParameters3D.create( Vector3(0, 2, -10), Vector3(0, 0, -10))) print("PROBE ray hit Wand: %s" % str(not hit.is_empty())) var ok_ray: bool = not hit.is_empty() if ok_fall and ok_block and ok_ray: print("PROBE OK: Physik im SubViewport tickt (Fall+Block+Ray)") quit(0) else: print("PROBE FAIL: fall=%s block=%s ray=%s" % [str(ok_fall), str(ok_block), str(ok_ray)]) quit(1)