Benutzer-Werkzeuge

Webseiten-Werkzeuge


godot

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
godot [2025/01/01 22:03]
jango [CharacterBody2D]
godot [2025/01/31 10:18] (aktuell)
jango [Links]
Zeile 1: Zeile 1:
 [[https://github.com/godotengine/godot|Godot]] ist eine kostenlose Open Source [[gameengine|Game Engine]] unter [[https://github.com/godotengine/godot/blob/master/LICENSE.txt|MIT Lizenz]]. [[https://github.com/godotengine/godot|Godot]] ist eine kostenlose Open Source [[gameengine|Game Engine]] unter [[https://github.com/godotengine/godot/blob/master/LICENSE.txt|MIT Lizenz]].
  
-{{https://godotengine.org/assets/features/editor-frame.png}}+[[https://www.youtube.com/watch?v=9i6uxm_ioG0|Clipping]]
  
 =====Bodies===== =====Bodies=====
Zeile 182: Zeile 182:
  if position.x > 5.0 or position.x < -5.0:  if position.x > 5.0 or position.x < -5.0:
  speed = -speed  speed = -speed
 +</code>
 +
 +====Raycast2D====
 +
 +<code>
 +extends Raycast2D
 +
 +var raycast_length = 10.0 
 +
 +func _ready():
 +    raycast.target_position = Vector2(0, raycast_length)
 +    raycast.enabled = true
 +
 +func _physics_process(delta):
 +    if is_colliding():
 +        print("Der Raycast kollidiert.")
 +    else:
 +        print("Der Raycast kollidiert nicht.")
 +</code>
 +
 +<code>
 +extends CharacterBody2D
 +
 +var raycast_length = 10.0 
 +var raycast: RayCast2D
 +
 +func _ready():
 +    raycast = RayCast2D.new()
 +    raycast.target_position = Vector2(0, raycast_length)
 +    raycast.enabled = true
 +    add_child(raycast)
 +
 +func _process(delta):
 +    if raycast.is_colliding():
 +        print("Der Raycast kollidiert.")
 +    else:
 +        print("Der Raycast kollidiert nicht.")
 </code> </code>
  
Zeile 208: Zeile 245:
 </code> </code>
  
 +<code>
 +func shoot():
 +    var space = get_world_3d().direct_space_state
 +    var query = PhysicsRayQueryParameters3D.create(
 +    global_position,
 +    global_position - global_transform.basis.z * 2
 +    )
 +    var collision = space.intersect_ray(query)
 +    if collision:
 +        print(collision.collider.name)
 +</code>
 =====Signals===== =====Signals=====
  
Zeile 422: Zeile 470:
  
 ====CharacterBody3D==== ====CharacterBody3D====
 +
 +Player Controller
 +
 +<code>
 +extends CharacterBody3D
 +
 +@onready var head = $SpringArm3D/Head
 +@onready var collision_shape = $CollisionShape3D  
 +@onready var camera = $SpringArm3D/Head
 +
 +var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
 +var speed = 4.0  
 +var jump_speed = 6.0
 +var mouse_sensitivity = 0.002  
 +var vertical_angle = 0.0
 +
 +var is_crouching = false
 +var crouch_height = 0.5 
 +var standing_height = 1.8 
 +
 +func _ready():
 + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
 +
 +func shoot():
 + var space = get_world_3d().direct_space_state
 + var query = PhysicsRayQueryParameters3D.create(
 + head.global_position,
 + head.global_position - head.global_transform.basis.z * 2
 + )
 + var collision = space.intersect_ray(query)
 + if collision:
 + print(collision.collider.name)
 +
 +func get_input():
 + shoot()
 + var input = Input.get_vector("move_left", "move_right", "move_forward", "move_backward")
 + var movement_dir = transform.basis * Vector3(input.x, 0, input.y)
 + velocity.x = movement_dir.x * speed
 + velocity.z = movement_dir.z * speed
 + if Input.is_action_just_pressed("crouch") and is_on_floor():
 + toggle_crouch()
 + if Input.is_action_just_pressed("Escape"):
 + if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
 + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
 + else:
 + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
 + if Input.is_action_pressed("jump") and is_on_floor():
 + velocity.y = jump_speed
 +
 +func _process(delta):
 + pass #check_collision()
 +
 +func check_collision():
 + var space_state = get_world_3d().direct_space_state
 + var transform = global_transform
 + var query = PhysicsShapeQueryParameters3D.new()
 + query.shape = collision_shape.shape
 + query.transform = transform
 + #query.collide_with_areas = true  # Nur Areas berücksichtigen
 + var results = space_state.intersect_shape(query)
 + for result in results:
 + if result.collider:
 + print("Kollision mit:", result.collider.name)
 +
 +
 +func _physics_process(delta):
 + velocity.y += -gravity * delta
 + get_input()
 + move_and_slide()
 +
 +func toggle_crouch():
 + if is_crouching:
 + is_crouching = false
 + collision_shape.shape.height = standing_height
 + head.position.y = standing_height  # Kamera anpassen
 + else:
 + is_crouching = true
 + collision_shape.shape.height = crouch_height
 + head.position.y = crouch_height  # Kamera anpassen
 +
 +func _unhandled_input(event):
 + if event is InputEventMouseMotion:
 + # Horizontale Charakterrotation (um die y-Achse)
 + rotate_y(-event.relative.x * mouse_sensitivity)
 + # Vertikale Kamerarotation (um die x-Achse des SpringArm3D)
 + vertical_angle -= event.relative.y * mouse_sensitivity
 + vertical_angle = clamp(vertical_angle, -PI / 2, PI / 2)  # Begrenzung der vertikalen Rotation auf +-90°
 + head.rotation.x = vertical_angle
 +</code>
 +
 +Plane Controller
 <code> <code>
 extends CharacterBody3D extends CharacterBody3D
  
-@export var maxSpeed :float = 10.0+@export var maxSpeed :float = 1.0
 @export var turnRate :float = 0.1 @export var turnRate :float = 0.1
 @onready var Gravity = ProjectSettings.get_setting("physics/3d/default_gravity") @onready var Gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
Zeile 446: Zeile 585:
 func _rotate(): func _rotate():
  var yaw = Input.get_axis("move_right", "move_left") # Y Axis  var yaw = Input.get_axis("move_right", "move_left") # Y Axis
- var roll = 0 #Input.get_axis("RollLeft", "RollRight") # Z Axis + var roll = Input.get_axis("ui_left", "ui_right") # Z Axis 
- var pitch = 0 #Input.get_axis("PitchUp", "PitchDown") # X Axis+ var pitch = Input.get_axis("ui_down", "ui_up") # X Axis
  var direction = Vector3(pitch, yaw, roll) * turnRate  var direction = Vector3(pitch, yaw, roll) * turnRate
  if direction:   if direction: 
Zeile 455: Zeile 594:
 </code> </code>
  
-<code> 
-extends CharacterBody2D 
- 
-@onready var collision_shape = $CollisionShape2D 
- 
-var gravity = ProjectSettings.get_setting("physics/2d/default_gravity" 
-var speed = 50 
-  
-func _physics_process(delta): 
- var direction = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") 
- if direction: 
- velocity = direction * speed 
- else: 
- velocity.x = move_toward(velocity.x, 0, speed) 
- velocity.y = move_toward(velocity.y, 0, speed) 
- velocity.y += gravity * delta 
-  
- move_and_slide() 
- #move_and_collide(velocity) 
-  
- #check_collision() 
- var collisions = get_slide_collision_count() 
- if collisions: 
- for collision in collisions: 
- print(get_slide_collision(collision)) 
- 
- if $RayCast2D.is_colliding(): 
- print("[CharacterBody2D:raycast] Raycast colliding"); 
- 
-func check_collision(): 
- var space_state = get_world_2d().direct_space_state 
- var transform = global_transform 
- var query = PhysicsShapeQueryParameters2D.new() 
- query.shape = collision_shape.shape 
- query.transform = transform 
- var results = space_state.intersect_shape(query) 
- for result in results: 
- if result.collider and result.collider.name != "CharacterBody2D": 
- print("[CharacterBody2D:intersect_shape] Kollision mit:", result.collider.name) 
-</code> 
  
 =====VehicleBody3D===== =====VehicleBody3D=====
Zeile 519: Zeile 618:
                 child.engine_force = engine_force                 child.engine_force = engine_force
 </code> </code>
 +
 +
 +=====Networking=====
 +
 +====RPC====
 +
 +[[https://www.youtube.com/watch?v=frjU-WC_pwg|Youtube]]
 +
 +<code>
 +func _process():
 +    rpc("rpc_function") # will transfer reliable
 +    rpc_unreliable("rpc_function") # will transfer unreliable
 +    rpc_function.rpc()
 +    rpc_function.rpc_id(peer_id) # call it on a specified peer
 +    
 +@rpc(mode, sync, transfer, channel)
 +func rpc_function():
 +    var sender = multiplayer.get_remote_sender_id()
 +    if sender == get_multiplayer_authority():
 +        do_stuff()
 +</code>
 +
 +===Mode===
 +
 +Von wem kann die Funktion ausgeführt werden. Default ist "authority". Man kann die Multiplayer Authority mit der Funktion
 +
 +<code>
 +Node.set_multiplayer_authority()
 +</code>
 +
 +auf einer per-Peer-Basis konfigurieren.
 +
 +  * authority: Funktion kann **nur von dem Peer der die Multiplayer Authority hat** ausgeführt werden, nicht von anderen peers
 +  * any_peer: Funktion kann **von jedem peer** ausgeführt werden
 +
 +===Sync===
 +
 +Wo wird die Funktion ausgeführt. Nur remote oder auch lokal.
 +
 +  * call_remote: Funktion kann **nur Remote** ausgeführt werden
 +  * call_local: Funktion wird beim Aufruf **remote und auch lokal** ausgeführt
 +
 +===Transfer===
 +
 +  * unreliable: UDP
 +  * unreliable_ordered: UDP
 +  * reliable: TCP
 +
 +===Channel===
 +
 +Muss immer das letzte Argument sein.
 =====Links===== =====Links=====
  
Zeile 527: Zeile 677:
   * [[https://www.youtube.com/watch?v=Wj1FfilAe2Y|Godot 4 VehicleBody3d Tutorial]]   * [[https://www.youtube.com/watch?v=Wj1FfilAe2Y|Godot 4 VehicleBody3d Tutorial]]
   * [[https://www.youtube.com/watch?v=xIKErMgJ1Yk|First Person CharacterController]]   * [[https://www.youtube.com/watch?v=xIKErMgJ1Yk|First Person CharacterController]]
 +  * [[https://www.youtube.com/watch?v=h8BmeRRGWxI|First-Person Shooter in Godot 4.0 - Overview]]
   * [[https://www.youtube.com/watch?v=4nOEVPjVmjc|Bezier Curves und Splines]]   * [[https://www.youtube.com/watch?v=4nOEVPjVmjc|Bezier Curves und Splines]]
   * [[https://github.com/TheDuckCow/godot-road-generator|Godot Road Generator AddOn]]   * [[https://github.com/TheDuckCow/godot-road-generator|Godot Road Generator AddOn]]
   * [[https://www.youtube.com/watch?v=n8D3vEx7NAE|Godot Multiplayer FPS Tutorial + project source]]   * [[https://www.youtube.com/watch?v=n8D3vEx7NAE|Godot Multiplayer FPS Tutorial + project source]]
   * [[https://www.youtube.com/watch?v=_ItA2r69c-Q|Godot 4 Makes Multiplayer EASY!]]   * [[https://www.youtube.com/watch?v=_ItA2r69c-Q|Godot 4 Makes Multiplayer EASY!]]
 +  * [[https://www.youtube.com/watch?v=K62jDMLPToA|ENet Multiplayer in 3 Minutes]]
 +  * [[https://github.com/mohsenph69/Godot-MTerrain-plugin|MTerrain Plugin]]
 +  * [[https://www.youtube.com/watch?v=s1s1zdTGliQ|MTerrain Curve Deformation]]
godot.1735765382.txt.gz · Zuletzt geändert: 2025/01/01 22:03 von jango