0
\$\begingroup\$

I have a sprite. The pivot is at random point.

I want to increase the sprite's scale on the x axis, without moving the pivot, until its edge touches a point at right.

I have a method to set/add size. I calculate a distance from the sprite's edge to the point at the right and add it as a size.

The problem is the sprite scale increases its size in both directions of the x axis (left and right), considering the pivot is not at the left edge of the sprite.

How can I scale the sprite while keeping the left edge where it is?

I have:

A white square and red square, with a gap in between

I want to get:

A white rectangle stretched until it abuts the red square

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

I solved the problem. The next method sticks a right side of a gameobject to the point on x axis:

ScaleToStick:

private void ScaleToStick(GameObject gameObject, Vector3 target)
{
    Bounds bounds1 = StaticScript.GetBoundsChildren(gameObject);
    float size = target.x - (bounds1.center.x + bounds1.extents.x);
    float distancePivotToCenter = bounds1.center.x - transform.position.x;
    float _1 = distancePivotToCenter + bounds1.extents.x;
    float _2 = distancePivotToCenter - bounds1.extents.x;
    _2 = Mathf.Abs(_2);
    float x = (_1 + _2) / _1;
    size *= x;

    StaticScript.AddSizeUniform(gameObject, size, "x");
}

GetBoundsChildren:

public static Bounds GetBoundsChildren(GameObject gameObject)
    {
        Bounds bounds = new Bounds();
        bool first = true;

        foreach (Renderer renderer in gameObject.GetComponentsInChildren<Renderer>())
        {
            if (first)
            {
                first = false;

                if (renderer.bounds.size == Vector3.zero)
                {
                    Bounds bounds_ = new Bounds();
                    bounds_.center = renderer.gameObject.transform.position;
                    bounds = bounds_;
                }
                else
                    bounds = renderer.bounds;
            }
            else
                if (renderer.bounds.size == Vector3.zero)
            {
                Bounds bounds_ = new Bounds();
                bounds_.center = renderer.gameObject.transform.position;
                bounds.Encapsulate(bounds_);
            }
            else
                bounds.Encapsulate(renderer.bounds);
        }

        return bounds;
    }

AddSizeUniform:

public static void AddSizeUniform(GameObject gameObject, float sizeAdd, string axis)
    {
        Vector3 scaleOld = gameObject.transform.localScale;
        Vector3 sizeOld = GetBoundsChildren(gameObject).size;

        Vector3 scaleNew = Vector3.zero;
        float scaleNewMultiply = 0;

        if (axis == "x")
            scaleNewMultiply = (sizeOld.x + sizeAdd) / sizeOld.x;

        if (axis == "y")
            scaleNewMultiply = (sizeOld.y + sizeAdd) / sizeOld.y;

        if (axis == "z")
            scaleNewMultiply = (sizeOld.z + sizeAdd) / sizeOld.z;

        scaleNew.x = scaleNewMultiply * scaleOld.x;
        scaleNew.y = scaleNewMultiply * scaleOld.y;
        scaleNew.z = scaleNewMultiply * scaleOld.z;

        gameObject.transform.localScale = scaleNew;
    }
\$\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.