由於我經常時間一長就忘記,到要用的時候又要查,又要摸索,很浪費時間,所以寫下這篇文章。
scrollview就是一個能上下或者左右拖動的ui列表,背包、展示多個按鈕等情況的時候會用到。
要組成一個完整能用的ScrollView,需要以下幾個組件:
scroll rect、 mask、各種layout。大致ui層級結構如下:
先說說scroll rect ,這個東西是位於最上面父節點的組件 content屬性下的物體是方各種item的;horizontal和vertical是各種垂直橫行拖動;viewprot顯示item的框,需要有mask組件。
然后是content,它下面放各種item1、2、3、4...,想要讓它能自動排列item項,需要有下面那三個組件,選一個就好(這些組件的里面有些默認選項,強烈建議勾都去掉)
自動生成的物體item放在content節點下。
content的大小適不適中,關系到最后的拖動效果。太大的話最后結果會有剩余的空余地方,很不好看;太小的話最后結果可能會造成無論怎么拖動,都看不到所有的item項。
為了應對上述所說的情況,我們要對content物體的rect transform控件進行設置,以下以Vertical layout Group形式進行代碼示例(在這之前,content的豎向大小要設置成最小):
for (int i = 1; i < content.transform.childCount; i++)//除了第0個樣本item,其他都要刪除(如果要多次在這個content下重新生成item的話) { Destroy(content.transform.GetChild(i).gameObject); } RectTransform rect = content.GetComponent<RectTransform>();//獲取content的rect transform組件 Dictionary<string, string>.Enumerator it = dic.GetEnumerator();//假設dic是從某某配置表獲取的item具體配置 int index = 0; while (it.MoveNext()) { GameObject btn_item = Instantiate(item.gameObject); btn_item.transform.SetParent(content.transform);//一定要先設置父物體,不然生成的item的尺寸會令人蛋疼 btn_item.transform.localScale = item.transform.localScale; btn_item.gameObject.SetActive(true);//item本身默認隱藏 index++; float btn_rect = btn_item.GetComponent<RectTransform>().rect.height;//獲取單個按鈕的高度 rect.offsetMin = new Vector2(rect.offsetMin.x, -1 * btn_rect * index);//對content的高度進行修改,往下要乘-1 }
這樣就能讓content獲得合適的大小了。如果使用gridlayout的話算法要變一下,要根據item和content的寬度來算。
想要知道設置rect transform大小的其他屬性的方法在另一篇文章里,鏈接:https://www.cnblogs.com/Transmuter/articles/11077520.html