master
parent
0bcaee209d
commit
d7b1fbc1d1
39
AgePlayer.gd
39
AgePlayer.gd
|
|
@ -1,39 +0,0 @@
|
||||||
extends XROrigin3D
|
|
||||||
|
|
||||||
# Gleiches Enum zur Sicherheit
|
|
||||||
enum AgeState { BABY, CHILD, TEEN }
|
|
||||||
|
|
||||||
# Skalierungs-Faktoren (XROrigin Scale)
|
|
||||||
# < 1.0 macht dich klein (Welt wirkt riesig)
|
|
||||||
# 1.0 ist Normalgröße
|
|
||||||
var scale_baby = 0.3 # ca. 30% Größe (Baby)
|
|
||||||
var scale_child = 0.65 # ca. 65% Größe (Kind)
|
|
||||||
var scale_teen = 1.0 # 100% Größe (Teenager)
|
|
||||||
|
|
||||||
func _ready():
|
|
||||||
# Wir starten initial als Baby
|
|
||||||
apply_scale(scale_baby)
|
|
||||||
|
|
||||||
# Diese Funktion muss mit dem Signal der Uhr verbunden werden
|
|
||||||
func _on_watch_age_changed(new_age_state):
|
|
||||||
match new_age_state:
|
|
||||||
AgeState.BABY:
|
|
||||||
tween_scale(scale_baby)
|
|
||||||
AgeState.CHILD:
|
|
||||||
tween_scale(scale_child)
|
|
||||||
AgeState.TEEN:
|
|
||||||
tween_scale(scale_teen)
|
|
||||||
|
|
||||||
func tween_scale(target_scale_value: float):
|
|
||||||
# Wir nutzen Tween für einen sanften Übergang (vermeidet Übelkeit)
|
|
||||||
var tween = create_tween()
|
|
||||||
|
|
||||||
# Wir skalieren den gesamten XROrigin
|
|
||||||
# Vector3.ONE * target_scale ergibt (x, y, z) mit dem gleichen Wert
|
|
||||||
tween.tween_property(self, "scale", Vector3.ONE * target_scale_value, 0.5).set_trans(Tween.TRANS_SINE)
|
|
||||||
|
|
||||||
print("Skaliere Spieler zu: ", target_scale_value)
|
|
||||||
|
|
||||||
func apply_scale(val: float):
|
|
||||||
# Harte Skalierung ohne Animation (für den Start)
|
|
||||||
scale = Vector3.ONE * val
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
uid://due6c7nr73hxe
|
|
||||||
129
ChronoWatch.gd
129
ChronoWatch.gd
|
|
@ -1,48 +1,41 @@
|
||||||
extends Node3D
|
extends Node3D
|
||||||
|
|
||||||
# Wir definieren unsere 3 Altersstufen
|
# Wir definieren unsere 2 Altersstufen
|
||||||
enum AgeState { BABY, CHILD, TEEN }
|
enum AgeState { BABY, TEEN }
|
||||||
|
|
||||||
# Startalter ist BABY
|
|
||||||
var current_age = AgeState.BABY
|
var current_age = AgeState.BABY
|
||||||
|
|
||||||
# Referenzen zu den anderen Nodes (müssen im Inspektor zugewiesen werden)
|
# Referenzen zu den anderen Nodes
|
||||||
@export var controller : XRController3D
|
@export var controller : XRController3D
|
||||||
@export var player_body : CharacterBody3D
|
@export var player_body : CharacterBody3D
|
||||||
@export var player : XROrigin3D
|
@export var player : XROrigin3D
|
||||||
|
@export var world_env : WorldEnvironment
|
||||||
|
@export var movement_direct : Node
|
||||||
|
|
||||||
# Referenz zum Aussehen der Uhr (für Farbänderung)
|
# NEU: Referenz zur Kamera für den FOV-Effekt
|
||||||
@onready var visual_mesh = $Player
|
@export var camera : Camera3D
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
# 1. Controller finden, falls nicht zugewiesen
|
|
||||||
if not controller:
|
if not controller:
|
||||||
# Wir gehen im Baum nach oben: Watch -> Area3D -> RightController
|
|
||||||
controller = get_parent().get_parent()
|
controller = get_parent().get_parent()
|
||||||
|
|
||||||
# 2. Signal verbinden
|
|
||||||
if controller:
|
if controller:
|
||||||
controller.button_pressed.connect(_on_button_pressed)
|
controller.button_pressed.connect(_on_button_pressed)
|
||||||
print("Uhr verbunden mit Controller: ", controller.name)
|
print("Uhr verbunden mit Controller: ", controller.name)
|
||||||
else:
|
|
||||||
printerr("FEHLER: Kein Controller gefunden!")
|
|
||||||
|
|
||||||
# 3. Initiale Werte setzen (damit wir als Baby starten)
|
# Initial einmal hart setzen
|
||||||
apply_age_physics()
|
apply_age_physics(false)
|
||||||
update_visuals()
|
|
||||||
|
|
||||||
func _on_button_pressed(button_name: String):
|
func _on_button_pressed(button_name: String):
|
||||||
# Input Abfrage (A/B oder X/Y je nach Controller)
|
|
||||||
match button_name:
|
match button_name:
|
||||||
"trigger_click": # Älter werden
|
"trigger_click": # Älter
|
||||||
change_age(1)
|
change_age(1)
|
||||||
"grip_click": # Jünger werden
|
"grip_click": # Jünger
|
||||||
change_age(-1)
|
change_age(-1)
|
||||||
|
|
||||||
func change_age(direction: int):
|
func change_age(direction: int):
|
||||||
var new_age_value = current_age + direction
|
var new_age_value = current_age + direction
|
||||||
|
|
||||||
# Begrenzen: Nicht jünger als Baby, nicht älter als Teen
|
|
||||||
if new_age_value < AgeState.BABY:
|
if new_age_value < AgeState.BABY:
|
||||||
print("Du bist schon ein Baby!")
|
print("Du bist schon ein Baby!")
|
||||||
return
|
return
|
||||||
|
|
@ -50,56 +43,70 @@ func change_age(direction: int):
|
||||||
print("Du bist schon erwachsen!")
|
print("Du bist schon erwachsen!")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Wenn gültig, Alter ändern
|
|
||||||
current_age = new_age_value
|
current_age = new_age_value
|
||||||
print("Alter geändert zu: ", AgeState.keys()[current_age])
|
print("Wechsle Alter zu: ", AgeState.keys()[current_age])
|
||||||
|
|
||||||
# Physik und Aussehen aktualisieren
|
apply_age_physics(true)
|
||||||
apply_age_physics()
|
|
||||||
update_visuals()
|
|
||||||
|
|
||||||
func apply_age_physics():
|
func apply_age_physics(animate: bool = true):
|
||||||
# Sicherheitscheck
|
# Sicherheitscheck erweitert um Camera
|
||||||
if not player_body:
|
if not player_body or not world_env or not movement_direct or not camera:
|
||||||
printerr("ACHTUNG: PlayerBody ist im Inspektor nicht zugewiesen!")
|
printerr("FEHLER: Bitte ALLE Nodes (auch Camera) im Inspektor zuweisen!")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Hier ändern wir die Min/Max Werte des XRToolsPlayerBody
|
# Ziel-Werte definieren
|
||||||
|
var target_saturation = 1.0
|
||||||
|
var target_height_max = 0.0
|
||||||
|
var target_height_min = 0.0
|
||||||
|
var target_speed = 0.0
|
||||||
|
var target_fov = 75.0 # NEU: Variable für FOV
|
||||||
|
var translation_step = Vector3.ZERO
|
||||||
|
|
||||||
match current_age:
|
match current_age:
|
||||||
AgeState.BABY:
|
AgeState.BABY:
|
||||||
# Baby: Sehr klein
|
target_saturation = 2.0
|
||||||
# Min muss niedrig sein für Krabbeln/Ducken
|
target_height_min = 0.2
|
||||||
player_body.player_height_min = 0.2
|
target_height_max = 0.6
|
||||||
# Max begrenzt die Kapselhöhe auf ca. 60cm
|
target_speed = 1.0
|
||||||
player_body.player_height_max = 0.6
|
target_fov = 40.0 # NEU: Enger Blick (Baby Tunnelblick)
|
||||||
player.translate(Vector3(0, 0.05, 0))
|
translation_step = 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:
|
AgeState.TEEN:
|
||||||
# Teenager: Standard VR Werte (Groß)
|
target_saturation = 0.5
|
||||||
player_body.player_height_min = 0.6
|
target_height_min = 0.6
|
||||||
# Max ist hoch genug für jeden Erwachsenen (2.5m ist Standard-Puffer)
|
target_height_max = 2.5
|
||||||
player_body.player_height_max = 2.5
|
target_speed = 3.0
|
||||||
player.translate(Vector3(0, 0.05, 0))
|
target_fov = 75.0 # NEU: Normaler Blick
|
||||||
|
translation_step = Vector3(0, 0.5, 0)
|
||||||
|
|
||||||
func update_visuals():
|
# Sofortige Änderungen (Sicherheit)
|
||||||
# Ändert die Farbe der Uhr zur Bestätigung
|
if animate:
|
||||||
if visual_mesh and visual_mesh.material:
|
player.translate(translation_step)
|
||||||
# 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:
|
player_body.player_height_min = target_height_min
|
||||||
visual_mesh.material = visual_mesh.material.duplicate()
|
|
||||||
|
if animate:
|
||||||
var mat = visual_mesh.material as StandardMaterial3D
|
# --- ANIMATION START ---
|
||||||
match current_age:
|
var tween = create_tween()
|
||||||
AgeState.BABY:
|
tween.set_parallel(true)
|
||||||
mat.albedo_color = Color.HOT_PINK # Baby
|
tween.set_trans(Tween.TRANS_SINE)
|
||||||
AgeState.CHILD:
|
tween.set_ease(Tween.EASE_IN_OUT)
|
||||||
mat.albedo_color = Color.ORANGE # Kind
|
|
||||||
AgeState.TEEN:
|
# 1. Environment Sättigung
|
||||||
mat.albedo_color = Color.GRAY # Teen
|
tween.tween_property(world_env.environment, "adjustment_saturation", target_saturation, 1.0)
|
||||||
|
|
||||||
|
# 2. Körpergröße
|
||||||
|
tween.tween_property(player_body, "player_height_max", target_height_max, 1.0)
|
||||||
|
|
||||||
|
# 3. Geschwindigkeit
|
||||||
|
tween.tween_property(movement_direct, "max_speed", target_speed, 1.0)
|
||||||
|
|
||||||
|
# 4. Kamera FOV (NEU)
|
||||||
|
tween.tween_property(camera, "fov", target_fov, 1.0)
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Start-Setup (Hart setzen)
|
||||||
|
world_env.environment.adjustment_saturation = target_saturation
|
||||||
|
player_body.player_height_max = target_height_max
|
||||||
|
movement_direct.max_speed = target_speed
|
||||||
|
camera.fov = target_fov # NEU
|
||||||
|
|
|
||||||
182
level.tscn
182
level.tscn
File diff suppressed because one or more lines are too long
|
|
@ -39,12 +39,14 @@ hand_offset_mode = 4
|
||||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="RightController/Area3D"]
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="RightController/Area3D"]
|
||||||
shape = SubResource("BoxShape3D_hqtel")
|
shape = SubResource("BoxShape3D_hqtel")
|
||||||
|
|
||||||
[node name="Watch" type="Node3D" parent="RightController/Area3D" node_paths=PackedStringArray("controller", "player_body", "player")]
|
[node name="Watch" type="Node3D" parent="RightController/Area3D" node_paths=PackedStringArray("controller", "player_body", "player", "movement_direct", "camera")]
|
||||||
transform = Transform3D(0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0)
|
transform = Transform3D(0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0)
|
||||||
script = ExtResource("4_sweqy")
|
script = ExtResource("4_sweqy")
|
||||||
controller = NodePath("../..")
|
controller = NodePath("../..")
|
||||||
player_body = NodePath("../../../PlayerBody")
|
player_body = NodePath("../../../PlayerBody")
|
||||||
player = NodePath("../../..")
|
player = NodePath("../../..")
|
||||||
|
movement_direct = NodePath("../../../LeftController/MovementDirect")
|
||||||
|
camera = NodePath("../../../Camera")
|
||||||
|
|
||||||
[node name="Sketchfab_Scene" parent="RightController/Area3D/Watch" instance=ExtResource("6_1jxqw")]
|
[node name="Sketchfab_Scene" parent="RightController/Area3D/Watch" instance=ExtResource("6_1jxqw")]
|
||||||
transform = Transform3D(0.00025759128, -0.0019833425, 0, 0.0018915471, 0.00024566916, -0.0006014116, 0.00059640256, 7.745919e-05, 0.001907434, 0, -0.034, 0.108)
|
transform = Transform3D(0.00025759128, -0.0019833425, 0, 0.0018915471, 0.00024566916, -0.0006014116, 0.00059640256, 7.745919e-05, 0.001907434, 0, -0.034, 0.108)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue