//**************************************************************************************************** // //**************************************************************************************************** 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)); }