Unity中免拖拽获取UI组件的功能

说明

  最近研究到一个功能脚本,在获取UGUI组件不用拖拽获取!在场景开始中获取需要获取的控件,将控件名字和UIBehaviour存储到字典中,在获取时根据里氏替换原则–基类转换为子类转换成对应的UI组件。


脚本如下:

获取UI组件的方法

    //获取需要获取的UI组件  T类型:UI组件名字
   private void GetUI<T>() where T:UIBehaviour
   {
        T[] uis = this.GetComponentsInChildren<T>();
        for (int i = 0; i < uis.Length; i++)
        {
            if (uiDic.ContainsKey(uis[i].name))
            {
                uiDic[uis[i].name].Add(uis[i]);
            }
            else
            {
                uiDic.Add(uis[i].name, new List<UIBehaviour>() { uis[i] });
            }
        }
   }

返回UI组件的方法

 public T ReturnUI<T>(string name) where T:UIBehaviour
    {
        if (uiDic.ContainsKey(name))
        {
            for (int i = 0; i < uiDic[name].Count; i++)
            {
                if (uiDic[name][i] is T)
                {
                    return uiDic[name][i] as T;
                }
            }
        }
        return null;
    }

完整脚本:

Awake()方法中 GetUI<Button>(); 获取对应的UI组件,这个脚本挂载到Canvas用于获取挂载在其下的UI控件。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class UIMgr : MonoBehaviour
{
    public static UIMgr instance;
    private Dictionary<string, List<UIBehaviour>> uiDic = new Dictionary<string, List<UIBehaviour>>();

    private void Awake()
    {
        if(instance==null)
        instance = this;

        GetUI<Button>();
        GetUI<Image>();
    }
    void Start()
    {

    }
    public T ReturnUI<T>(string name) where T:UIBehaviour
    {
        if (uiDic.ContainsKey(name))
        {
            for (int i = 0; i < uiDic[name].Count; i++)
            {
                if (uiDic[name][i] is T)
                {
                    return uiDic[name][i] as T;
                }
            }
        }
        return null;
    }
    
    //获取需要获取的UI组件  T:UI组件名字
   private void GetUI<T>() where T:UIBehaviour
   {
        T[] uis = this.GetComponentsInChildren<T>();
        for (int i = 0; i < uis.Length; i++)
        {
            if (uiDic.ContainsKey(uis[i].name))
            {
                uiDic[uis[i].name].Add(uis[i]);
            }
            else
            {
                uiDic.Add(uis[i].name, new List<UIBehaviour>() { uis[i] });
            }
        }
   }
}

Test脚本随便挂载到场景中去,根据场景中的UI名字获取。

using UnityEngine;
using UnityEngine.UI;
public class Test : MonoBehaviour
{
    
    void Start()
    {
        UIMgr.instance.ReturnUI<Button>("StartBtn").onClick.AddListener(() =>
        {
            print("当前按钮触发");
        });

    }
   }

如下图:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Unity中,UGUI的EventTrigger是一个非常有用的组件,它可以用于实现UI拖拽和位置交换的功能。 首先,需要在要实现拖拽和位置交换的UI元素上添加EventTrigger组件。可以通过代码或者在Inspector面板中进行操作。然后,需要添加相应的事件触发器,例如拖拽开始、拖拽移动、拖拽结束等事件。 接下来,需要编写拖拽的逻辑代码。可以使用Unity提供的接口来处理拖拽事件,例如OnBeginDrag、OnDrag和OnEndDrag。在OnBeginDrag事件中,可以获取拖拽起始位置,并将拖拽中的UI元素设置为可拖拽状态。在OnDrag事件中,可以实时获取拖拽的位置,并将UI元素跟随鼠标或手指移动。在OnEndDrag事件中,可以获取拖拽结束位置,并将UI元素设置回初始位置。 要实现位置交换功能,可以在UI元素上添加Collider组件,并根据拖拽的起始和结束位置来计算是否需要进行位置交换。可以使用RaycastHit来判断拖拽位置是否与其他UI元素重合,并记录下交换元素的信息。然后,根据交换元素的信息,可以将两个UI元素的位置进行互换。 最后,为了保证拖拽和位置交换功能的流畅性和用户体验,还可以添加一些动画效果和交互反馈。例如,在拖拽开始时可以添加一些拖拽阴影效果,使拖拽UI元素看起来更加立体和真实。在位置交换时,可以添加一些过渡动画,使UI元素的位置变换更加平滑和自然。 总之,利用Unity中UGUI的EventTrigger组件,结合适当的逻辑代码和交互反馈,可以很方便地实现UI拖拽和位置交换功能。这种功能可以在游戏开发中广泛应用,例如拼图游戏、物品交换系统等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值