- Home /
I'm trying to figure out how to move the Snake with only two input keys, such as left and right.
Essentially, and I hope this is adequate explanation...but I'd like to be able to use just two input keys, such as left and right, to control the Snake. Such that if it's going upwards, and I hit right twice, it'll end up going down.(One 90 degree turn, and then another?)
I've tried looking this up on my own but I haven't found anything that isn't 3D.
At the moment I have four input keys for movement.
// Use this for initialization
void Start () {
GetComponent<Rigidbody2D>().velocity = Vector2.up * speed;
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(upKey)
{
GetComponent<Rigidbody2D>().velocity = Vector2.up * speed;
speed += .5f;
}
else if (Input.GetKeyDown(downKey)
{
GetComponent<Rigidbody2D>().velocity = -Vector2.up * speed;
speed += .5f;
}
else if (Input.GetKeyDown(rightKey)
{
GetComponent<Rigidbody2D>().velocity = Vector2.right * speed;
speed += .5f;
}
else if (Input.GetKeyDown(leftKey)
{
GetComponent<Rigidbody2D>().velocity = -Vector2.right * speed;
speed += .5f;
}
}
I've tried playing around with having multiple if/elseIf for different scenarios, but I'm met with limited success and I feel like I'm overly complicating the whole thing, if I'm not already doing so above.
Thank you for any and all help. Whilst I understand I could keep it the way it is, I wanted to change the controls to learn more and ended up lost.
Here's an idea. have the initial move direction as a vector2 saved. Whenever you press a key, rotate that vector around your games up axis (probably z, since you're 2D). You can do this:
var newDirection = Quaternion.Euler(0,0,90f) * direction; //-90f for the other direction
Answer by RecyclingBen · Mar 22, 2017 at 12:24 PM
try something like
int direction;
if (Input.GetKeyDown(rightKey))
{
if(direction == 1) {
GetComponent<Rigidbody2D>().velocity = Vector2.right * speed;
speed += .5f;
direction = 2;
}
else if(direction == 2) {
GetComponent<Rigidbody2D>().velocity = -Vector2.up * speed;
speed += .5f;
direction = 3;
}
else if(direction == 3) {
GetComponent<Rigidbody2D>().velocity = -Vector2.right * speed;
speed += .5f;
direction = 4;
}
else if(direction == 4) {
GetComponent<Rigidbody2D>().velocity = Vector2.up * speed;
speed += .5f;
direction = 1;
}
}
and then do the opposite for the left key? just thought about this, might not work 100% correctly but it's worth a try
Answer by Mughees_Mehdi · Mar 22, 2017 at 01:39 PM
You can use transform instead to Vector2 for the purpose that uses player current direction as a reference.
int direction;
if(direction = 1) {
GetComponent<Rigidbody2D>().velocity = transform.right * speed;
speed += .5f;
direction = 2;
}
else if(direction = 2) {
GetComponent<Rigidbody2D>().velocity = -transform.right * speed;
speed += .5f;
direction = 1;
}
Your answer
Follow this Question
Related Questions
Spikes for a platformer game 1 Answer
SNAKE [Tail] 0 Answers
Make objects invisable when they are passing through 2 Answers
unity 2d: scaling sprites problem. 1 Answer
UI button adding existing scrip to move 2d character 0 Answers