Unity滚动列表

 之前我还在用克隆,主程把我一顿怼。说用缓存实现。只好认真学习

 关于缓存真的没啥,多练习,多使用就好,毕竟这么好的功能,减少内存消耗真的挺棒的。

 

    UIScrollView RightView;
    UIMyWrapContent myWrap;
    UIPanel RightPanel;
    SpringPanel RightSpringP;
    bool isfirst = true;
    const int MaxItemNum = 3;

    /// <summary>
    /// 缓存
    /// </summary>
    Item_RideSkillList[] item_RideSkillList = new Item_RideSkillList[MaxItemNum];

void Init()
    {
        RightView = transform.FindChild("Right").GetComponent<UIScrollView>();
        myWrap = RightView.GetComponent<UIMyWrapContent>();
        RightPanel = RightView.GetComponent<UIPanel>();
        RightSpringP = RightView.GetComponent<SpringPanel>();
        myWrap.InitThis();
        myWrap.onInitializeItem = OnInitializeItem;
  }


//缓存最重要的方法,在滑动时候就是这个函数起作用
  void OnInitializeItem(GameObject go, int wrapIndex, int realIndex)
    {
        if (MaxItemLine < MaxItemNum + 1 || !Isinit)
            return;
        if (go.name.StartsWith("Item_RideSkillList_"))
        {
            int itemP = 0;
            int.TryParse(go.name.Replace("Item_RideSkillList_", string.Empty), out itemP);
            if (realIndex > 0)
            {
                item_RideSkillList[itemP - 1].gameObject.SetActive(false);
                return;
            }
            //itemP: 1  2  3 
            int reI = Mathf.Abs(realIndex);
            if (MaxItemLine > reI)
                SetItemData(itemP - 1, reI);
        }
    }
//这就是对缓存的子物体进行赋值
void SetItemData(int itemPos, int LinePos)
    {
        List<RideSkill> rs = new List<RideSkill>();
        for (int i = 0; i < OneLineCount; ++i)
        {
            if (OneLineCount * LinePos + i < ridelists.Count)
                rs.Add(ridelists[(OneLineCount * LinePos + i)]);
        }
        item_RideSkillList[itemPos].Setdata(rs);
    }

//设置缓存的个数,MaxItemLine就是一共有的东西
void SetData()
    {
        myWrap.maxIndex = 0;
        myWrap.minIndex = 1 - MaxItemLine;
   if (MaxItemLine > MaxItemNum)
        {
            myWrap.enabled = true;
            for (int i = 0; i < MaxItemNum; ++i)
            {
                item_RideSkillList[i].gameObject.SetActive(true);
                SetItemData(i, i);
                if (isfirst)
                    item_RideSkillList[i].transform.localPosition = new Vector3(0, -myWrap.itemSize * i, 0);
            }
        }
        else
        {
            for (int i = 0; i < MaxItemNum; ++i)
            {
                if (isfirst)
                    item_RideSkillList[i].transform.localPosition = new Vector3(0, -myWrap.itemSize * i, 0);
                if (i >= MaxItemLine)
                    item_RideSkillList[i].Hide();
                else
                    SetItemData(i, i);
            }
        }
        if (isfirst)
        {
            RightSpringP.enabled = false;
            RightPanel.transform.localPosition = new Vector3(180, 8, 0);
            RightPanel.clipOffset = Vector2.zero;
            RightView.ResetPosition();
        }
        isfirst = false;

}

关于 UIMyWrapContent类,继承于UIWrapContent,也是对NGUI进行扩展

using UnityEngine;
using System.Collections;

public class UIMyWrapContent : UIWrapContent
{
    protected override void Start()
    {
        SortBasedOnScrollMovement();
        if (mScroll != null) mScroll.GetComponent<UIPanel>().onClipMove = OnMove;
        mFirstTime = false;
    }
    public void WrapContentForce()
    {
        mFirstTime = true;
        base.WrapContent();
        mFirstTime = false;
    }

    public void InitThis()
    {
        base.Start();
    }
    public  void MyUpdate()
    {
        for (int i = 0, imax = mChildren.Count; i < imax; ++i)
        {
            Transform t = mChildren[i];
            UpdateItem(t, i);
        }
    }
}

也是多练习就好了,主要还是对

 void OnInitializeItem(GameObject go, int wrapIndex, int realIndex)

{   }

方法的使用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值