GoDot CollisionShape3D höhe ändern? GoDot4?
Hallo. Ich beschäftige mich seit ca. einer Woche mit der GameEngine GoDot, komme aber nicht wirklich weiter. Im Internet habe ich zu meinem Problem leider keine Lösung gefunden. Ich würde mich freuen, wenn hier jemand weiß, wie ich das Script schreiben muss:
Ich bin gerade dabei, einen steuerbaren Spieler zu erstellen, hab ihn auch, bis auf den einen Punkt, der nicht funktioniert auch schon fertig.
Mein Ziel ist es, dass der Spieler sich ducken kann. Dazu möchte ich die height des Collisionshape3D von 2 auf 1 ändern, wärend Input.is_action_pressed("sneak"): aktiv ist. Beim loslassen (else) es wieder auf 2 gestellt werden.
Hier der Aufbau meiner Nodes für den Spieler:
Player (ist ein Node3D)
CharacterBody3D
CollisionShape3D
Camera3D
Und hier mein Script, welches für das Movement vernatwortlich ist:
extends CharacterBody3D
@onready var Camera3D2CharacterBody = $"Camera3D"
var SPEED = 7.0
var JUMP_VELOCITY = 6
var CAN_JUMP = true
# Get the gravity
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
# Get Userinputs
func _input(event):
if event is InputEventMouseMotion:
var rotation_speed = event.relative.x * Camera3D2CharacterBody.sensitivity
rotate_y(deg_to_rad(-rotation_speed))
# Sneaken und sprinten
if Input.is_action_pressed("sneak"):
SPEED = 3
Camera3D2CharacterBody.position.y = 0.3
# Hier soll die Zeile hin, die die Höhe von CollisionShape3D auf 1 setzt.
elif Input.is_action_pressed("sprint"):
SPEED = 11.0
else:
SPEED = 7.0
# Hier soll die Zeile hin, die die Höhe von CollisionShape3D wieder auf 2 setzt.
Camera3D2CharacterBody.position.y = 0.629
func _physics_process(delta):
# Add the gravity.
if not is_on_floor():
velocity.y -= gravity * delta
# Handle Jump.
if Input.is_action_just_pressed("jump") and is_on_floor():
velocity.y = JUMP_VELOCITY
CAN_JUMP = true
if Input.is_action_just_pressed("jump") and CAN_JUMP:
velocity.y = JUMP_VELOCITY
CAN_JUMP = false
if is_on_floor():
CAN_JUMP = true
# Get the input direction and handle the movement/deceleration.
# As good practice, you should replace UI actions with custom gameplay actions.
var input_dir = Input.get_vector("laufen_links", "laufen_rechts", "laufen_vorwärts", "laufen_rückwärts")
var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
if direction:
velocity.x = direction.x * SPEED
velocity.z = direction.z * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
velocity.z = move_toward(velocity.z, 0, SPEED)
move_and_slide()
1 Antwort
Das musste über scale.y machen - und evtl dann auch noch die Position des CollisionShapes bei geduckter Position anpassen
func _input(event):
if event.is_action_pressed("ducken"):
$"CollisionShape3D".scale.y = 1
else:
$"CollisionShape3D".scale.y = 2
Kein Problem....
kommt da echt ne Fehlermeldung? - Aber ok, du kannst natürich auch direkt den "height" Wert des CollisionShape anpassen:
$"CollisionShape3D".shape.height = 1
Nachrag - ich habe das gerade mal getestet - klappt auch :-) - Problem ist aber das Input event im Allgemeinen....wie genau willste das denn machen. Also, solange die "Ducken" Taste gedrückt ist, soll er sich ducken - und nur einmal kurz die Taste drücken und er bleibt geduckt und steht erst bei einer anderen Aktion wieder "auf"?
Ich habe ja weiter oben im Code festgelegt, wie man Sprinter. So, wie ich es eingegeben habe, Sprinter er nur, wenn springen gedrückt gehalten wird. Genau so soll es auch mit den Ducken sein.
Aber scale ändert doch nicht den Wert height sondern den Wert y im Transformation Bereich, oder? Wenn man dort etwas verändert kommt immer die Meldung, dass die Collision evt. nicht so funktioniert, wie sie soll.
Ich werde es später Mal ausprobieren.
Vielen Dank für die Antwort 👍🏻