unity列表,水平,垂直,循环滚动列表

一、创建垂直滑动列表

  1. 在canvas下创建Scroll View,取消勾选 Scroll View 的 Horizontal 属性,并删除Scroll View子物体 Scrollbar Horizontal(只创建垂直滑动列表)

  2. 给Content添加 Veritical Layout Group和Content Size Fitter组件
    在这里插入图片描述

  3. 将列表中需要显示的物体添加到Content中

  4. 批量生成滑动列表的内容

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

三、创建循环滚动列表

滚动列表

猜你喜欢

转载自blog.csdn.net/weixin_45686837/article/details/123081963