一、创建垂直滑动列表
-
在canvas下创建Scroll View,取消勾选 Scroll View 的 Horizontal 属性,并删除Scroll View子物体 Scrollbar Horizontal(只创建垂直滑动列表)
-
给Content添加 Veritical Layout Group和Content Size Fitter组件
-
将列表中需要显示的物体添加到Content中
-
批量生成滑动列表的内容
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/*
* 脚本挂载在Scroll View上
*/
public enum ScrollDir
{
BottomToTop = 1,
TopToBottom = 2,
LeftToRight = 3,
RightToLeft = 4
}
public class GenerateSlidingList : MonoBehaviour
{
public Button itemPrefab;//要添加到列表的预设体按钮
public Transform contentTransform;//容器Content
public Scrollbar scrollbar;//滑动条,Hierarchy面板上的Scrollbar Vertical
public VerticalLayoutGroup layoutGroup;//Content上的Vertical Layout Group组件
List<Button> lists = new List<Button>();//按钮列表,用于存放按钮组件
string[] array = new string[] {
"正方体",
"圆锥",
"圆柱",
"球",
"胶囊体",
"梯子",
"椅子",
"门",
"花",
"草",
"树",
"木",
"鸡",
"鸭",
"鱼",
"肉",
"a",
"d",
"dianji",
"电池",
};//按钮名字数组
float itemHeight;//单个预制体按钮的高度height
RectTransform rectTransform;//Content上的Rect Transform组件
//ScrollRect scrollRect;//Scroll View上的Scroll Rect组件
// Use this for initialization
void Start()
{
//scrollRect = transform.GetComponent<ScrollRect>();
rectTransform = contentTransform.GetComponent<RectTransform>();
itemHeight = itemPrefab.GetComponent<RectTransform>().rect.height;
ShowItems();//显示Item列表
scrollbar.value = 1.0f;//Scrollbar的当前进度值
}
/// <summary>
/// 显示Item列表
/// </summary>
void ShowItems()
{
//添加20个预制体
for (int i = 0; i < 10; i++)
{
AddItem();
}
}
void Update()
{
//添加
if (Input.GetKeyDown(KeyCode.Alpha0))//按下 按键0
{
AddItem();
}
//使列表跳转到顶部
if (Input.GetKeyDown(KeyCode.Alpha1))//按下 按键1
{
ToTopFunc();
}
//使列表跳转到底部
if (Input.GetKeyDown(KeyCode.Alpha2))//按下 按键2
{
ToBottomFunc();
}
//清空列表
if (Input.GetKeyDown(KeyCode.Alpha3))//按下 按键3
{
ClearFunc();
}
}
//添加组件
void AddItem()
{
Button item = Instantiate(itemPrefab, transform.position, transform.rotation);
item.GetComponentInChildren<Text>().text = lists.Count.ToString();//按钮名字赋值为1,2,3...
item.transform.parent = contentTransform;
item.transform.SetParent(contentTransform);//将item放到Content下
lists.Add(item);
//给每个按钮组件监听点击事件
item.onClick.AddListener(
() =>
{
onClickFunc(item);
}
);
//rectTransform.sizeDelta的x是width,y是height,
//rectTransform.sizeDelta=new Vector2(rectTransform.sizeDelta.x, lists.Count * itemHeight);
rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x,
layoutGroup.padding.top + layoutGroup.padding.bottom + lists.Count * itemHeight + (lists.Count - 1) * layoutGroup.spacing);
}
//使列表跳转到顶部
void ToTopFunc()
{
/*
* 第一种方法:利用offsetMin和offsetMax
* offsetMin 是vector2(left, bottom);rectTransform.sizeDelta的x是width,rectTransform.sizeDelta的y是height
* offsetMax 是vector2(right, top);
*/
//rect.offsetMin = new Vector2(rectTransform.offsetMin.x, -rectTransform.sizeDelta.y);
//rect.offsetMax = new Vector2(rectTransform.offsetMax.x, 0);
//第二种方法:利用Scrollbar.value
scrollbar.value = 1;
}
//使列表跳转到底部,未实现
void ToBottomFunc()
{
//第一种方法:利用offsetMin和offsetMax 未实现
//rect.offsetMin = new Vector2(rect.offsetMin.x, 0);
//rect.offsetMax = new Vector2(rect.offsetMax.x, rect.sizeDelta.y);
//第二种方法:利用Scrollbar.value
scrollbar.value = 0;
}
void onClickFunc(Button btn)
{
Debug.Log(btn.gameObject.GetComponent<Text>());
removeItemFunc(btn);
}
//清空列表
void ClearFunc()
{
for (int i = 0; i < lists.Count; i++)
{
Destroy(lists[i].gameObject);
}
lists = new List<Button>();
rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x, lists.Count * itemHeight);
}
//删除单个按钮组件
void removeItemFunc(Button _btn)
{
//因为Vertical Layout Group组件会自动排列添加上的控件,所以只需要移除场景中的物体模型和list中对象就行了
Destroy(_btn.gameObject);
lists.Remove(_btn);
//需要重置容器的height
rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x,
layoutGroup.padding.top + layoutGroup.padding.bottom + lists.Count * itemHeight + (lists.Count - 1) * layoutGroup.spacing);
}
}
二、创建水平滑动列表
同垂直,将Vertical换成Horizontal
三、创建循环滚动列表
滚动列表