UISlider

进度条

我们需要判断一下什么时候使用进度条了

我们之前讲过了Sprite,Label,Texture,Button的用法之前的4种都是比较常用的基础控件。而进度条是一种更高级的控件,它是多个控件的结合体。我们可以看到进度条有两种一种是可以拖动的,一种是只显示了百分比的不可拖动的,唯一的区别是可拖动进度条上多了一个拖动块和BoxCollider来接收事件,而不可拖动的进度条只能显示一个数字的百分比,玩家无法操控。

(1)如果某一种值,它有最大值,我们需要表达它当前的值的占比的时候,这个时候用进度条会非常直观,此时应当用不可拖动的进度条,例如我们角色的生命值,法力值,角色升级经验等等,还有加载的时候。 (2)如果某一种值,它有最大值最小值,我们希望这些值由玩家手动去设置,如音量调节,亮度调节等等,我们就可以使用可拖动的进度条了。

不管是哪一种进度条,他们的原理都是一模一样的,本质区别是可拖动进度条只有一个BoxCollider,他们都有三大核心要素构成,底槽Sprite,进度条Sprite和滑动块

一、创建进度条

第一种方法:我们自己来组装一个进度条

(1)创建一个底槽Sprite (2)为底槽Sprite附加一个UISlider组件,附加方法为直接addcompent,NGUI,Interatcion,NGUI Slider (3)在底槽Sprite下创建一个进度条Sprite作为子物体,调整好尺寸用以和底槽相吻合 (4)在底槽Sprite下创建一个滑动块Sprite作为子物体,当然如果不需要就可以不创建了,然后再底槽Sprite上attach一个BoxCollider (5)将底槽Sprite拖动到自身UISlider组件上的BackGround选项中,将进度条Sprite拖动到底槽的UISlider组件上的Foreground选项中,将滑动块Sprite拖动到底槽的UISlider组件上的Thumb选项中,这样三大要素就完成了。 (6)如果希望显示当前的进度的百分比数字,则在滑动块下创建一个label(这个时候label会跟随滑动块一起走,如果不希望跟着走,创建到其他位置即可)然后将该label物体拖动到底槽的UISlider组件的OnValue Change模块下的Notify,然后再出现的Method选项中选择UILabel.SetCurrent Percent方法,这样就创建完成了。

第二种方法:使用PrefabToolBar直接创建

在新版本NGUI,它自身制作了一些常用的UI控件的预设,当我们需要使用时,直接拖动预设到场景中,就可以直接完成创建了,拖动到对应的UIRoot下面就可以了

二、核心组件UISlider设置

(1)Value,这个就是比较重要的一个值,就是用来控制数值槽里面的百分比的,我们一般制作游戏的时候,都会再代码中调用这个参数,让它在游戏中通过想要的数据动态计算的出来的。 (2)Alpha,透明度 (3)Steps,每次变动的步伐大小,默认为0,0就是无限制,也就是Value可以是任意一个值,如果设置了,那么Value就会一段一段的变化,例如我们填入5的话,那么相当于进度条的值就只会有0,0.25,0.5,0.75,1一共这5个值了 (4)Appearance模块 这是滑动条的一些组件 Foreground,进度条上层表示进度的Sprite,将它拖动到这里就完成了设置,Foreground的长度会随着Value的变化而变化 Background,进度条的底槽Sprite,将它拖动到这里就算完成了设置,底槽的长度是不会发生变化的。 Thumb,拖动块的设置,将任何一个物体拖动到这里来,它就将随着Value的变化而发生位置的变化 。 Direction,进度条的方向,有四种选择,从左往右,从右往左,从上往下,从下往上 (5)On Value Change,这是进度条变量发生改变的时候的一个回调函数,当Value值发生变化时,就会执行这里的函数这里设定的方法,和设置button的回调方法是一模一样的。

进度条的BoxCollider说明 BoxCollider只有附加到底槽上才有作用;如果没有BoxCollider,进度条无论如何都无法进行拖动设置;BoxCollider将会接受进度条上任何一个位置的消息来直接设置进度;不去拖滑动块,直接在90%的位置点一下,那么进度会直接变为90%;BoxCollider和拖动块Thumb没有必然的练习,如果没有BoxCollider,那么即使有拖动块,也无法通过拖动和单击来进行设置进度;只有BoxCollider,即使没有拖动块,我们也能直接拖动和单击来设置进度位置。

根据一个变化的进度来控制进度条的显示

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

public class SliderChange : MonoBehaviour {

    public UISlider slider;

    private float total = 100.0f;
    private float progress = 0.0f;

    // Use this for initialization
    void Start () {
        InvokeRepeating ("setProgress", 1, 1);
    }

    // Update is called once per frame
    void Update () {

    }

    void setProgress() {
        progress += 1.0f;
        Debug.Log ("progress: " + progress);
        slider.value = progress / total;
        if (progress >= total) {
            CancelInvoke ("setProgress");

        }
    }
}

results matching ""

    No results matching ""