之前我还在用克隆,主程把我一顿怼。说用缓存实现。只好认真学习
关于缓存真的没啥,多练习,多使用就好,毕竟这么好的功能,减少内存消耗真的挺棒的。
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)
{ }
方法的使用