0 votes

I have a character that moves relative to the camera (that can be rotated around player w/ mouse). Player can move 360° (and rotates to the direction it's moving), no problem, BUT I want to change how this works.

I want to rotate the character with WASD and only apply speed to the Z-vector, so it will turn more smoothly (I think) and I could add, let's say, an attack that moves the player to the direction it's facing.

I guess I could make that work with what I already have but I dont know how to apply "force" to the direction player is going or was going.

I have looked around everywhere and tried everything. pls send help im losing it.

in Engine by (23 points)

2 Answers

0 votes
Best answer

Well, I got it...kinda working. While the attack animation is playing, player moves overtime to the facing direction. Multiplying with bigger numbers makes it move faster.

var angle = player.get_rotation().y   
velocity = Vector3(sin(angle),0, cos(angle)) * 10
by (23 points)

there is a MUCH better way to do the same thing, here you are converting a vector into an angle and then back into a vector, which is very inefficient.

Simply use: velocity = player.global_transform.basis.z.normalized() * 10
(adjust with the direction your player is facing)

global_transform.basis.z is the blue arrow when you select your player in local coordinates. "normalized()" is only useful if your player is scaled.

0 votes

You get the direction of the Z-Vector of any Spatial with: (This is a Vector3)
global_transform.basis.z
If you want to ignore the y-component of that Vector you could use:
Vector3(global_transform.basis.z.x,0,global_transform.basis.z.z)

I assume that you currently use a KinematicBody. If you really want to use Forces and Physics you could use a RigidBody instead. But I'm unsure if you really want that as it probably implies a completely different Behaviour of the "player".
Anyway just to have it said, you would go like this to move the player forward (as a RigidBody):

var forward_force=10

_process(delta): #could also make sense inside integrate_forces
  #maybe you have to multiply the vector by -1 if forward and backward is changed
  apply_impulse(Vector3(0,0,0),global_transform.basis.z * forward_force * delta)
by (3,252 points)
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to webmaster@godotengine.org with your username.