Unity list, horizontal, vertical, circular scrolling list

1. Create a vertical sliding list

  1. Create a Scroll View under the canvas, uncheck the Horizontal property of the Scroll View, and delete the Scroll View sub-object Scrollbar Horizontal (only create a vertical sliding list)

  2. Add Veritical Layout Group and Content Size Fitter components to Content
    insert image description here

  3. Add the objects that need to be displayed in the list to Content

  4. Generate the content of the sliding list in batches

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

}

2. Create a horizontal sliding list

Same vertical, replace Vertical with Horizontal

3. Create a circular scrolling list

scroll list

おすすめ

転載: blog.csdn.net/weixin_45686837/article/details/123081963