106 lines
3.1 KiB
GDScript
106 lines
3.1 KiB
GDScript
extends Node3D
|
|
|
|
# Wir definieren unsere 3 Altersstufen
|
|
enum AgeState { BABY, CHILD, TEEN }
|
|
|
|
# Startalter ist BABY
|
|
var current_age = AgeState.BABY
|
|
|
|
# Referenzen zu den anderen Nodes (müssen im Inspektor zugewiesen werden)
|
|
@export var controller : XRController3D
|
|
@export var player_body : CharacterBody3D
|
|
@export var player : XROrigin3D
|
|
|
|
# Referenz zum Aussehen der Uhr (für Farbänderung)
|
|
@onready var visual_mesh = $Player
|
|
|
|
func _ready():
|
|
# 1. Controller finden, falls nicht zugewiesen
|
|
if not controller:
|
|
# Wir gehen im Baum nach oben: Watch -> Area3D -> RightController
|
|
controller = get_parent().get_parent()
|
|
|
|
# 2. Signal verbinden
|
|
if controller:
|
|
controller.button_pressed.connect(_on_button_pressed)
|
|
print("Uhr verbunden mit Controller: ", controller.name)
|
|
else:
|
|
printerr("FEHLER: Kein Controller gefunden!")
|
|
|
|
# 3. Initiale Werte setzen (damit wir als Baby starten)
|
|
apply_age_physics()
|
|
update_visuals()
|
|
|
|
func _on_button_pressed(button_name: String):
|
|
# Input Abfrage (A/B oder X/Y je nach Controller)
|
|
match button_name:
|
|
"trigger_click": # Älter werden
|
|
change_age(1)
|
|
"grip_click": # Jünger werden
|
|
change_age(-1)
|
|
|
|
func change_age(direction: int):
|
|
var new_age_value = current_age + direction
|
|
|
|
# Begrenzen: Nicht jünger als Baby, nicht älter als Teen
|
|
if new_age_value < AgeState.BABY:
|
|
print("Du bist schon ein Baby!")
|
|
return
|
|
elif new_age_value > AgeState.TEEN:
|
|
print("Du bist schon erwachsen!")
|
|
return
|
|
|
|
# Wenn gültig, Alter ändern
|
|
current_age = new_age_value
|
|
print("Alter geändert zu: ", AgeState.keys()[current_age])
|
|
|
|
# Physik und Aussehen aktualisieren
|
|
apply_age_physics()
|
|
update_visuals()
|
|
|
|
func apply_age_physics():
|
|
# Sicherheitscheck
|
|
if not player_body:
|
|
printerr("ACHTUNG: PlayerBody ist im Inspektor nicht zugewiesen!")
|
|
return
|
|
|
|
# Hier ändern wir die Min/Max Werte des XRToolsPlayerBody
|
|
match current_age:
|
|
AgeState.BABY:
|
|
# Baby: Sehr klein
|
|
# Min muss niedrig sein für Krabbeln/Ducken
|
|
player_body.player_height_min = 0.2
|
|
# Max begrenzt die Kapselhöhe auf ca. 60cm
|
|
player_body.player_height_max = 0.6
|
|
player.translate(Vector3(0, 0.05, 0))
|
|
|
|
AgeState.CHILD:
|
|
# Kind: Mittelgroß
|
|
player_body.player_height_min = 0.3
|
|
# Max begrenzt auf ca. 1.20m
|
|
player_body.player_height_max = 1.2
|
|
player.translate(Vector3(0, 0.05, 0))
|
|
|
|
AgeState.TEEN:
|
|
# Teenager: Standard VR Werte (Groß)
|
|
player_body.player_height_min = 0.6
|
|
# Max ist hoch genug für jeden Erwachsenen (2.5m ist Standard-Puffer)
|
|
player_body.player_height_max = 2.5
|
|
player.translate(Vector3(0, 0.05, 0))
|
|
|
|
func update_visuals():
|
|
# Ändert die Farbe der Uhr zur Bestätigung
|
|
if visual_mesh and visual_mesh.material:
|
|
# Falls das Material nicht unique ist, erstellen wir eine Kopie, damit nicht alle Meshes die Farbe ändern
|
|
if not visual_mesh.material.resource_local_to_scene:
|
|
visual_mesh.material = visual_mesh.material.duplicate()
|
|
|
|
var mat = visual_mesh.material as StandardMaterial3D
|
|
match current_age:
|
|
AgeState.BABY:
|
|
mat.albedo_color = Color.HOT_PINK # Baby
|
|
AgeState.CHILD:
|
|
mat.albedo_color = Color.ORANGE # Kind
|
|
AgeState.TEEN:
|
|
mat.albedo_color = Color.GRAY # Teen
|