Skip to content

Bug with scaling in Transformer2D.cs #192

@vklubkov

Description

@vklubkov

In Transformer2D.cs instead of:

        var newLocalScale = Vector3.Lerp(transform.localScale, localScaleToGo, fraction);
        // prevent recalculating colliders when no scale occurs
        if (newLocalScale != transform.localScale) transform.localScale = lastLocalScale = newLocalScale;

there should be:

        var newLocalScale = lastLocalScale = Vector3.Lerp(transform.localScale, localScaleToGo, fraction);
        // prevent recalculating colliders when no scale occurs
        if (newLocalScale != transform.localScale) transform.localScale = newLocalScale;

Otherwise the scaling will stop when it is "changed by someone else":

  1. localScaleToGo is set to transform.localScale
  2. Then lerping equal transform.localScale and localScaleToGo gives newLocalScale equal to them both.
  3. Then lastLocalScale is not updated, as if (newLocalScale != transform.localScale) is always false.
  4. And then if (!Mathf.Approximately(transform.localScale.x, lastLocalScale.x)) will always be true, the above algorithm will repeat again, and the lastLocalScale will never be updated (except for the very rare case when transform.localScale will occasionally become equal to the old lastLocalScale).

В Transformer2D.cs вместо:

        var newLocalScale = Vector3.Lerp(transform.localScale, localScaleToGo, fraction);
        // prevent recalculating colliders when no scale occurs
        if (newLocalScale != transform.localScale) transform.localScale = lastLocalScale = newLocalScale;

должно быть:

        var newLocalScale = lastLocalScale = Vector3.Lerp(transform.localScale, localScaleToGo, fraction);
        // prevent recalculating colliders when no scale occurs
        if (newLocalScale != transform.localScale) transform.localScale = newLocalScale;

Иначе скейл прекратится ровно в тот момент, когда будет изменен кем-то снаружи ("changed by someone else"):

  1. localScaleToGoбуде установлен равным transform.localScale
  2. Затем лерпом между равными друг другу transform.localScale иlocalScaleToGo будет получен newLocalScale равный им.
  3. И новый lastLocalScale не будет установлен, так как if (newLocalScale != transform.localScale)всегда ложь.
  4. И далее проверка if (!Mathf.Approximately(transform.localScale.x, lastLocalScale.x)) всегда будет срабатывать, все повторится c 1 пункта, и lastLocalScale так никогда и не изменится (кроме редкого случая, когда transform.localScale окажется равным старому lastLocalScale).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions