- Home /
Dynamic Vector3 axes
Hi! Recently I have been starting on a 3rd person RPG, however my movement doesn't seem to be working as intended. As it successfully rotates on button press, however forward and backward it doesn't move forward in line with the cube. Basically if I rotated the cube to 45° and pressed W, it would move 0° forward not 45°. Thank you in advance! -Azza
using UnityEngine;
using System.Collections;
public class MoveMe : MonoBehaviour {
//X is rotation, Y is forward/backward
private float hInput, vInput;
private GameObject playerObject;
public float rotateSmooth, velocitySmooth;
// Use this for initialization
void Start () {
}
void FixedUpdate()
{
//Cache input
hInput = Input.GetAxisRaw("Horizontal");
vInput = Input.GetAxisRaw("Vertical");
Movement(hInput, vInput);
}
void Movement(float hInput, float vInput)
{
if (hInput != 0f || vInput != 0f)
{
Rotate(hInput);
Movement(vInput);
}
}
void Movement(float vInput)
{
if(vInput == 1f)
{
//Move forward
GetComponent<Rigidbody>().AddForce(Vector3.forward * velocitySmooth * Time.deltaTime, ForceMode.VelocityChange);
}
if(vInput == -1f)
{
GetComponent<Rigidbody>().AddForce(Vector3.forward * velocitySmooth * Time.deltaTime, ForceMode.VelocityChange);
}
}
void Rotate(float Input)
{
//If rotating left
if (hInput == -1f)
{
transform.Rotate(-Vector3.up * rotateSmooth * Time.deltaTime);
}
if (hInput == 1f)
{
transform.Rotate(Vector3.up * rotateSmooth * Time.deltaTime);
}
}
}
Answer by OncaLupe · Nov 29, 2015 at 09:32 PM
You can use transform.forward to get the local +Z axis for use in the AddForce() method. Since you're running this through the FixedUpdate method, you should be using Time.fixedDeltaTime which tracks the time between FixedUpdates. Time.deltaTime tracks time between normal Updates.
Also, you should cache the Rigidbody instead of using GetComponent all the time. GetComponent is a slow operation.
Rigidbody myRigidbody;
void Awake()
{
myRigidbody = GetComponent<Rigidbody>();
}
void Movement(float vInput)
{
//Stuff
myRigidbody.AddForce(transform.forward * velocitySmooth * Time.fixedDeltaTime, ForceMode.VelocityChange);
}
Time.deltaTime
will return the value of Time.fixedDeltaTime
when read from inside FixedUpdate. deltaTime is a property and Unity adjusts the value accordingly.
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers
Player Movement Help 0 Answers
Illuminating a 3D object's edges OnMouseOver (script in c#)? 1 Answer
Movement of increased certain speed type not registering. 0 Answers