Hello, I’m using:
if(forwardMoveSpeed > 0){
this.transform.localPosition = Vector3.Lerp(this.transform.position , new Vector3(this.transform.position.x + 1f,this.transform.position.y, this.transform.position.z), forwardMoveSpeed * Time.deltaTime);
forwardMoveSpeed -= 0.05f;
}
to move my character for a small amount of time. But this moves it in the global x position. As soon as my character rotates it doesn’t look right, obviously.
How can I move my character in it’s local x position.
Thanks.
I did some searches and found a bunch on how to rotate something locally/globally but nothing about just moving using Vector3.
EDIT:
So let me explain a tad bit more so you can get a better understanding.
I have a character(GameObject). He runs a path and has a specific amount of life. When he dies I want him to fall “forward” while doing his dying animation.
He faces the Z axis, therefore “forward” is his LOCAL Z axis. The path he travels has 90 degree turns. So he faces different directions relative to the global axis. Sometimes his LOCAL z axis is facing the GLOBAL x axis, sometimes the GLOBAL y Axis.
With that being said all I want to do is move his overall position’s LOCAL z axis by like 2 units while he’s doing his animation. (so if his position is 0,0,0 then when he dies I want his LOCAL position to be 0,0,2. I can’t just change his position because his LOCAL Z axis might be the GLOBALS X axis).
How do I do that?
Eveything I try moves him 2 units in a GLOBAL axis.
if you want to move the character in local-space, shouldn’t you be using Lerp
on the transform.localposition
and not transform.position
? Try this instead
if(forwardMoveSpeed > 0){
this.transform.localPosition = Vector3.Lerp(this.transform.localposition , new Vector3(this.transform.localposition.x + 1f,this.transform.localposition.y, this.transform.localposition.z), forwardMoveSpeed * Time.deltaTime);
forwardMoveSpeed -= 0.05f;
}
I’m not sure exactly what you to happen here. Typically you would have something like this:
var v3LocalDest : Vector3;
var speed = 2.0;
function Start() {
v3LocalDest = transform.localPosition;
v3LocalDest.x += 1.0;
}
function Update() {
transform.localPosition = Vector3.Lerp(transform.localPosition, v3LocalDest, Time.deltaTime * speed);
}
Note if you have a global position and want to set v3LocalDest, you can do:
var v3LocalDest = transform.InverseTransformPoint(v3GlobalPoint);
Ok so I couldn’t find a solution so I just made my own personal converter. This code is pretty specific to my model but if your “forward” is your local Z axis then it might work for you.
Thanks to everyone who tried to help, maybe I didn’t explain it good enough.
if(forwardMoveSpeed > 0){
/*@@@@LEGEND
*In a perfect world, if all rotations were EXACT then this is what way the character is facing
*
*
* If it's y rotation is 90 degrees: He is facing X direction and forward is +x
*
* If it's y rotation is 0 degrees: He is facing Z direction and forward is +Z
*
* If it's y rotation is 180 degrees: He is facing Z direction and forward is -z
*
* If it's y rotation is 270 degrees: He is facing X direciont and forward is -x
*
*/
currentPosition = this.transform.position;
float moveAmount = 2f;
if(oneShot){
float currentRotitation = this.transform.rotation.eulerAngles.y;
//ALL VALUES ARE A RANGE/ABOUT BECAUSE WE CAN'T GAURENTEE THE CHARACTER'S ROTATION WILL BE EXACTLY 0,90,180, OR 270
//if rotoation is greater then 20 then it CANT be "0" rotation
if(currentRotitation > 20){
//if rotation is greater then 110 then it CANT be "90" rotation
if(currentRotitation > 110){
//if rotation is greater then 200 then it CANT be "180" rotation
if(currentRotitation > 200){
//if we are greater then 200 we have to be at "270" degrees
//forward is negative x
nextPosition = new Vector3(currentPosition.x - moveAmount, currentPosition.y, currentPosition.z);
}
//if it's less then 200 then it has to be "180" degrees
else{
//forward is negative z
nextPosition = new Vector3(currentPosition.x, currentPosition.y, currentPosition.z - moveAmount);
}
}
//if it's less then 110 it has to be "90" rotation
else{
//forward is positive x
nextPosition = new Vector3(currentPosition.x + moveAmount, currentPosition.y, currentPosition.z);
}
}
//if it's less then 20 it must be "0" rotation
else{
//forward is positive Z
nextPosition = new Vector3(currentPosition.x, currentPosition.y, currentPosition.z + moveAmount);
}
//this is so we only figure out our "end" location once.
oneShot = false;
}
this.transform.position = Vector3.Slerp(currentPosition , nextPosition, forwardMoveSpeed * Time.deltaTime);
forwardMoveSpeed -= 0.05f;
}