master
selim 2026-01-13 02:00:13 +01:00
parent 8950c8bc53
commit 6fb21ea18b
11 changed files with 372 additions and 265 deletions

View File

@ -25,8 +25,9 @@ var current_age = AgeState.BABY
@export var mesh_castle : Node3D @export var mesh_castle : Node3D
@export var mesh_fort : Node3D @export var mesh_fort : Node3D
# 5. Bewegliches Objekt (Regal) # 5. Interaktive Objekte
@export var heavy_object : RigidBody3D @export var heavy_object : RigidBody3D # Das Regal
@export var age_paper : Node3D # Das Papier mit dem Hinweis
func _ready(): func _ready():
# Automatisch Controller finden, falls vergessen # Automatisch Controller finden, falls vergessen
@ -68,8 +69,8 @@ func change_age(direction: int):
func apply_age_physics(animate: bool = true): func apply_age_physics(animate: bool = true):
# Sicherheitscheck: Sind alle Nodes zugewiesen? # Sicherheitscheck: Sind alle Nodes zugewiesen?
if not player_body or not world_env or not movement_direct or not camera or not audio_baby or not audio_teen or not mesh_castle or not mesh_fort or not heavy_object: if not player_body or not world_env or not movement_direct or not camera or not audio_baby or not audio_teen or not mesh_castle or not mesh_fort or not heavy_object or not age_paper:
printerr("FEHLER: Bitte ALLE Referenzen im Inspektor der Uhr zuweisen!") printerr("FEHLER: Bitte ALLE Referenzen (auch Age Paper!) im Inspektor der Uhr zuweisen!")
return return
# --- ZIELWERTE DEFINIEREN --- # --- ZIELWERTE DEFINIEREN ---
@ -82,12 +83,11 @@ func apply_age_physics(animate: bool = true):
var target_vol_teen = -80.0 var target_vol_teen = -80.0
var translation_step = Vector3.ZERO var translation_step = Vector3.ZERO
# Sichtbarkeit der Meshes # Logik-Status Variablen
var show_castle = false var show_castle = false
var show_fort = false var show_fort = false
# Regal Status
var make_object_movable = false var make_object_movable = false
var is_teen_state = false
match current_age: match current_age:
AgeState.BABY: AgeState.BABY:
@ -109,8 +109,9 @@ func apply_age_physics(animate: bool = true):
show_castle = true show_castle = true
show_fort = false show_fort = false
# Regal: Fest (zu schwer) # Interaktionen
make_object_movable = false make_object_movable = false # Regal fest
is_teen_state = false # Papier = Gekritzel
AgeState.TEEN: AgeState.TEEN:
# TEEN WERTE # TEEN WERTE
@ -131,8 +132,9 @@ func apply_age_physics(animate: bool = true):
show_castle = false show_castle = false
show_fort = true show_fort = true
# Regal: Beweglich (stark) # Interaktionen
make_object_movable = true make_object_movable = true # Regal beweglich
is_teen_state = true # Papier = Klartext
# --- ANWENDUNG --- # --- ANWENDUNG ---
@ -140,10 +142,14 @@ func apply_age_physics(animate: bool = true):
mesh_castle.visible = show_castle mesh_castle.visible = show_castle
mesh_fort.visible = show_fort mesh_fort.visible = show_fort
# Aufruf des Skripts auf dem Regal (HeavyObject.gd) # Regal update
if heavy_object.has_method("set_movable"): if heavy_object.has_method("set_movable"):
heavy_object.set_movable(make_object_movable) heavy_object.set_movable(make_object_movable)
# Papier update (NEU)
if age_paper.has_method("update_texture"):
age_paper.update_texture(is_teen_state)
# 2. Sofortige Positionierung (gegen Stuck-Bugs) # 2. Sofortige Positionierung (gegen Stuck-Bugs)
if animate: if animate:
player.translate(translation_step) player.translate(translation_step)

26
DoorFreezer.gd 100644
View File

@ -0,0 +1,26 @@
extends RigidBody3D
# Referenz zum Griff (der das Pickable-Skript hat)
@export var door_handle : XRToolsPickable
func _ready():
# Am Start die Tür einfrieren
freeze = true
if door_handle:
# Signale verbinden
door_handle.picked_up.connect(_on_grab)
door_handle.dropped.connect(_on_release)
func _on_grab(_pickable):
# Wenn angefasst: Physik aktivieren
freeze = false
sleeping = false # Aufwecken, damit sie sofort reagiert
func _on_release(_pickable):
# Wenn losgelassen: Sofort wieder einfrieren
freeze = true
# WICHTIG: Geschwindigkeit nullen, damit sie sofort stoppt und nicht nachrutscht
linear_velocity = Vector3.ZERO
angular_velocity = Vector3.ZERO

View File

@ -0,0 +1 @@
uid://d1f5sdtlqjqr1

View File

