Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| 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:// | [[https:// | ||
| - | {{https://godotengine.org/assets/ | + | [[https://www.youtube.com/watch? |
| =====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 | ||
| + | </ | ||
| + | |||
| + | ====Raycast2D==== | ||
| + | |||
| + | < | ||
| + | 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(" | ||
| + | else: | ||
| + | print(" | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | 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(" | ||
| + | else: | ||
| + | print(" | ||
| </ | </ | ||
| Zeile 208: | Zeile 245: | ||
| </ | </ | ||
| + | < | ||
| + | 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) | ||
| + | </ | ||
| =====Signals===== | =====Signals===== | ||
| Zeile 422: | Zeile 470: | ||
| ====CharacterBody3D==== | ====CharacterBody3D==== | ||
| + | |||
| + | Player Controller | ||
| + | |||
| + | < | ||
| + | extends CharacterBody3D | ||
| + | |||
| + | @onready var head = $SpringArm3D/ | ||
| + | @onready var collision_shape = $CollisionShape3D | ||
| + | @onready var camera = $SpringArm3D/ | ||
| + | |||
| + | var gravity = ProjectSettings.get_setting(" | ||
| + | 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(" | ||
| + | var movement_dir = transform.basis * Vector3(input.x, | ||
| + | velocity.x = movement_dir.x * speed | ||
| + | velocity.z = movement_dir.z * speed | ||
| + | if Input.is_action_just_pressed(" | ||
| + | toggle_crouch() | ||
| + | if Input.is_action_just_pressed(" | ||
| + | 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(" | ||
| + | velocity.y = jump_speed | ||
| + | |||
| + | func _process(delta): | ||
| + | pass # | ||
| + | |||
| + | 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 | ||
| + | # | ||
| + | var results = space_state.intersect_shape(query) | ||
| + | for result in results: | ||
| + | if result.collider: | ||
| + | print(" | ||
| + | |||
| + | |||
| + | 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 | ||
| + | else: | ||
| + | is_crouching = true | ||
| + | collision_shape.shape.height = crouch_height | ||
| + | head.position.y = crouch_height | ||
| + | |||
| + | 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, | ||
| + | head.rotation.x = vertical_angle | ||
| + | </ | ||
| + | |||
| + | Plane Controller | ||
| < | < | ||
| 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(" | @onready var Gravity = ProjectSettings.get_setting(" | ||
| Zeile 446: | Zeile 585: | ||
| func _rotate(): | func _rotate(): | ||
| var yaw = Input.get_axis(" | var yaw = Input.get_axis(" | ||
| - | var roll = 0 #Input.get_axis(" | + | var roll = Input.get_axis(" |
| - | var pitch = 0 #Input.get_axis(" | + | var pitch = Input.get_axis(" |
| var direction = Vector3(pitch, | var direction = Vector3(pitch, | ||
| if direction: | if direction: | ||
| Zeile 455: | Zeile 594: | ||
| </ | </ | ||
| - | < | ||
| - | extends CharacterBody2D | ||
| - | |||
| - | @onready var collision_shape = $CollisionShape2D | ||
| - | |||
| - | var gravity = ProjectSettings.get_setting(" | ||
| - | var speed = 50 | ||
| - | |||
| - | func _physics_process(delta): | ||
| - | var direction = Input.get_vector(" | ||
| - | if direction: | ||
| - | velocity = direction * speed | ||
| - | else: | ||
| - | velocity.x = move_toward(velocity.x, | ||
| - | velocity.y = move_toward(velocity.y, | ||
| - | velocity.y += gravity * delta | ||
| - | |||
| - | move_and_slide() | ||
| - | # | ||
| - | |||
| - | # | ||
| - | var collisions = get_slide_collision_count() | ||
| - | if collisions: | ||
| - | for collision in collisions: | ||
| - | print(get_slide_collision(collision)) | ||
| - | |||
| - | if $RayCast2D.is_colliding(): | ||
| - | print(" | ||
| - | |||
| - | 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 != " | ||
| - | print(" | ||
| - | </ | ||
| =====VehicleBody3D===== | =====VehicleBody3D===== | ||
| Zeile 519: | Zeile 618: | ||
| child.engine_force = engine_force | child.engine_force = engine_force | ||
| </ | </ | ||
| + | |||
| + | |||
| + | =====Networking===== | ||
| + | |||
| + | ====RPC==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | < | ||
| + | func _process(): | ||
| + | rpc(" | ||
| + | rpc_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() | ||
| + | </ | ||
| + | |||
| + | ===Mode=== | ||
| + | |||
| + | Von wem kann die Funktion ausgeführt werden. Default ist " | ||
| + | |||
| + | < | ||
| + | Node.set_multiplayer_authority() | ||
| + | </ | ||
| + | |||
| + | 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: | ||
| + | * call_local: Funktion wird beim Aufruf **remote und auch lokal** ausgeführt | ||
| + | |||
| + | ===Transfer=== | ||
| + | |||
| + | * unreliable: UDP | ||
| + | * unreliable_ordered: | ||
| + | * reliable: TCP | ||
| + | |||
| + | ===Channel=== | ||
| + | |||
| + | Muss immer das letzte Argument sein. | ||
| =====Links===== | =====Links===== | ||
| Zeile 527: | Zeile 677: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||