Left Joystick Translation Depending on Facing Direction
I'm hitting a wall on this really simple problem... I know there has to be a simple solution, but I'm not exactly sure what it is. I'm prototyping for a game jam -- my game is a top down, 3D twin sticks style game. The right stick rotates the player and the left stick controls the movement. The movement is done via animations in Mecanim -- I have forward/backward/strafing setup and blended.
My problem is right now it moves like Resident Evil -- "up" on the joystick drives the character forward no matter what direction she is facing. I need to translate "up" on the joystick to be relative to the world -- not the player (ie: if facing right, "up" should make her strafe left). What am I trying to find? I'm pretty sure there's some built it translation that I need to call...
I'm using Unity and am sending Horizontal and Vertical values between -1 and 1 to Mecanim. I need to translate these values based on character rotation so "up" moves the character toward the top of the screen based on it's original rotation.
Working code:
moveDirection = new Vector3(Input.GetAxis("Joystick Horizontal"), 0f, Input.GetAxis("Joystick Vertical"));
moveDirection = gameObject.transform.InverseTransformDirection(moveDirection);
moveHorizontal = $$anonymous$$athf.Clamp(moveDirection.x, -1, 1);
moveVertical = $$anonymous$$athf.Clamp(moveDirection.z, -1, 1);
Thanks @eres !
Answer by eses · Aug 17, 2018 at 05:43 PM
Hi @brandoncluff
You need to do space conversion for your direction vector.
Unity has built in methods in Vector classes called (several), in this case:
var h = Input.GetAxis("Horizontal");
var v = Input.GetAxis("Vertical");
ctrlVec = new Vector3(h,0,v);
relVec = body.InverseTransformDirection(ctrlVec);
Now when you press L stick up, (0,0,1), vector direction will be rotated relative to characters forward, and value will be (-1,0,0), which is left in character local space, which can drive possibly your animation clips.
Thanks! I'll give this a shot. If it works, I'll accept your answer and post the code to help anyone else having similar issues!
I tested it - at least it works as I undestood it :)