.......
parent
8950c8bc53
commit
6fb21ea18b
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
uid://d1f5sdtlqjqr1
|
||||||
48
DoorLock.gd
48
DoorLock.gd
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
uid://ckfh21xv64xk8
|
||||||
|
|
@ -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.")
|
||||||
|
|
|
||||||
|
|
@ -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")]
|
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
@ -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")]
|
|
||||||
|
|
|
||||||
455
level.tscn
455
level.tscn
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue