16.ScrollView滚动视图

  1. 16.NGUI基础-组合控件-ScrollView滚动视图
    1. 16.1 知识点
      1. ScrollView滚动视图的作用
      2. 制作ScrollView
        1. 直接在工具栏创建即可 NGUI——Create——ScrollView。
        2. 若需要ScrollBar,自行创建ScrollBar,在ScrollView脚本中关联水平滚动条或者竖直滚动条。
        3. 给ScrollView添加子对象,为子对象添加Drag ScrollView脚本和NGUI碰撞器。
      3. ScrollView滚动视图组件参数
        1. Panel脚本
          1. Size 可以设置滚动视图的可视范围,超过可视范围的部分会被裁剪
        2. ScrollView脚本
          1. Content Origin 内容子对象对其方式九宫格
          2. Movement 滚动视图拖曳的方向。
          3. Drag Effect 拖动特效
          4. Scroll Wheel Factor 滚动因子
          5. Momentum Amount 动量
          6. Spring Strength 弹力大小
          7. Dampen Strength 阻尼强度
          8. Restrict Within Panel 限制在Panel中
          9. Constrain On Drag 阻力约束
          10. Cancel Drag if fits 如果合适取消拖动
          11. Smooth Drag Start 平滑拖动
          12. IOS Drag Emulation IOS阻力模拟
          13. ScrollBars 滚动条关联。
      4. 自动对齐脚本Grid参数相关
        1. Arrangement 排序对其方式
        2. Cell width 元素宽。
        3. Cell Height 元素高。
        4. Row Limit 元素个数,会自动换行。
        5. Sorting 排序顺序
        6. Inverted 倒转
        7. Pivot 锚点位置,9宫格9个位置。
        8. Smooth Tween 平缓缓动动画
        9. Hide Inactive 是否隐藏不活动组件
        10. Constrain To panel 约束面板
    2. 16.2 知识点代码
    3. 16.3 练习题
      1. 在ScrollBar滚动条和ProgressBar进度条的练习题基础上,请用现在所学知识,制作一个这样的功能,有一个背包按钮,点击后可以打开一个背包面板,面板中有一个滚动视图,滚动视图中动态创建10个道具图标
        1. 需要解决的问题
        2. 创建背包面板,修改面板深度
        3. 给背包面板创建一个遮罩背景,一个背包面板背景。创建一个标题标签写上文字。创建滚动视图,设置好大小并设置位置和背包面板背景一致。创建一个滚动条,设置好图片和位置,在滚动视图上关联。注意修改滚动条的子Sprite的层级深度,并且把滚动条模式修改成从上到下。创建一个关闭按钮。
        4. 给背包滚动视图添加Grid以解决布局问题,目标是设置格子创建的位置为左上角并排列好。创建grid后会发现格子是已滚动视图中心对齐的,并且滚动视图子对象也不是以左上角对齐的。要先全选所有子对象,设置成以左上角对齐。同时修改滚动视图Panel中心点Center的位置。中心点设置X位置为大小Size X的一半,Y取SIze Y的一半且是负数,就是左上角。修改中心点可能会导致上方xy的Offset变化,把它设置为0就好。设置好后重新调整滚动视图到合适的位置即可。注意修改后要重新失活激活Grid组件才能重新排列
        5. 在GamePanel脚本创建背包按钮变量,创建一个背包按钮,关联后在代码添加点击出背包面板的监听
        6. 创建一个Sprite,添加DragScrollView脚本,添加NGUI碰撞器,做成预制体放到Resource文件夹下,用于背包动态加载的Item。这个Item中心点要设置成左上。
        7. 创建BagPanel背包面板脚本,添加给背包面板。把背包面板搞成单例。添加点击关闭按钮让背包面板隐藏的监听。动态创建预制体对象Item,并且刷新滚动视图的滚动条。这样能让滚动条显示正常。可以选择是否使用滚动视图的Grid来限制动态创建预制体对象Item的位置。如果不使用的话就要通过代码手算。以后假如要自己定义排序规则最好用自己手写代码手算位置。
    4. 16.4 练习题代码
      1. GamePanel
      2. BagPanel

16.NGUI基础-组合控件-ScrollView滚动视图


16.1 知识点

ScrollView滚动视图的作用

  • 滚动视图,主要用于背包、商店、排行榜等功能。

制作ScrollView

直接在工具栏创建即可 NGUI——Create——ScrollView。

  • 注意要有UIRoot根节点,创建ScrollView不会自动创建根节点。

若需要ScrollBar,自行创建ScrollBar,在ScrollView脚本中关联水平滚动条或者竖直滚动条。

  • 注意,ScrollView脚本中关联ScrollBar之后ScrollBar的值会自动设置。

给ScrollView添加子对象,为子对象添加Drag ScrollView脚本和NGUI碰撞器。

ScrollView滚动视图组件参数

Panel脚本

Size 可以设置滚动视图的可视范围,超过可视范围的部分会被裁剪

ScrollView脚本

Content Origin 内容子对象对其方式九宫格
Movement 滚动视图拖曳的方向。

  • 水平
  • 垂直
  • 自由
  • 自定义(默认是水平的)。
