public bool Spawn(float spawn_move, bool is_right)
    {
        float privilege = Mathf.Abs(m_LeftOrRightPrivilege);

        privilege *= is_right == (m_LeftOrRightPrivilege > 0.0) ? 1.0f : -1.0f;
        const float max_privilege = 10.0f;

        privilege *= max_privilege;

//		Debug.Log(m_LeftOrRightPrivilege + " " + privilege + " " + m_DeltaSpawnMove);

        // Should we  do this?
        float min_delta_spawn_move = 4.0f;
        float max_delta_spawn_move = 15.0f;

        float res_delta_spawn_move = m_DeltaSpawnMove - privilege;

        res_delta_spawn_move = Mathf.Clamp(res_delta_spawn_move,
                                           min_delta_spawn_move, max_delta_spawn_move);


        if (spawn_move > res_delta_spawn_move * m_SpeedDeltaSpawnMoveCoef)
        {
            Vector3 pos = new Vector3(3.0f * (is_right ? 1.0f : -1.0f), 30.0f, 0.0f);

            GameObject    go          = MonoBehaviour.Instantiate(m_GameContr.m_FallingObject, pos, Quaternion.identity) as GameObject;
            FallingObject falling_obj = (FallingObject)go.GetComponent(typeof(FallingObject));
            m_GameContr.GetConveyor(is_right).AddObject(falling_obj);

            falling_obj.SetRotationSpeed((Random.value - 0.5f) * 10.0f);
            falling_obj.transform.rotation = Quaternion.Euler(0.0f, 0.0f, Random.value * 360.0f);

            // select object

            SpawnObjectType obj_type = GetObjectType(is_right);
            falling_obj.SetType(obj_type);
            SpawnObjectsInfo obj_info = m_SpawnObjects[obj_type];

            go.rigidbody2D.mass = obj_info.m_Mass;

            SpriteRenderer sprite_rend = falling_obj.GetComponentInChildren(typeof(SpriteRenderer)) as SpriteRenderer;
            Sprite         sprite      = Resources.Load <Sprite>(obj_info.m_SpriteName);
            if (!sprite)
            {
                Debug.LogWarning("Can't load Cake");
            }
            sprite_rend.sprite = sprite;

            float scale = 1.0f;
            go.transform.localScale = new Vector3(scale, scale, 1.0f);

            return(true);
        }
        else
        {
            return(false);
        }
    }
    public void Init()
    {
        m_SpawnObjects.Clear();
        for (int i = 0; i < (int)SpawnObjectType.Last; i++)
        {
            m_SpawnObjects[(SpawnObjectType)i] = new SpawnObjectsInfo((SpawnObjectType)i);
        }

        m_DeltaSpawnMove         = LevelsSettings.GetDeltaSpawnMove();
        m_LeftOrRightPrivilege   = 0.0f;
        m_PrivilegeChangingTrand = true;
    }