Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
|
godot [2025/11/12 22:16] jango angelegt |
godot [2026/11/04 13:59] (aktuell) jango [GDScript] |
||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | [[https:// | ||
| + | [[https:// | ||
| + | |||
| + | =====Bodies===== | ||
| + | |||
| + | In Godot gibt es verschiedene Arten von Körpern (Bodies), die verwendet werden können, um die physikalischen Eigenschaften von Objekten in einer Spielwelt zu simulieren. Hier sind die wichtigsten Körperarten in Godot: | ||
| + | |||
| + | * StaticBody: Ein StaticBody ist ein starrer Körper, der von der Physik-Engine nicht beeinflusst wird. Er bleibt an einem festen Ort und kann nicht bewegt werden. Er wird oft für statische Elemente wie Wände, Böden und Plattformen verwendet. | ||
| + | * RigidBody: Ein RigidBody ist ein dynamischer Körper, der von der Physik-Engine beeinflusst wird. Er reagiert auf Kräfte wie Schwerkraft und Kollisionen mit anderen Körpern. RigidBody-Objekte sind in der Lage, sich zu bewegen und können aufgrund von Kräften beschleunigen. | ||
| + | * KinematicBody: | ||
| + | * Area: Ein Area ist ein unsichtbarer Körper, der nur Kollisionen registriert, | ||
| + | * MultiMeshInstance: | ||
| + | * VehicleBody: | ||
| + | * Distanz-Gelenk (DistanceJoint2D, | ||
| + | * Gelenk mit eingeschränktem Abstand (DampedSpringJoint2D, | ||
| + | * Gelenk mit eingeschränktem Winkel (RevoluteJoint2D, | ||
| + | * Schiebergelenk (SliderJoint2D, | ||
| + | * Gelenk mit konstanter Richtung (GrooveJoint2D, | ||
| + | * Können-Gelenk (ConeTwistJoint): | ||
| + | * Gelenk zur Vermeidung von Kollisionen (GearJoint2D, | ||
| + | * PrismaticJoint2D: | ||
| + | |||
| + | =====Mesh===== | ||
| + | |||
| + | <code gdscript> | ||
| + | extends Node | ||
| + | |||
| + | func _ready(): | ||
| + | _ready1() | ||
| + | |||
| + | func _ready1(): | ||
| + | var myMesh = MeshInstance3D.new() | ||
| + | myMesh.mesh = PlaneMesh.new() | ||
| + | var size = Vector3(15.0, | ||
| + | myMesh.scale = size | ||
| + | myMesh.create_convex_collision(true, | ||
| + | add_child(myMesh) | ||
| + | var camera = Camera3D.new() | ||
| + | camera.position = Vector3(0, 2, 2) | ||
| + | add_child(camera) | ||
| + | |||
| + | func _ready2(): | ||
| + | var myMesh = MeshInstance3D.new() | ||
| + | var custom_plane = create_custom_plane(Vector3(15, | ||
| + | myMesh.mesh = custom_plane | ||
| + | myMesh.scale = Vector3(15, 1, 15) | ||
| + | myMesh.rotation_degrees = Vector3(180, | ||
| + | add_child(myMesh) | ||
| + | var camera = Camera3D.new() | ||
| + | camera.position = Vector3(0, 2, 2) | ||
| + | add_child(camera) | ||
| + | |||
| + | func create_custom_plane(size: | ||
| + | var array_mesh = ArrayMesh.new() | ||
| + | var vertices = PackedVector3Array() | ||
| + | var indices = PackedInt32Array() | ||
| + | var uvs = PackedVector2Array() | ||
| + | var half_width = size.x / 2 | ||
| + | var half_height = size.z / 2 | ||
| + | # Vertices und UVs erstellen | ||
| + | for y in range(seg_y + 1): | ||
| + | for x in range(seg_x + 1): | ||
| + | var vx = lerp(-half_width, | ||
| + | var vy = 0 | ||
| + | var vz = lerp(-half_height, | ||
| + | vertices.append(Vector3(vx, | ||
| + | uvs.append(Vector2(x / seg_x, y / seg_y)) | ||
| + | |||
| + | # Indices für die Dreiecke erstellen | ||
| + | for y in range(seg_y): | ||
| + | for x in range(seg_x): | ||
| + | var i = y * (seg_x + 1) + x | ||
| + | indices.append(i) | ||
| + | indices.append(i + seg_x + 1) | ||
| + | indices.append(i + seg_x + 2) | ||
| + | indices.append(i) | ||
| + | indices.append(i + seg_x + 2) | ||
| + | indices.append(i + 1) | ||
| + | |||
| + | # Mesh-Daten vorbereiten | ||
| + | var arrays = [] | ||
| + | arrays.resize(Mesh.ARRAY_MAX) | ||
| + | arrays[Mesh.ARRAY_VERTEX] = vertices | ||
| + | arrays[Mesh.ARRAY_INDEX] = indices | ||
| + | arrays[Mesh.ARRAY_TEX_UV] = uvs | ||
| + | |||
| + | # ArrayMesh hinzufügen | ||
| + | array_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, | ||
| + | return array_mesh | ||
| + | </ | ||
| + | |||
| + | =====Button===== | ||
| + | |||
| + | {{godot_button_pressed_event.png}} | ||
| + | |||
| + | < | ||
| + | func _on_button_pressed(extra_arg_0, | ||
| + | print(extra_arg_0 + extra_arg_1) | ||
| + | </ | ||
| + | =====Lighting===== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | =====GDScript===== | ||
| + | |||
| + | ====Instantiation==== | ||
| + | |||
| + | < | ||
| + | # Lade die Szene | ||
| + | var scene = preload(" | ||
| + | |||
| + | # Instanziere die Szene | ||
| + | var instance = scene.instantiate() | ||
| + | |||
| + | # Füge die instanziierte Szene als Kind zum aktuellen Node hinzu | ||
| + | add_child(instance) | ||
| + | </ | ||
| + | |||
| + | ====Movement==== | ||
| + | |||
| + | Move/rotate a Node3D | ||
| + | < | ||
| + | extends Node3D | ||
| + | |||
| + | # Geschwindigkeit, | ||
| + | var speed = 5.0 | ||
| + | |||
| + | func _process(delta): | ||
| + | |||
| + | # Bewegung auf der X-Achse | ||
| + | # position.x += speed * delta | ||
| + | # oder | ||
| + | translate(Vector3(speed * delta, 0, 0)) | ||
| + | |||
| + | # Bewegung auf der Z-Achse | ||
| + | # position.z += speed * delta | ||
| + | # oder | ||
| + | translate(Vector3(0, | ||
| + | |||
| + | # Rotation um die X-Achse | ||
| + | # rotation.x += 10 * deltaTime | ||
| + | # oder | ||
| + | rotate(Vector3(1, | ||
| + | |||
| + | # Rotation um die Z-Achse | ||
| + | # | ||
| + | # oder | ||
| + | rotate(Vector3(0, | ||
| + | |||
| + | # Umkehrung der Bewegungsrichtung, | ||
| + | if position.x > 5.0 or position.x < -5.0: | ||
| + | speed = -speed | ||
| + | </ | ||
| + | |||
| + | Move/rotate a MeshInstance3D | ||
| + | < | ||
| + | extends MeshInstance3D | ||
| + | |||
| + | # Geschwindigkeit, | ||
| + | var speed = 5.0 | ||
| + | |||
| + | func _process(delta): | ||
| + | |||
| + | # Bewegung auf der X-Achse | ||
| + | # position.x += speed * delta | ||
| + | # oder | ||
| + | translate(Vector3(speed * delta, 0, 0)) | ||
| + | |||
| + | # Bewegung auf der Z-Achse | ||
| + | # position.z += speed * delta | ||
| + | # oder | ||
| + | translate(Vector3(0, | ||
| + | |||
| + | # Rotation um die X-Achse | ||
| + | # rotation.x += 10 * deltaTime | ||
| + | # oder | ||
| + | rotate(Vector3(1, | ||
| + | |||
| + | # Rotation um die Z-Achse | ||
| + | # | ||
| + | # oder | ||
| + | rotate(Vector3(0, | ||
| + | |||
| + | # Umkehrung der Bewegungsrichtung, | ||
| + | if position.x > 5.0 or position.x < -5.0: | ||
| + | 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(" | ||
| + | </ | ||
| + | |||
| + | ====Raycast3D==== | ||
| + | |||
| + | Der Raycast3D-Node muss zuerst im Scenetree hinzugrfügt werden. Z.B als Child der Camera. | ||
| + | |||
| + | < | ||
| + | extends RayCast3D | ||
| + | |||
| + | # Called when the node enters the scene tree for the first time. | ||
| + | func _ready(): | ||
| + | pass # Replace with function body. | ||
| + | |||
| + | |||
| + | # Called every frame. ' | ||
| + | func _process(delta): | ||
| + | |||
| + | # get_collision_point() | ||
| + | # get_collider() | ||
| + | | ||
| + | if is_colliding(): | ||
| + | var length = (get_parent().global_position - get_collider().global_position).length() | ||
| + | print(" | ||
| + | | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | 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===== | ||
| + | |||
| + | < | ||
| + | func _on_body_entered(body): | ||
| + | print(" | ||
| + | |||
| + | func _on_body_exited(body): | ||
| + | print(" | ||
| + | </ | ||
| + | |||
| + | Um Funktionen im Script mit Signalen aus der Engine zu verknüpfen, | ||
| + | |||
| + | {{signals.png}} | ||
| + | |||
| + | =====Colission===== | ||
| + | |||
| + | 3D Kolissionen | ||
| + | < | ||
| + | func _process(delta): | ||
| + | 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(" | ||
| + | </ | ||
| + | |||
| + | =====Area===== | ||
| + | |||
| + | Signale setzen! | ||
| + | |||
| + | < | ||
| + | extends Area2D | ||
| + | # or | ||
| + | # extends Area3D | ||
| + | |||
| + | # Wenn 2 Areas überlappen | ||
| + | func _on_area_entered(area): | ||
| + | print(" | ||
| + | |||
| + | # Wenn 2 Areas nicht mehr überlappen | ||
| + | func _on_area_exited(area): | ||
| + | print(" | ||
| + | |||
| + | # Wenn eine Area und ein Node überlappen | ||
| + | func _on_body_entered(body): | ||
| + | print(" | ||
| + | |||
| + | # Wenn eine Area und ein Node nicht mehr überlappen | ||
| + | func _on_body_exited(body): | ||
| + | print(" | ||
| + | |||
| + | # Teste ob ein Player in der Box ist | ||
| + | func is_player_in_box(): | ||
| + | var bodies = get_overlapping_bodies() | ||
| + | for body in bodies: | ||
| + | if body.name == " | ||
| + | return true | ||
| + | return false | ||
| + | |||
| + | func _process(delta): | ||
| + | if is_player_in_box(): | ||
| + | print(" | ||
| + | </ | ||
| + | |||
| + | =====CameraController===== | ||
| + | |||
| + | < | ||
| + | extends Camera3D | ||
| + | |||
| + | @export var move_speed: float = 10.0 | ||
| + | @export var mouse_sensitivity: | ||
| + | |||
| + | var rotation_x: float = 0.0 | ||
| + | var rotation_y: float = 0.0 | ||
| + | |||
| + | func _ready(): | ||
| + | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) | ||
| + | |||
| + | func _process(delta: | ||
| + | handle_movement(delta) | ||
| + | |||
| + | func _input(event: | ||
| + | if event is InputEventMouseMotion: | ||
| + | handle_mouse_rotation(event.relative) | ||
| + | |||
| + | 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) | ||
| + | |||
| + | func handle_movement(delta: | ||
| + | var velocity = Vector3.ZERO | ||
| + | if Input.is_action_pressed(" | ||
| + | velocity -= transform.basis.z | ||
| + | if Input.is_action_pressed(" | ||
| + | velocity += transform.basis.z | ||
| + | if Input.is_action_pressed(" | ||
| + | velocity -= transform.basis.x | ||
| + | if Input.is_action_pressed(" | ||
| + | velocity += transform.basis.x | ||
| + | if velocity != Vector3.ZERO: | ||
| + | velocity = velocity.normalized() * move_speed * delta | ||
| + | global_transform.origin += velocity | ||
| + | |||
| + | func handle_mouse_rotation(mouse_motion: | ||
| + | rotation_y -= mouse_motion.x * mouse_sensitivity | ||
| + | rotation_x -= mouse_motion.y * mouse_sensitivity | ||
| + | rotation_x = clamp(rotation_x, | ||
| + | rotation_degrees = Vector3(rotation_x, | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | extends Node3D | ||
| + | |||
| + | @export var move_speed: float = 10.0 | ||
| + | @export var mouse_sensitivity: | ||
| + | |||
| + | var rotation_x: float = 0.0 | ||
| + | var rotation_y: float = 0.0 | ||
| + | var camera: Camera3D = null | ||
| + | |||
| + | func _ready(): | ||
| + | camera = Camera3D.new() | ||
| + | camera.current = true | ||
| + | add_child(camera) | ||
| + | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) | ||
| + | |||
| + | func _process(delta: | ||
| + | if camera: | ||
| + | handle_movement(delta) | ||
| + | |||
| + | func _input(event: | ||
| + | if event is InputEventMouseMotion: | ||
| + | handle_mouse_rotation(event.relative) | ||
| + | |||
| + | 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) | ||
| + | |||
| + | func handle_movement(delta: | ||
| + | var velocity = Vector3.ZERO | ||
| + | if Input.is_action_pressed(" | ||
| + | velocity -= camera.transform.basis.z | ||
| + | if Input.is_action_pressed(" | ||
| + | velocity += camera.transform.basis.z | ||
| + | if Input.is_action_pressed(" | ||
| + | velocity -= camera.transform.basis.x | ||
| + | if Input.is_action_pressed(" | ||
| + | velocity += camera.transform.basis.x | ||
| + | if velocity != Vector3.ZERO: | ||
| + | velocity = velocity.normalized() * move_speed * delta | ||
| + | camera.global_transform.origin += velocity | ||
| + | |||
| + | func handle_mouse_rotation(mouse_motion: | ||
| + | if not camera: | ||
| + | return | ||
| + | rotation_y -= mouse_motion.x * mouse_sensitivity | ||
| + | rotation_x -= mouse_motion.y * mouse_sensitivity | ||
| + | rotation_x = clamp(rotation_x, | ||
| + | camera.rotation_degrees = Vector3(rotation_x, | ||
| + | </ | ||
| + | |||
| + | =====CharacterBody===== | ||
| + | |||
| + | ====CharacterBody2D==== | ||
| + | < | ||
| + | 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(" | ||
| + | </ | ||
| + | |||
| + | ====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 | ||
| + | |||
| + | @export var maxSpeed :float = 1.0 | ||
| + | @export var turnRate :float = 0.1 | ||
| + | @onready var Gravity = ProjectSettings.get_setting(" | ||
| + | |||
| + | var Speed = 0.0 | ||
| + | |||
| + | func _physics_process(delta): | ||
| + | _rotate() | ||
| + | if Input.is_action_just_pressed(" | ||
| + | Speed += 1.0 | ||
| + | if Input.is_action_just_pressed(" | ||
| + | if (Speed >= 1.0): | ||
| + | Speed -= 1.0 | ||
| + | else: | ||
| + | Speed = 0.0 | ||
| + | if (Speed > 0.0): | ||
| + | global_translate(transform.basis.z) | ||
| + | move_and_slide() | ||
| + | |||
| + | func _rotate(): | ||
| + | var yaw = Input.get_axis(" | ||
| + | var roll = Input.get_axis(" | ||
| + | var pitch = Input.get_axis(" | ||
| + | var direction = Vector3(pitch, | ||
| + | if direction: | ||
| + | var a = Quaternion(transform.basis.from_euler(rotation)) | ||
| + | var b = Quaternion(transform.basis.from_euler(direction)) | ||
| + | transform.basis = Basis(a * b) | ||
| + | </ | ||
| + | |||
| + | |||
| + | =====VehicleBody3D===== | ||
| + | |||
| + | < | ||
| + | extends VehicleBody3D | ||
| + | |||
| + | var steering_smoothness : float = 5.0 # Steuerungsdämpfung | ||
| + | |||
| + | func _physics_process(delta: | ||
| + | var target_steering = Input.get_axis(" | ||
| + | var target_engine_force = Input.get_axis(" | ||
| + | |||
| + | # Steuerung anwenden (sanft interpolieren) | ||
| + | steering = lerp(steering, | ||
| + | |||
| + | engine_force = target_engine_force | ||
| + | |||
| + | for child in get_children(): | ||
| + | if child is VehicleWheel3D: | ||
| + | if child.steering: | ||
| + | child.set_steering(steering) | ||
| + | else: | ||
| + | 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===== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||