Updating RigidBody rotation and velocity only updates it's rotation

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By rico345100

I’m currently making spaceship controller script. Control is simple, W/S to move forward/backward, A/D/ to rotate ship by Y Axis(yaw).

Spaceship is RigidBody node and has CollisionShape as children.

Here’s the code for move forward/backward:

export var speed = 1
export var max_speed = 10
var current_speed = 0

export var key_acceleration = KEY_W
export var key_deceleration = KEY_S

func process_movement(delta):
	if Input.is_key_pressed(key_acceleration):
		current_speed -= speed * delta
	elif Input.is_key_pressed(key_deceleration):
		current_speed += speed * delta
		
	current_speed = clamp(current_speed, -max_speed, max_speed)
	
	linear_velocity = Vector3(0, 0, current_speed)

I need to limit it’s maximum speed, so I updated velocity directly, not using something like add_force.

Next is rotating code:

export var yawing_speed = 0.01
export var max_yawing_speed = 0.02
export var yaw_stop_threshold = 0.001
var current_yaw = 0

func process_yaw(delta):
	if Input.is_key_pressed(key_yaw_left):
		current_yaw += yawing_speed * delta
	elif Input.is_key_pressed(key_yaw_right):
		current_yaw += -yawing_speed * delta
	else:
		if current_yaw > 0:
			current_yaw -= yawing_speed * delta
			
			if current_yaw < yaw_stop_threshold:
				current_yaw = 0
		elif current_yaw < 0:
			current_yaw += yawing_speed * delta
			
			if current_yaw > yaw_stop_threshold:
				current_yaw = 0
	
	current_yaw = clamp(current_yaw, -max_yawing_speed, max_yawing_speed)	
	rotation.y += current_yaw

In this code, I updated rotation.y directly. Each of this function works if run separately, however run these together, it only changed rotation, not velocity.

func _physics_process(delta):
	process_movement(delta)
	process_yaw(delta)

Change order of process_movement and process_yaw doesn’t change anything. If I just run one of process_movement and process_yaw, it works perfectly.

Why my rigidbody ignored velocity and only rotated? Any advice will very appreciate it.

:bust_in_silhouette: Reply From: Hamad Marri

have you tried apply_impulse instead of setting linear_velocity?
you still able to limit velocity by subtracting max speed from linear_velocity

_new_force = abs(linear_velocity.z) - max_speed

another thing try this function to set the linear velocity:

set_linear_velocity(Vector3(0, 0, current_speed))