Using unityengine;using system.collections;using system.collections.generic;using unityengine.ui;///<summary >///Infinite loop list///edisonlee///public class uiloop1:uibase{enum Direction {horizontal, Vertical } [Serializefield] private recttransform M_cell; [Serializefield] Private Vector2 m_page; [Serializefield] Direction Direction = direction.horizontal; [Serializefield,range (4,10)] private int m_bufferno; Private list<recttransform> M_instantiateitems = new list<recttransform> (); Private IList M_datas; Public Vector2 Cellrect {get {return M_cell! = null? m_Cell.sizeDelta:new Vector2 (100, 100);}} Public float Cellscale {get {return direction = = Direction.horizontal? Cellrect.x:cellrect.y; }} private Float m_prevpos = 0; Public float Directionpos {get {return direction = = Direction.horizontal? m_rect.anchoredposition.x:m_rect.anchoredpo SITION.Y; }} The private int m_currentindex;//pageThe position of a row (column) in the entire conten private Vector2 m_instantiatesize = Vector2.zero; Public Vector2 Instantiatesize {get {if (m_instantiatesize = = Vector2.zero) { float rows, cols; if (direction = = direction.horizontal) {rows = m_page.x; cols = M_page.y + (float) M_bufferno; } else {rows = m_page.x + (float) M_bufferno; cols = M_page.y; } m_instantiatesize = new Vector2 (rows, cols); } return m_instantiatesize; }} public int PageCount {get {return (int) m_page.x * (int) m_page.y;}} public int PageScale {get {return direction = = Direction.horizontal? (int) m_page.x: (int) m_page.y; }} private ScrollRect m_scrollrect; Private Recttransform m_rect; public int Instantiatecount {get {return (int) instantiatesize.x * (int) Instantiatesize.y; }} protected override void Awake () {m_scrollrect = getcomponentinparent<scrollrect> (); M_scrollrect.horizontal = Direction = = Direction.horizontal; m_scrollrect.vertical = Direction = = direction.vertical; M_rect = getcomponent<recttransform> (); M_Cell.gameObject.SetActive (FALSE); } public override void Data (object Data) {M_datas = data as IList; if (M_datas.count > PageCount) {setbound (Getrectbynum (M_datas.count)); } else {setbound (m_page); } if (M_datas.count > Instantiatecount) {while (M_instantiateitems.count < Instantiatecoun T) {CreateItem (m_instantiateitems.count); }} else {while (M_instantiateitems.count > M_datas.count) { RemoveItem (m_instantiateitems.count-1); } while (M_instantiateitems.count < M_datas.count) {CreateItem (m_instantiateitems.count); }}} private void CreateItem (int index) {recttransform item = Gameobject.instantiate (M_cell); Item. SetParent (transform, false); Item.anchormax = Vector2.up; Item.anchormin = Vector2.up; Item.pivot = Vector2.up; Item.name = "item" + Index; Item.anchoredposition = Direction = = Direction.horizontal? New Vector2 (Mathf.floor (index/instantiatesize.x) * cellrect.x,-(index% instantiatesize.x) * Cellrect.y): n EW Vector2 (index% instantiatesize.y) * cellrect.x,-mathf.floor (index/instantiatesize.y) * cellrect.y); M_instantiateitems.add (item); Item.gameObject.SetActive (TRUE); UpdateItem (index, item.gameobject); } private void RemoveItem (int index) {recttransform item = M_instantiateitems[index]; M_instantiateitems.remove (item); Recttransform.destroy (Item.gameobject); }///<summary>//How many rows are fetched by the number of squares///</summary>//<param name= "num" ></param> number of squares <returns></returns> private Vector2 getrectbynum (int num) {return direction = = Direction.ho Rizontal? New Vector2 (m_page.x, Mathf.ceiltoint (num/m_page.x)): New Vector2 (Mathf.ceiltoint (num/m_page.y), m_page.y ); }///<summary>//Set content size///</summary>//<param name= "Rows" ></param> rows/ <param name= "cols" ></param> number of columns private void Setbound (Vector2 bound) {M_rect.sizedelta = new Ve Ctor2 (BOUND.Y * cellrect.x, bound.x * cellrect.y); } public float Maxprevpos {get {float result; Vector2 max = Getrectbynum (M_datas.count); if (direction = = direction.horizontal) {result = Max.y-m_page.y; } else {result = max.x-m_page.x; } return result * Cellscale; }} public float scale {get {return direction = = Direction.horizontal? 1f: -1f;}} void Update () {while (scale * Directionpos-m_prevpos <-cellscale * 2) {if (M_prevpos <=-maxprevpos) return; M_prevpos-= Cellscale; List<recttransform> range = m_instantiateitems.getrange (0, PageScale); M_instantiateitems.removerange (0, PageScale); M_instantiateitems.addrange (range); for (int i = 0; i < range. Count; i++) {moveitemtoindex (M_currentindex * pagescale + m_instantiateitems.count + i, range[i]); } m_currentindex++; } while (scale * directionpos-m_prevpos >-cellscale) {if (Mathf.roundtoint (M_prevpos) & gt;= 0) return; M_prevpos + = Cellscale; m_currentindex--; if (M_currentindex < 0) return; List<recttransform> range = M_instantiateitems.getrange (M_instantiateitems.count-pagescale, PageScale); M_instantiateitems.removerange (M_instantiateitems.count-pagescale, PageScale); M_instantiateitems.insertrange (0, range); for (int i = 0; i < range. Count; i++) {moveitemtoindex (M_currentindex * pagescale + i, range[i]); }}} private void Moveitemtoindex (int index, recttransform item) {item.anchoredposition = GetPos Byindex (index); UpdateItem (index, item.gameobject); } private Vector2 Getposbyindex (int index) {float x, y; if (direction = = direction.horizontal) {x = index% m_page.x; y = Mathf.floortoint (index/m_page.x); } else {x = Mathf.floortoint (INDEX/M_PAGE.Y); y = index% m_page.Y } return new Vector2 (Y * cellrect.x,-X * cellrect.y); } private void UpdateItem (int index, gameobject item) {Item. SetActive (Index < m_datas.count); if (item.activeself) {Uiloopitem lit = item. Getcomponent<uiloopitem> (); Lit. UpdateItem (index, item); Lit. Data (M_datas[index]); } }}
https://www.zhihu.com/question/23895384
This article fixed link: http://www.cnblogs.com/fly-100/p/4549354.html
Unity ugui--Infinite Loop list (reprint)