Drag Effect 拖动特效

  • 不使用任何效果
  • 动量(惯性)效果(差异不明显,一般不使用)
  • 动量(惯性)和弹力效果(默认使用)。
Scroll Wheel Factor 滚动因子
  • 如果不为0,鼠标中间滚动可以滚动它,可以通过它控制速度和方向。
Momentum Amount 动量
  • 拖曳一下鼠标,动的快慢,可以理解成惯性大小。
Spring Strength 弹力大小
  • 移动到边缘时弹回时弹力大小。
Dampen Strength 阻尼强度
  • 影响回弹效果。
Restrict Within Panel 限制在Panel中
  • 不勾选不会产生弹力效果。
Constrain On Drag 阻力约束
  • 一般不修改。
Cancel Drag if fits 如果合适取消拖动
  • 若勾选,滚动视图的内容是否应该是可拖动的,取决于它们当前子对象大小是否溢出。
  • 如果勾选,假如子对象的范围没有溢出滚动视图,就不能拖动。溢出了才能拖动。不勾选可以随便拖动
Smooth Drag Start 平滑拖动
  • 一般不修改。
IOS Drag Emulation IOS阻力模拟
  • 一般不修改。
ScrollBars 滚动条关联。
  • Horizontal 水平滚动条
  • Vertical 竖直滚动条
  • ShowCondition 滚动条显示时机
    • 一直显示
    • 需要时显示(子对象没溢出就不显示)
    • 拖动时显示。

自动对齐脚本Grid参数相关

Arrangement 排序对其方式

  • 水平
  • 竖直
  • 元素大小。

Cell width 元素宽。

Cell Height 元素高。

Row Limit 元素个数,会自动换行。

Sorting 排序顺序

  • 没有排序
  • 按字母排序
  • 水平放置顺序
  • 垂直放置顺序
  • 自定义。

Inverted 倒转

  • 若选择了排序方式,勾选这里可以翻转排序规则。

Pivot 锚点位置,9宫格9个位置。

Smooth Tween 平缓缓动动画

  • 排序时是否会平滑地将其子对象设置为正确的位置。

Hide Inactive 是否隐藏不活动组件

  • 假如有失活的对象是否算他的位置。

Constrain To panel 约束面板

  • 是否将网格子对象的更改通知父容器Panel,会用于更新ScrollBar的拖拽块的大小等显示信息。

16.2 知识点代码

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

public class Lesson16_NGUI基础_组合控件_ScrollView滚动视图 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 ScrollView是用来干啥的
        //滚动视图
        //我们现在用于编程的VS代码窗口就是典型的滚动视图
        //游戏中主要用于 背包、商店、排行榜等等功能
        #endregion

        #region 知识点二 制作ScrollView
        //1.直接在工具栏创建即可 NGUI——Create——ScrollView 注意要有UIRoot根节点 创建ScrollView不会自动创建根节点
        //2.若需要ScrollBar 自行创建ScrollBar 在ScrollView脚本中关联水平滚动条或者竖直滚动条
        //3.给ScrollView添加子对象 为子对象添加Drag Scroll View脚本和NGUI碰撞器
        #endregion

        #region 知识点三 ScrollView参数相关

        #endregion

        #region 知识点四 自动对齐脚本Grid 参数相关

        #endregion
    }
}

16.3 练习题

在ScrollBar滚动条和ProgressBar进度条的练习题基础上,请用现在所学知识,制作一个这样的功能,有一个背包按钮,点击后可以打开一个背包面板,面板中有一个滚动视图,滚动视图中动态创建10个道具图标

需要解决的问题

  1. 动态创建问题
  2. 布局问题
  3. 滚动条更新问题

创建背包面板,修改面板深度

给背包面板创建一个遮罩背景,一个背包面板背景。创建一个标题标签写上文字。创建滚动视图,设置好大小并设置位置和背包面板背景一致。创建一个滚动条,设置好图片和位置,在滚动视图上关联。注意修改滚动条的子Sprite的层级深度,并且把滚动条模式修改成从上到下。创建一个关闭按钮。

给背包滚动视图添加Grid以解决布局问题,目标是设置格子创建的位置为左上角并排列好。创建grid后会发现格子是已滚动视图中心对齐的,并且滚动视图子对象也不是以左上角对齐的。要先全选所有子对象,设置成以左上角对齐。同时修改滚动视图Panel中心点Center的位置。中心点设置X位置为大小Size X的一半,Y取SIze Y的一半且是负数,就是左上角。修改中心点可能会导致上方xy的Offset变化,把它设置为0就好。设置好后重新调整滚动视图到合适的位置即可。注意修改后要重新失活激活Grid组件才能重新排列



在GamePanel脚本创建背包按钮变量,创建一个背包按钮,关联后在代码添加点击出背包面板的监听

public class GamePanel : MonoBehaviour
{
    #region Lesson16_NGUI基础_组合控件_ScrollView滚动视图练习题
    public UIButton btnBag;
    #endregion
    
