unity3d uiwrapcontent

2015年01月23日 13:08 0 点赞 0 评论 更新于 2025-11-21 15:11

本文将为大家介绍 Unity3D 中 UIWrapContent 的相关内容,并提供源代码示例,供大家参考学习。UIWrapContent 是 NGUI 3.5.5 中加入的一个组件,它的主要作用是将不显示的 Scroll Item 设置为 disabled 状态,这样每帧需要更新的 Scroll Item 就会减少到当前显示的那几个,从而有效避免掉帧的情况。

不过,UIWrapContent 只能创建循环的 Scroll View。但我们只需进行简单的几处修改,就能让它在普通的 Scroll View 上使用。下面是详细的修改步骤:

1. 复制并重命名脚本

复制一份 UIWrapContent.cs 文件,将其重命名为 UIBetterGrid.cs,同时修改类名。

原代码(UIWrapContent.cs,第 19 - 20 行)

[AddComponentMenu("NGUI/Interaction/Wrap Content")]
public class UIWrapContent : MonoBehaviour

修改后的代码(UIBetterGrid.cs,第 19 - 20 行)

[AddComponentMenu("NGUI/Interaction/Better Grid")]
public class UIBetterGrid : MonoBehaviour

2. 修改初始化代码

对初始化代码进行修改,主要是调整 mScroll 的相关属性。

原代码(UIWrapContent.cs,第 52 - 54 行)

mScroll.restrictWithinPanel = false;
if (mScroll.dragEffect == UIScrollView.DragEffect.MomentumAndSpring)
mScroll.dragEffect = UIScrollView.DragEffect.Momentum;

修改后的代码(UIBetterGrid.cs,第 52 - 54 行)

mScroll.restrictWithinPanel = true;
//if (mScroll.dragEffect == UIScrollView.DragEffect.MomentumAndSpring)
//    mScroll.dragEffect = UIScrollView.DragEffect.Momentum;

3. 注释创建首尾循环的代码

为了避免创建循环的 Scroll View,需要注释掉相关的创建首尾循环的代码。

水平方向(UIBetterGrid.cs,第 159 - 170 行)

//if (distance < -extents)
//{
//    t.localPosition += new Vector3(extents * 2f, 0f, 0f);
//    distance = t.localPosition.x - center.x;
//    UpdateItem(t, i);
//}
//else if (distance > extents)
//{
//    t.localPosition -= new Vector3(extents * 2f, 0f, 0f);
//    distance = t.localPosition.x - center.x;
//    UpdateItem(t, i);
//}

垂直方向(UIBetterGrid.cs,第 190 - 201 行)

//if (distance < -extents)
//{
//    t.localPosition += new Vector3(0f, extents * 2f, 0f);
//    distance = t.localPosition.y - center.y;
//    UpdateItem(t, i);
//}
//else if (distance > extents)
//{
//    t.localPosition -= new Vector3(0f, extents * 2f, 0f);
//    distance = t.localPosition.y - center.y;
//    UpdateItem(t, i);
//}

4. 修改 UIScrollView.cs 中的相关代码

UIScrollView.cs 中的 mBounds 计算代码进行修改。

原代码(UIWrapContent.cs,第 173 行)

mBounds = NGUIMath.CalculateRelativeWidgetBounds(mTrans, mTrans);

修改后的代码(UIBetterGrid.cs,第 173 行)

mBounds = NGUIMath.CalculateRelativeWidgetBounds(mTrans, mTrans, true);

通过以上步骤,我们就可以将原本只能创建循环 Scroll View 的 UIWrapContent 改造为适用于普通 Scroll View 的组件。