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

php - How to display all orders for a single product showing the most recent first? Woocommerce -

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

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -