コード例 #1
0
    //****************************************************************************************************
    //
    //****************************************************************************************************

    public void Update()
    {
        if (updateHierarchy)
        {
            UpdateItemsDatas();
        }

        if (dirty == false)
        {
            return;
        }

        else
        {
            dirty = false;
        }


        RectTransform xform = (itemTemplate != null) ? itemTemplate.GetComponent <RectTransform>() : null;

        float itemH = (xform != null) ? xform.rect.height                                                     : 0;

        int aperture = (itemH > 0) ? ( int )(viewport.rect.height / itemH)                               : 0;

        int firstVisible = (datas.Count > 0) ? ( int )((1.0f - scrollbar.value) * (datas.Count - 1))           : 0;

        int lastVisible = (datas.Count > 0) ? Mathf.Clamp(firstVisible + aperture, firstVisible, datas.Count - 1) : 0;

        int nbVisible = (datas.Count > 0) && (aperture > 0) ? lastVisible - firstVisible + 1                    : 0;


        for (int item = 0; item < items.Count;)
        {
            int index = items[item].index;

            if ((nbVisible <= 0) || (index < firstVisible) || (index > lastVisible))
            {
                ShowItemObject(items[item].obj, false);

                pool.Release(items[item]);

                items.RemoveAt(item);

                dic.Remove(index);
            }
            else
            {
                ++item;
            }
        }


        for (int item = 0; item < nbVisible; ++item)
        {
            int index = firstVisible + item;

            if (dic.ContainsKey(index))
            {
                items[item].ReflectDatas(selection);

                continue;
            }

            UIListItem instance = pool.Grab();

            if (instance == null)
            {
                instance = CreateItem();

                instance.Setup(this, -1, GameObject.Instantiate <GameObject>(itemTemplate));

                if (instance.obj != null)
                {
                    instance.obj.hideFlags = HideFlags.DontSave;
                }
            }

            if (instance != null)
            {
                instance.index = index;

                instance.datas = datas[index];

                items.Add(instance);

                dic.Add(instance.index, instance);


                instance.xform.SetParent(content, false);

                instance.xform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, content.rect.width);

                instance.xform.localPosition = -(Vector3.up * ((index * itemH) + (itemH * 0.5f)));


                instance.ReflectDatas(selection);

                if (instance.but != null)
                {
                    instance.but.onClick.RemoveAllListeners();

                    instance.but.onClick.AddListener(delegate { SelectItem(index); });
                }

                ShowItemObject(instance.obj, true);
            }
        }

        content.sizeDelta = new Vector2(content.sizeDelta.x, (datas.Count * itemH));
    }