小言_互联网的博客

FairyGUI循环列表

382人阅读  评论(0)

FairyGUI循环列表

实现效果:在Unity中,通过鼠标可以循环浏览列表,并且浏览当前页时,有一个近大远小的效果。

一、导入资源




二、新建按钮

三、设计列表


四、装载器动态加载图片按钮

如果有上万个按钮,我们不可能一个个创建,这时候就需要在Unity中动态加载图片按钮的资源,故此引入装载器。

按钮大小是248×378,那么装载器也应该是248×378。然后将其位置归为0,0。


再次进入列表,给它多添加几个对象。

五、打包发布


六、Unity中显示


七、编写代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;

public class LoopList : MonoBehaviour
{
   
    private GComponent mainUI;
    private GList list;
    void Start()
    {
   
        mainUI = GetComponent<UIPanel>().ui;
        list = mainUI.GetChild("n0").asList;  //n0是FairyGUI中的列表
        list.SetVirtualAndLoop();  //把列表设置为虚拟列表(FGUI规定:如果使用列表,则必须使用虚拟列表)
        list.itemRenderer = RenderListItem;  //调用list里面的渲染函数,它是一个委托类型的变量,所以要给它赋值一个方法
        list.numItems = 5;  //设置列表长度
    }
    
    private void RenderListItem(int index, GObject obj)
    {
   
        GButton button = obj.asButton;
        button.icon = UIPackage.GetItemURL("LoopList", "n" + (index + 1));  //动态获取URL
    }
}

编译运行,回到Unity发现报错。原来在FairyGUI中忘记拖入项目资源了,手动拖入即可。


再次重新发布一下

此时,回到Unity,运行结果如下。发现“第二章”、“第三章”下边的图片都是“第一章”下边的图片。什么原因呢?因为之前我们在FairyGUI中给了Button1一个渲染,显然这是不可以的。所以我们要把它本身的图片渲染给删掉。直接通过icon对它加载就可以了。



还有一个地方就是,找到LoopList列表,把它的溢出处理设置为“水平滚动”。

再次发布,运行一切正常。

八、运行效果

九、进一步完善——近大远小的特效

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FairyGUI;

public class LoopList : MonoBehaviour
{
   
    private GComponent mainUI;
    private GList list;
    void Start()
    {
   
        mainUI = GetComponent<UIPanel>().ui;
        list = mainUI.GetChild("n0").asList;  //n0是FairyGUI中的列表
        list.SetVirtualAndLoop();  //把列表设置为虚拟列表(FGUI规定:如果使用列表,则必须使用虚拟列表)
        list.itemRenderer = RenderListItem;  //调用list里面的渲染函数,它是一个委托类型的变量,所以要给它赋值一个方法
        list.numItems = 5;

        list.scrollPane.onScroll.Add(DoSpecialEffect);
        DoSpecialEffect();
    }

    private void DoSpecialEffect()
    {
   
        float listCenter = list.scrollPane.posX + list.viewWidth / 2;
        //scrollPane是当前列表的宽度;viewWidth是列表自身宽度
        for (int i = 0; i < list.numChildren; i++)  //numChildren是当前渲染的对象,也就是运行时Game中能看见的个数
        {
   
            GObject item = list.GetChildAt(i);
            float itemCenter = item.x + item.width / 2;
            float itemWidth = item.width;
            float distance = Mathf.Abs(listCenter - itemCenter);
            if (distance < itemWidth)
            {
   
                float distanceRange = 1 + (1 - distance / itemWidth) * 0.2f;
                item.SetScale(distanceRange, distanceRange);
            }
            else
            {
   
                item.SetScale(1, 1);
            }
        }
    }
    private void RenderListItem(int index, GObject obj)
    {
   
        GButton button = obj.asButton;
        button.SetPivot(0.5f, 0.5f);  //设置锚点为中心位置
        button.icon = UIPackage.GetItemURL("LoopList", "n" + (index + 1));  //动态获取URL
    }
}


将列表和按钮分别与容器做一下关联


发布后在Unity中运行就没有任何问题了。

十、最终完美效果图


转载:https://blog.csdn.net/qq_46649692/article/details/117127178
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场