0
\$\begingroup\$

I have the following problem with a WebGL project I'm working on:

I have an object which I want to zoom out and move to a specific position at the same time, for this, I've created a coroutine which is called on click. On my computer, everything works perfectly fine, but whenever I try this function on a not that high-end computer, this coroutine stutters a bit.

I've tried deactivating every single shader or sprite that this object is using in order to discard high graphic usage, but the problem persists even if the object is a blank circle.

This is the coroutine I'm using:

  IEnumerator restorePosition() {
    float counter = 0;
    while(counter < duration) {
      counter += Time.deltaTime;

      if (counter > duration) {
        counter = duration;
      }

      float framesPerTime = Vector3.Distance(zoomedTransform.position, storedPosition) / (duration - counter) * Time.deltaTime;
      zoomedTransform.position = Vector3.MoveTowards(zoomedTransform.position, storedPosition, framesPerTime);

      float framesPerTimeZoom = Vector3.Distance(zoomedTransform.localScale, storedScale) / (duration - counter) * Time.deltaTime;
      zoomedTransform.localScale = Vector3.MoveTowards(zoomedTransform.localScale, storedScale, framesPerTimeZoom);

      //restore solar system to original position
      float solarSystemFrames = Vector3.Distance(solarSystem.position, solarSystemStartPOS) / (duration - counter) * Time.deltaTime;
      solarSystem.position = Vector3.MoveTowards(solarSystem.position, solarSystemStartPOS, solarSystemFrames);
      yield return null;
    }

    //zoomedTransform.position = storedPosition;
    zoomed = false;
    spriteMask.frontSortingLayerID = originalFrontLayerID;
    spriteMask.backSortingLayerID = originalBackLayerID;
    zoomedTransform.localScale = storedScale;

    foreach(SpriteRenderer s in spriteChildren) {
      s.sortingLayerName = originalLayer;
    }

    foreach(OrbitController o in planets) {
      o.restartAnimation();     
    }
    inTransition = false;

    //set moon layer  values back to original
    if (moon != null) {
      moon.gameObject.GetComponent<SpriteMask>().isCustomRangeActive = true;
      moon.gameObject.GetComponent<SpriteRenderer>().sortingLayerName = moonLayerName;
      foreach (Transform child in moon) {
        child.GetComponent<SpriteRenderer>().sortingLayerName = moonLayerName;
      }
      moon.GetComponent<MoonBehaviour>().zoomOut();
      //reset null transform and layer names
      moon = null;
      moonLayerName = null;
    }
    yield break;
  }

Could you give me an idea of what I'm doing wrong? , I've also tried Lerp and that didn't solve the problem. Thank you!

\$\endgroup\$
0
1
\$\begingroup\$

If you use things that are Framerate Dependent (Update or things with deltatime) then it can cause this.

If you do not want the routine to be framerate dependent then you can use WaitForFixedUpdate() or put the movement in FixedUpdate() These have a fixed timestep loop

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.