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:// |