UGUI的一些琐碎知识点

   嗯,这里记载了我最近学习的一些UGUI的知识,以后可能还会有扩展的,这算01吧

                      UGUI学习和分析

嗯,又到了更新博客的时间,今天我将在这篇文档里记载UGUI的部分基础操作,未来的话可能会有更多的扩充,还是这句话,一起学习,一起成长

1.    什么是GUI

GUI也叫graphical user interface,即是用户与游戏进行交互的一个图形窗口,包括背包系统,任务列表,菜单栏,控制移动的虚拟杆和控制按钮,开始菜单等等,我们都叫它GUI

2.    Image的四种属性

  我们在UI设计种常用到Image,而它的四种属性分别对应着不同的作用

1.    simple  嗯,这种属性就是图片原本的样子.

2.    Sliced属性  假设我们想要将一个图片放大,这时候它的边框又不想放大,以免发生图片模糊的情况,这时候我们就可以设置sliced属性,通过sprite editor进行切割,这样就可以自己设定缩放的位置了

 

3.    tiled

这个属性的作用是让图片平铺整个Image

4.    filled

这个属性就是表示图片显示的方式了,修改fill amount,改变所占面积

3.    如何制作技能的冷却效果

创建一个这样的游戏图标,添加阴影在上面,给它一个button组件并且关联到我们下面的脚本,然后根据脚本操作即可完成冷却效果

4.    

5.   public class SkillTime : MonoBehaviour {

6.       public float skillTime = 2;//技能时间

7.       private Image filled;  //获取阴影图片

8.       public float timer = 0; //控制冷却时间

9.       private bool isTouch = false;  //判断是否按下

10.  

11. // Use this for initialization

12. void Start () {

13.         filled = GameObject.Find("Filled").GetComponent<Image>();

14.  

15. }

16.

17. // Update is called once per frame

18. void Update () {

19.         if (isTouch == true)

20.         {

21.             timer += Time.deltaTime;

22.             filled.fillAmount = (skillTime -timer) / skillTime;

23.             if (timer >= skillTime)

24.             {

25.                 timer = 0;

26.                 isTouch = false;

27.             }

28.  

29.  

30.         }

31.  

32.  

33.  

34. }

35.     public void OnClick()

36.     {

37.  

38.         isTouch = true;

39.  

40.     }

41.  }

 

如果想要改变游戏物体大小但是却不想改动内部大小,可以在它上面创建一个空物体用来包裹,这样每次改变的就会是空物体的大小了

这里制作的是一个滑动框选择关卡的案例,这里记一下步骤

1.    

我们调用素材创建一个圆,然后给它添加上Toggle属性,把叶子赋值给Grafic属性,这样我们就可以点击它来勾选叶子了,然后我们将叶子复制三个一次排版,放在一个空物体下,我们叫它ToggleGroup,全选三个Toggle放在一组,这样就可以实现单选的功能了

2.    然后我们要将页面的跳转和这些单选按钮绑定起来,这里我们需要一个脚本

这里讲一下脚本思路

(1)    我们需要继承两个接口IBeginDragHandler,IEndDragHandler

这两个接口的作用就是控制页面的拖拽,它们会在运行时候自动实现

(2)     我们通过scrollRect.horizontalNormalizedPosition;来获得鼠标拖拽到的位置,创建一个数组保存三个页面应该在的位置,这里我们获得的是一个0-1的浮点值来保存位置,通过计算绝对值的差值,通过比较差值来绝对我们将坐标设置到什么位置,在update方法里控制页面跳转到的位置

(3)    然后我们定义四个bool类型的方法,,通过检测点击来决定跳转到哪个位置数组,再定义一个按钮数组,保存哪个按钮被点击,然后当鼠标拖拽到相应位置时,按钮数组也会选择相应的按钮,通过对IsOn属性的设置就可达到这种效果,当然我们定义的按钮数组需要再unity里进行赋值

(4)    至此,我们就可以实现鼠标点击页面的切换了

using System;

using System.Collections;

usingSystem.Collections.Generic;

using UnityEngine;

usingUnityEngine.EventSystems;

using UnityEngine.UI;

 