@ -1,37 +1,45 @@
extends Node3D extends RigidBody3D
# Referenz zur Tür (der RigidBody) # Referenz zum Griff (der das Pickable-Skript hat)
@export var door_rigidbody : RigidBody3D @export var door_handle : XRToolsPickable
# Referenz zur SnapZone (der "WheelSpace") # Referenz zur SnapZone (der "WheelSpace")
@export var wheel_snap_zone : XRToolsSnapZone @export var wheel_snap_zone : XRToolsSnapZone
var wheel_inserted : bool = false
func _ready(): func _ready():
# Wir verbinden das Signal der SnapZone # Am Start die Tür einfrieren
freeze = true
if door_handle:
# Signale verbinden
door_handle.picked_up.connect(_on_grab)
door_handle.dropped.connect(_on_release)
if wheel_snap_zone: if wheel_snap_zone:
# "has_picked_up" wird gefeuert, wenn die Zone ein Objekt fängt # "has_picked_up" wird gefeuert, wenn die Zone ein Objekt fängt
wheel_snap_zone.has_picked_up.connect(_on_wheel_inserted) wheel_snap_zone.has_picked_up.connect(_on_wheel_inserted)
wheel_snap_zone.has_dropped.connect(_on_wheel_removed)
# Optional: Wenn man das Rad wieder rausnimmt, soll die Tür wieder zu gehen?
# Dann aktiviere die nächste Zeile:
# wheel_snap_zone.has_dropped.connect(_on_wheel_removed)
# Sicherstellen, dass die Tür am Start zu ist
lock_door()
func _on_wheel_inserted(_object): func _on_wheel_inserted(_object):
print("Rad eingesetzt! Tür wird entriegelt.") print("Rad eingesetzt! Tür wird entriegelt.")
unlock_door() wheel_inserted = true
func _on_wheel_removed(_object): func _on_wheel_removed(_object):
print("Rad entfernt! Tür wird verriegelt.") print("Rad entfernt! Tür wird verriegelt.")
lock_door() wheel_inserted = false
func unlock_door(): func _on_grab(_pickable):
if door_rigidbody: # Wenn angefasst: Physik aktivieren
door_rigidbody.freeze = false # Physik an -> Tür beweglich if wheel_inserted:
# Optional: Schlafeinschlafen verhindern freeze = false
sleeping = false # Aufwecken, damit sie sofort reagiert
func lock_door(): func _on_release(_pickable):
if door_rigidbody: # Wenn losgelassen: Sofort wieder einfrieren
door_rigidbody.freeze = true # Physik aus -> Tür fest wie eine Wand freeze = true
# WICHTIG: Geschwindigkeit nullen, damit sie sofort stoppt und nicht nachrutscht
linear_velocity = Vector3.ZERO
angular_velocity = Vector3.ZERO

View File

@ -0,0 +1,30 @@
extends Node3D
# Referenz zum Mesh, damit wir das Material ändern können
@export var mesh_instance : MeshInstance3D
# Platzhalter für die zwei Texturen (Bilder)
@export var texture_baby : Texture2D # Gekritzel
@export var texture_teen : Texture2D # Klartext
func _ready():
# Wir stellen sicher, dass das Material einzigartig ist,
# damit wir nicht versehentlich alle Papiere in der Welt ändern.
if mesh_instance.material_override:
mesh_instance.material_override = mesh_instance.material_override.duplicate()
elif mesh_instance.mesh and mesh_instance.mesh.material:
mesh_instance.mesh.material = mesh_instance.mesh.material.duplicate()
func update_texture(is_teen: bool):
# Wir holen uns das aktuelle Material
var mat = null
if mesh_instance.material_override:
mat = mesh_instance.material_override
else:
mat = mesh_instance.mesh.material
if mat is StandardMaterial3D:
if is_teen:
mat.albedo_texture = texture_teen
else:
mat.albedo_texture = texture_baby

View File

@ -0,0 +1 @@
uid://ckfh21xv64xk8

View File

@ -3,6 +3,7 @@ extends Node3D
# Referenz zur SnapZone (das Schloss) # Referenz zur SnapZone (das Schloss)
@export var snap_zone : XRToolsSnapZone @export var snap_zone : XRToolsSnapZone
@export var wheel: RigidBody3D
# Einstellungen für die Bewegung # Einstellungen für die Bewegung
@export var slide_offset : Vector3 = Vector3(0.5, 0, 0) # 0.5 auf X @export var slide_offset : Vector3 = Vector3(0.5, 0, 0) # 0.5 auf X
@export var animation_duration : float = 1.0 # Dauer in Sekunden @export var animation_duration : float = 1.0 # Dauer in Sekunden
@ -22,9 +23,11 @@ func _ready():
else: else:
printerr("FEHLER: Bitte SnapZone im Inspektor zuweisen!") printerr("FEHLER: Bitte SnapZone im Inspektor zuweisen!")
func _on_unlock(_object): func _on_unlock(_object):
print("Schlüssel steckt! Schublade öffnet sich.") print("Schlüssel steckt! Schublade öffnet sich.")
move_drawer(start_position + slide_offset) move_drawer(start_position + slide_offset)
wheel.enabled = true
func _on_lock(_object): func _on_lock(_object):
print("Schlüssel entfernt! Schublade schließt sich.") print("Schlüssel entfernt! Schublade schließt sich.")

