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;
}