public class Scrollpanelbutton : MonoBehaviour,IBeginDragHandler,IEndDragHandler {

 

    //这里是获得scrollRect这个组件

    private ScrollRect scrollRect;

    //这里三个值分别保存三个页面的位置

    private float[] ArrayList =new float[] { 0, 0.5f,1 };

    private float targetHorizontalPosition=0;

    public float speed = 10;

    private bool isDraging = false;

    //定义一个数组保存点击按钮

    public Toggle[] MovepageArray;

 

    // Use this for initialization

    void Start () {

        scrollRect = GetComponent<ScrollRect>();

       

    }

   

    // Update is called once per frame

    void Update () {

        if(isDraging==false)

        scrollRect.horizontalNormalizedPosition= Mathf.Lerp(scrollRect.horizontalNormalizedPosition,targetHorizontalPosition, Time.deltaTime * speed);

    }

    public void OnBeginDrag(PointerEventData eventData)

    {

        isDraging = true;

    }

 

    public void OnEndDrag(PointerEventData eventData)

    {

        isDraging = false;

        float PosX = scrollRect.horizontalNormalizedPosition;//这个可以获得到鼠标当前拖拽到水平的什么位置,用01的浮点数进行量化

      

  

        int index = 0;

        float offset = Mathf.Abs(PosX-ArrayList[index]);//这里计算的是当前位置和我们定义位置的差值

        for (int i = 1; i <ArrayList.Length; i++)

        {

           float  offsetNew = Mathf.Abs(PosX -ArrayList[i]);//这里判断目前位置与定义页首距离谁跟近,然后定义坐标到更近的位置

            if (offsetNew < offset)

            {

                index = i;

                offset = offsetNew;

 

            }

          

        }

        targetHorizontalPosition =ArrayList[index];

        MovepageArray[index].isOn = true;

 

        //scrollRect.horizontalNormalizedPosition =ArrayList[index];

    }

 

    public void OnMovePage1(bool isOn)

    {

 

        if(isOn)

            targetHorizontalPosition =ArrayList[0];

 

    }

    public void OnMovePage2(bool isOn)

    {

 

        if (isOn)

            targetHorizontalPosition =ArrayList[1];

 

 

    }

    public void OnMovePage3(bool isOn)

    {

 

        if (isOn)

            targetHorizontalPosition =ArrayList[2];

 

 

    }

 

 

 

1.    }

关于UI控件中的toggleslider


Slider通常用来设计滚动条

这里设置的分别是背景,填充颜色和拖动的按钮,再在这里获取01的值来代码控制滚动条


Toggle通常用来做单选框


我们通过给这些按钮添加一个toggle组件,全选给一个toggleGroup,再分别设置graphic就可以来控制单选了

当然我们也可以对Toggle进行扩展,来增加自己想要的功能

这里我们想要通过点击实现切换,但是一般的toggle无法实现我们想要的效果,这时候该怎么做呢?这里我们可以添加一个MyToggle的脚本来对该组件进行扩展,实现这样的功能

1.我们知道toggle控件传递的是bool类型的值

2.    我们创建如下脚本,逻辑如下

1.    我们获取到两个游戏物体和toggle组件

2.    我们写一个isOnValueChange的方法,通过setActive传递bool值,来实现组件的隐藏和显示

3.    start方法里进行传参和调用,这里我们初始化toggle组件,然后每次点击时就会向toggle组件传递isON的属性,这样便可以实现OnOff的切换了,

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class MyToggle : MonoBehaviour {
    //获取toggle组件和两个游戏物体
    public GameObject isSwitchOn;
    public GameObject isSwitchOff;
    private Toggle toggle;

 // Use this for initialization
 void Start () {
        toggle = GetComponent<Toggle>();
        isOnValueChange(toggle.isOn);
 }
 
 // Update is called once per frame
 void Update () {
  
 }
    public void isOnValueChange(bool isOn)
    {
        //这里控制组件的显示和隐藏
        isSwitchOn.SetActive(isOn);
        isSwitchOff.SetActive(!isOn);

    }
1. }


    

 

猜你喜欢

转载自blog.csdn.net/qq_36574586/article/details/76163895