Hello, I’m pretty new to unity and game development, I’m doing turn based dungeon crawler in first person. Imagine something like legend of grimrock or might and magic legacy x. I’ve got a problem and I think I know how to solve it, but I don’t know if it is the best way to do it.
To make the first person camera move and rotate I’ve created this script:
private bool walking;
private bool rotating;
private Vector3 startPos;
private Vector3 endPos;
private float speed;
private float startTime;
private float journeyLength;
private string direction;
private int count;
// Use this for initialization
void Start () {
walking = false;
rotating = false;
speed = 3.5f;
startPos = transform.position;
endPos = transform.position;
journeyLength = Vector3.Distance(startPos, endPos);
startTime = Time.time;
count = 0;
}
void Update () {
if (!walking !rotating)
{
if(Input.GetAxis("Horizontal") > 0)
{
//Mover para a direita
endPos = new Vector3(transform.position.x, transform.position.y, transform.position.z + 3f);
walking = true;
}
else if(Input.GetAxis("Horizontal") < 0)
{
//Mover para a esquerda
endPos = new Vector3(transform.position.x, transform.position.y, transform.position.z - 3f);
walking = true;
}
else if (Input.GetAxis("Vertical") > 0)
{
//Mover para a frente
endPos = new Vector3(transform.position.x - 3f, transform.position.y, transform.position.z);
walking = true;
}
else if (Input.GetAxis("Vertical") < 0)
{
//Mover para tras
endPos = new Vector3(transform.position.x + 3f, transform.position.y, transform.position.z);
walking = true;
}
else if (Input.GetKey(KeyCode.Q))
{
//Rodar para a esquerda
direction = "left";
rotating = true;
}
else if (Input.GetKey(KeyCode.E))
{
//Rodar para a direita
direction = "right";
rotating = true;
}
else return;
startPos = transform.position;
journeyLength = Vector3.Distance(startPos, endPos);
startTime = Time.time;
}
else if (walking)
{
Move();
}
else if (rotating)
{
Rotate();
}
}
void Move()
{
float distCovered = (Time.time - startTime) * speed;
float fracJourney = distCovered / journeyLength;
transform.position = Vector3.Lerp(startPos, endPos, fracJourney);
walking = (transform.position != endPos);
}
void Rotate()
{
if (direction == "right")
{
transform.Rotate(0, 2f, 0);
count++;
}
else if (direction == "left")
{
transform.Rotate(0, -2f, 0);
count++;
}
if (count == 45)
{
rotating = false;
count = 0;
}
}
Now what I need is that instead of walking in for example the z axis when I press left I want it to move left according to the camera orientation, so if the camera is rotated to the right, he would need to move in the x axis. The solution I found is to make some “ifs” and make it manually, this isn’t really smart I think. Is there a easier way to do it?