unity 对scrollRect中的项高效排序-新闻详情

unity 对scrollRect中的项高效排序


发布时间:2017-04-29责任编辑:朱明 浏览:4028


scrollRect 在unity中是一个使用率极高的部件,对scrollRect中的子项排序也是常有的需求,接下来讲一下自己使用scrollRect的排序的方法,供大家参考,有更好的建议欢迎一起探讨。

首先创建一个list保存滚动层上加载的所有部件 List<GameObject>,所有的操作就根据它来展开。

 unity 对scrollRect中的项高效排序1.png

将所有的子类部件展示到scrollRect,也同时加入到List中。当有排序要求时,使用Sort函数,先对list中项排序,然后使用for循环将排好顺序的list中的项按照新的顺序依次使用SetAsLastSibling()方法,该方法目的是,将该项放到所有项最后一个,依次循环遍历后第一设置的项自然位于第一个位置,即按照list的顺序重新设定好了顺序。以下是代码。

添加一个触发排序的下拉框

void InitDropdown()

    {

        List<string> itmes = new List<string>();

        itmes .Add("获得时间 后-前");

        dropdown_sort.AddOptions(itmes );

        dropdown_sort.onValueChanged.AddListener(ClickDropdown);

    }

    void ClickDropdown(int index)

    {

        switch (index)

        {

            case 0:

                Sort.SetSortOrder(listHeroItems, OrderType.byTime, true);

                break;

        }

    }

//添加项

public void ShowHeros(List<ServerPlayerHero> listHeros)

    {

        transformHandler.RemoveTransformAllChild(listHeroRoot);

        listHeroItems.Clear();

        for (int i = listHeros.Count-1; i >= 0; i--)

        {

            GameObject go = uiHandler.AddItem(listHeroRoot, heroItem);

            var item = go.GetComponent<HeroItemView>();

            item.Set(listHeros[i]);

            listHeroItems.Add(go);//放在链表中,用于排序

        }

    }

Sort类

//按照list的顺序依次编排顺序 false 是按照正序排列,true 按照倒序排列;

    private static void UpdateSortOrder(List<GameObject> listHeroItems,bool isUp)

    {

        for (int i = 0; i < listHeroItems.Count; i++)

        {

            if (isUp)

                listHeroItems[i].transform.SetAsFirstSibling();

            else

                listHeroItems[i].transform.SetAsLastSibling();

        }

    }

    //将list按照时间先后排序,即根据id排序

    private static void SetSortOrderByTime(List<GameObject> listHeroItems)

    {

        listHeroItems.Sort(

            (GameObject x, GameObject y) =>

            {

                var itemX = x.GetComponent<HeroItemView>();

                var itemY = y.GetComponent<HeroItemView>();

                return compareTwoValue(itemX.heroMsg.id, itemY.heroMsg.id);

            });

    }



战国工作室    供稿