View File

@ -1,7 +1,6 @@
[gd_scene load_steps=4 format=3 uid="uid://ddn0hta2sm7to"] [gd_scene load_steps=3 format=3 uid="uid://ddn0hta2sm7to"]
[ext_resource type="PackedScene" uid="uid://ce7vysyvondf8" path="res://addons/godot-xr-tools/objects/snap_zone.tscn" id="1_1nyor"] [ext_resource type="PackedScene" uid="uid://ce7vysyvondf8" path="res://addons/godot-xr-tools/objects/snap_zone.tscn" id="1_1nyor"]
[ext_resource type="PackedScene" uid="uid://da2qgxxwwitl6" path="res://addons/godot-xr-tools/objects/highlight/highlight_ring.tscn" id="2_j2emh"]
[sub_resource type="SphereShape3D" id="SphereShape3D_1nyor"] [sub_resource type="SphereShape3D" id="SphereShape3D_1nyor"]
radius = 0.3 radius = 0.3
@ -12,5 +11,3 @@ snap_require = "Key"
[node name="CollisionShape3D" parent="." index="0"] [node name="CollisionShape3D" parent="." index="0"]
shape = SubResource("SphereShape3D_1nyor") shape = SubResource("SphereShape3D_1nyor")
[node name="HighlightRing" parent="." index="2" instance=ExtResource("2_j2emh")]

View File

@ -0,0 +1,33 @@
[gd_scene load_steps=9 format=3 uid="uid://d1bmffs5q85hn"]
[ext_resource type="PackedScene" uid="uid://c8l60rnugru40" path="res://addons/godot-xr-tools/objects/pickable.tscn" id="1_ngymr"]
[ext_resource type="Script" uid="uid://ckfh21xv64xk8" path="res://addons/godot-xr-tools/objects/AgePaper.gd" id="2_856bp"]
[ext_resource type="Texture2D" uid="uid://bdnh5ako4yfpr" path="res://assets/tippi/gekritzel.png" id="3_e14vg"]
[ext_resource type="Texture2D" uid="uid://dstv63bc0f6tp" path="res://assets/tippi/passwort.png" id="4_jxdx2"]
[sub_resource type="BoxShape3D" id="BoxShape3D_ngymr"]
size = Vector3(0.42, 0.58, 0.02)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_e14vg"]
[sub_resource type="BoxMesh" id="BoxMesh_856bp"]
material = SubResource("StandardMaterial3D_e14vg")
size = Vector3(0.42, 0.58, 0.02)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_rarql"]
albedo_texture = ExtResource("4_jxdx2")
[node name="Paper" instance=ExtResource("1_ngymr")]
[node name="CollisionShape3D" parent="." index="0"]
shape = SubResource("BoxShape3D_ngymr")
[node name="MeshInstance3D" type="MeshInstance3D" parent="." index="1"]
mesh = SubResource("BoxMesh_856bp")
surface_material_override/0 = SubResource("StandardMaterial3D_rarql")
[node name="MysteryPaper" type="Node3D" parent="." index="2" node_paths=PackedStringArray("mesh_instance")]
script = ExtResource("2_856bp")
mesh_instance = NodePath("../MeshInstance3D")
texture_baby = ExtResource("3_e14vg")
texture_teen = ExtResource("4_jxdx2")

View File

@ -1,7 +1,6 @@
[gd_scene load_steps=4 format=3 uid="uid://c31oleh3x06ku"] [gd_scene load_steps=3 format=3 uid="uid://c31oleh3x06ku"]
[ext_resource type="PackedScene" uid="uid://ce7vysyvondf8" path="res://addons/godot-xr-tools/objects/snap_zone.tscn" id="1_13vdp"] [ext_resource type="PackedScene" uid="uid://ce7vysyvondf8" path="res://addons/godot-xr-tools/objects/snap_zone.tscn" id="1_13vdp"]
[ext_resource type="PackedScene" uid="uid://da2qgxxwwitl6" path="res://addons/godot-xr-tools/objects/highlight/highlight_ring.tscn" id="2_js6x5"]
[sub_resource type="SphereShape3D" id="SphereShape3D_js6x5"] [sub_resource type="SphereShape3D" id="SphereShape3D_js6x5"]
resource_local_to_scene = true resource_local_to_scene = true
@ -13,5 +12,3 @@ snap_require = "Wheel"
[node name="CollisionShape3D" parent="." index="0"] [node name="CollisionShape3D" parent="." index="0"]
shape = SubResource("SphereShape3D_js6x5") shape = SubResource("SphereShape3D_js6x5")
[node name="HighlightRing" parent="." index="2" instance=ExtResource("2_js6x5")]

File diff suppressed because one or more lines are too long