    void Start()
    {
        #region Lesson16_NGUI基础_组合控件_ScrollView滚动视图练习题
        // 点击背包按钮 打开背包
        btnBag.onClick.Add(new EventDelegate(() => {
            BagPanel.Instance.gameObject.SetActive(true);
        }));
        #endregion
    }
}

创建一个Sprite,添加DragScrollView脚本,添加NGUI碰撞器,做成预制体放到Resource文件夹下,用于背包动态加载的Item。这个Item中心点要设置成左上。

创建BagPanel背包面板脚本,添加给背包面板。把背包面板搞成单例。添加点击关闭按钮让背包面板隐藏的监听。动态创建预制体对象Item,并且刷新滚动视图的滚动条。这样能让滚动条显示正常。可以选择是否使用滚动视图的Grid来限制动态创建预制体对象Item的位置。如果不使用的话就要通过代码手算。以后假如要自己定义排序规则最好用自己手写代码手算位置。

public class BagPanel : MonoBehaviour
{
    private static BagPanel instance;
    
    public static BagPanel Instance => instance;
    
    public UIScrollView sv;
    public UIButton btnClose;
    
    private void Awake()
    {
        instance = this;
    }
    
    void Start()
    {
        // 点击关闭按钮 让自己隐藏
        btnClose.onClick.Add(new EventDelegate(() => {
            this.gameObject.SetActive(false);
        }));
        
        // 动态创建10个道具图标
        for (int i = 0; i < 60; i++)
        {
            GameObject obj = Instantiate(Resources.Load<GameObject>("Item"));
            obj.transform.SetParent(sv.transform, false);
            // 如果通过代码 来自己设置位置 就在这里设置即可
            obj.transform.localPosition = new Vector3(120 * (i % 5), 120 * (i / 5), 0);
        }
        
        // 通过sv控制 滚动条更新
        sv.UpdateScrollbars();
        
        this.gameObject.SetActive(false);
    }
}

16.4 练习题代码

GamePanel

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

public class GamePanel : MonoBehaviour
{
    private static GamePanel instance;

    public static GamePanel Instance => instance;

    public UIButton btn;

    public TankObj player;

    public UIToggle togSound;

    public UILabel labName;

    public UIButton btnChangeName;

    #region Lesson13_NGUI基础_组合控件_PopupList下拉列表练习题
    public UIPopupList list;
    public Light lightObj;
    #endregion

    #region Lesson14_NGUI基础_组合控件_Slider滑动条练习题
    public UISlider sliderSound;
    #endregion

    #region Lesson15_NGUI基础_组合控件_ScrollBar滚动条和ProgressBar进度条练习题
    public UIProgressBar progressBar;
    #endregion

    private void Awake()
    {
        instance = this;
    }

    void Start()
    {
        btn.onClick.Add(new EventDelegate(() =>
        {
            player.Fire();
        }));

        togSound.onChange.Add(new EventDelegate(() =>
        {
            MusicData.isOpenSound = togSound.value;
        }));

        btnChangeName.onClick.Add(new EventDelegate(() =>
        {
            ChangeNamePanel.Instance.gameObject.SetActive(true);
        }));

        #region Lesson13_NGUI基础_组合控件_PopupList下拉列表练习题
        list.onChange.Add(new EventDelegate(() =>
        {
            switch (list.value)
            {
                case "白天":
                    lightObj.intensity = 1;
                    break;
                case "黑夜":
                    lightObj.intensity = 0.2f;
                    break;
            }
        }));
        #endregion

        #region Lesson14_NGUI基础_组合控件_Slider滑动条练习题
        sliderSound.onChange.Add(new EventDelegate(() =>
        {
            MusicData.soundValue = sliderSound.value;
        }));
        #endregion

        #region Lesson15_NGUI基础_组合控件_ScrollBar滚动条和ProgressBar进度条练习题
        HideHpPro();
        #endregion
    }

    public void ShowHpPro()
    {
        progressBar.gameObject.SetActive(true);
    }

    public void HideHpPro()
    {
        progressBar.gameObject.SetActive(false);
    }

    public void UpdatePro(float nowValue, float maxValue)
    {
        progressBar.value = nowValue / maxValue;
    }
}

BagPanel

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

public class BagPanel : MonoBehaviour
{
    private static BagPanel instance;

    public static BagPanel Instance => instance;

    public UIScrollView sv;
    public UIButton btnClose;

    private void Awake()
    {
        instance = this;
    }

    void Start()
    {
        //点击关闭按钮 让自己隐藏
        btnClose.onClick.Add(new EventDelegate(() => {

            this.gameObject.SetActive(false);
        }));

        //动态创建10个道具图标
        for (int i = 0; i < 60; i++)
        {
            GameObject obj = Instantiate(Resources.Load<GameObject>("Item"));
            obj.transform.SetParent(sv.transform, false);
            //如果通过代码 来自己设置位置 就在这里设置即可
            obj.transform.localPosition = new Vector3(120 * (i % 5), 120 * (i / 5), 0);
        }

        //通过sv控制 滚动条更新
        sv.UpdateScrollbars();

        this.gameObject.SetActive(false);
    }

}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