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
Post a Comment