c# - Stopping player from spamming movement keys which causes glitches -


i wrote script player movement in c#. whenever player presses or d, moves him/her left or right 12 units , when player presses w or s, moves him/her or down 12 units. script works fine, if person starts spam of keys @ once, glitches out , player object not in line level anymore. want have script check if there movement happening before executing movement on keypress. here script:

void update () {      transform.translate(vector3.forward * forwardspeed * time.deltatime);      if (input.getkeydown (keycode.a) && side > maxsideleft) {         moveobjectto(this.transform, new vector3(this.transform.position.x - 12, this.transform.position.y, this.transform.position.z + 10), movementspeed);         side -= 1;     } else if (input.getkeydown (keycode.d) && side < maxsideright) {         moveobjectto(this.transform, new vector3(this.transform.position.x + 12, this.transform.position.y, this.transform.position.z + 10), movementspeed);         side += 1;     }      if (input.getkeydown (keycode.w) && level < maxlevelheight) {         moveobjectto(this.transform, new vector3(this.transform.position.x, this.transform.position.y + 12, this.transform.position.z + 10), movementspeed);         level += 1;     } else if (input.getkeydown (keycode.s) && level > minlevelheight) {         moveobjectto(this.transform, new vector3(this.transform.position.x, this.transform.position.y - 12, this.transform.position.z + 10), movementspeed);         level -= 1;     }      if (input.getkeydown (keycode.r) || input.getkeydown(keycode.space)) {         scenemanager.loadscene ("scene1");         time.timescale = 1;     } }   private void moveobjectto(transform objecttomove, vector3 targetposition, float movespeed) {     stopcoroutine(moveobject(objecttomove, targetposition, movespeed));     startcoroutine(moveobject(objecttomove, targetposition, movespeed)); }  public static ienumerator moveobject(transform objecttomove, vector3 targetposition, float movespeed) {     float currentprogress = 0;     vector3 cashedobjectposition = objecttomove.transform.position;      while (currentprogress <= 1)     {         currentprogress += movespeed * time.deltatime;          objecttomove.position = vector3.lerp(cashedobjectposition, targetposition, currentprogress);          yield return null;     } } 

you can use simple ismoving variable this. don't move if variable true. move if false. when coroutine done running set ismoving false. also, can't tell why moveobject function static. removed static keyword it.

bool ismoving = false;  void update() {      transform.translate(vector3.forward * forwardspeed * time.deltatime);      if (input.getkeydown(keycode.a) && side > maxsideleft)     {         moveobjectto(this.transform, new vector3(this.transform.position.x - 12, this.transform.position.y, this.transform.position.z + 10), movementspeed);         side -= 1;     }     else if (input.getkeydown(keycode.d) && side < maxsideright)     {         moveobjectto(this.transform, new vector3(this.transform.position.x + 12, this.transform.position.y, this.transform.position.z + 10), movementspeed);         side += 1;     }      if (input.getkeydown(keycode.w) && level < maxlevelheight)     {         moveobjectto(this.transform, new vector3(this.transform.position.x, this.transform.position.y + 12, this.transform.position.z + 10), movementspeed);         level += 1;     }     else if (input.getkeydown(keycode.s) && level > minlevelheight)     {         moveobjectto(this.transform, new vector3(this.transform.position.x, this.transform.position.y - 12, this.transform.position.z + 10), movementspeed);         level -= 1;     }      if (input.getkeydown(keycode.r) || input.getkeydown(keycode.space))     {         scenemanager.loadscene("scene1");         time.timescale = 1;     } }   private void moveobjectto(transform objecttomove, vector3 targetposition, float movespeed) {     //don't object moving     if (ismoving)     {         return;     }     //if not moving set ismoving true     ismoving = true;     startcoroutine(moveobject(objecttomove, targetposition, movespeed)); }  public ienumerator moveobject(transform objecttomove, vector3 targetposition, float movespeed) {     float currentprogress = 0;     vector3 cashedobjectposition = objecttomove.transform.position;      while (currentprogress <= 1)     {         currentprogress += movespeed * time.deltatime;          objecttomove.position = vector3.lerp(cashedobjectposition, targetposition, currentprogress);          yield return null;     }     //done moving. set ismoving false     ismoving = false; } 

Comments

Popular posts from this blog

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

jsf - "PropertyNotWritableException: Illegal Syntax for Set Operation" error when setting value in bean -

arrays - Algorithm to find ideal starting spot in a circle -