UI框架-射线检测触发

博客围绕Unity3D的UI面板控制和事件组件展开。通过射线检测获取事件脚本信息并传递给UI面板,事件基类封装事件类型枚举等,UI面板将事件信息显示出来,可自定义封装不同类型面板,并在UIMgr脚本中添加。

【UI面板控制】

功能说明:

通过射线检测获取场景中的事件脚本 —>获取事件脚本上的信息 —>将信息传递给UI面板

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public delegate void OnInfoEvent(InfoBase_ base_);
/// <summary>
/// UI面板控制
/// </summary>
public class UIMgr : MonoBehaviour
{
    #region UI面板脚本组件 
    public HistoryUI showUI;
    #endregion
    
    //UI面板的指定层级
    private int UILayer;  

    private Dictionary<InfoType_, OnInfoEvent> EventsInfos;

    private void Start()
    {
        UILayer = LayerMask.NameToLayer("UI"); //获取指定UI索引
        
        EventsInfos = new Dictionary<InfoType_, OnInfoEvent>() {
            { InfoType_.type1,OnType1},
            { InfoType_.type2,OnType2}
        };
    }

	void Update()
	{
		DetectionTrigger();
	}
    /// <summary>
    /// 射线检测
    /// </summary>
    void DetectionTrigger()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            //指定层级上的射线检测 (所有的UI层级必须指定)
            if (Physics.Raycast(ray,out hit,100, UILayer))
            {
                GameObject obj = hit.collider.gameObject;
                //事件脚本继承于InfoBase_
                InfoBase_ infoBase_ = obj.GetComponent<InfoBase_>();
                if (infoBase_!=null)
                {
                    //触发相关的事件
                    EventsInfos[infoBase_.Type_](infoBase_);
                }
            }     
        }
    }
   
   //事件类型1
    private void OnType1(InfoBase_ base_)
    {
        //场景点击相关模型或UI,获取射线检测的模型上的【事件】脚本组件上的信息
        //所有的子类也都是父类的类别,可以申请一个父类变量,来接收其所有子类,父类若存的子类的对象,则可以将父类转换成相关的子类
         UIEvent uiEveent=base_ as UIEvent;
         //将数据显示在指定的UI面板上
         showUI.Show(uiEveent.title, uiEveent.content, true);
    }
	//事件类型2
    private void OnType2(InfoBase_ base_)
    {
        //封装好相关的UI面板
    }


}

【事件组件】

功能说明:

  • 事件基类实现对UI事件类型枚举的封装,以及对事件子类具有相同共性属性方法的封装
  • 在声明具体的事件类型中,必须为该事件指定一个InfoType_

事件基类

using UnityEngine;

/// <summary>
/// 事件的类型
/// </summary>
public enum InfoType_ 
{
    type1,  //具体的事件类型1 如:显示文字
    type2,  //具体的事件类型2 如:播放视频
}

/// <summary>
/// 信息基类,具体事件需要继承此脚本
/// </summary>
public class InfoBase_ : MonoBehaviour
{
	//子类中需要指定一个具体类型
    protected InfoType_ type_;

    public InfoType_ Type_ {
        get { return type_; }
        set { type_ = value; }
    }

    #region 可以封装一些子类相同的共性的属性或方法
    public void Show()
    {
    
    }

    public void Hide()
    {
    }
    #endregion
}

具体的事件实现

/// <summary>
/// 具体的UI事件
/// 通过射线检测获取到具体的UI事件,并获取到事件的信息,将信息传递到相关的UI组件模块显示
/// 如下是显示 一个标题+内容的文本
/// </summary>
public class UIEvent : InfoBase_
{
    public string title;    //标题
    public string content;  //内容

    void Start()
    {
        type_ = InfoType_.type1;  
    }
}

【UI面板】

功能说明:
UI面板实现将具体事件上的信息要执行的某事,通过UI面板组件显示出来。

面板的显示控制使用CanvasGroup组件;

UI面板基类

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

/// <summary>
/// UI基类
/// UI面板脚本组件所继承
/// </summary>
public class UIBase : MonoBehaviour
{
    //当前是否可以移动的标志位
    public static bool isShow = false;
    //CanvasGroup组件 控制显示和隐藏
    protected CanvasGroup group;


    protected virtual void Awake()
    {
        group = GetComponent<CanvasGroup>();

        //隐藏
        Hide();
    }

    #region 实现一些UI面板子类中具有共性的方法
    /// <summary>
    /// 显示
    /// </summary>
    public virtual void Show()
    {
        isShow = true;
        group.alpha = 1;
        group.interactable = true;
        group.blocksRaycasts = true;
    }
    /// <summary>
    /// 隐藏
    /// </summary>
    public virtual void Hide()
    {
        isShow = false;
        group.alpha = 0;
        group.interactable = false;
        group.blocksRaycasts = false;
    }
    #endregion
}

具体的一个UI面板实现

功能说明:
可以自己封装需要所显示的UI面板,如【显示标题+内容】、【标题+图片】、【播放视频】…
UIMgr脚本中添加UI面板。

using System;
using UnityEngine;

/// <summary>
/// 具体的面板
/// </summary>
public class UIPanel1 : UIBase
{
   
    //显示信息
	private TextInfo textInfo;
    protected override void Awake()
    {
        base.Awake();
    }
    
    /// <summary>
    /// 面板显示
    /// </summary>
    /// <param name="name">名字</param>
    /// <param name="info">内容</param>
    public void Show(string name, string info) {
  
        base.Show();
        //显示标题和内容
        textInfo.Show(name, info);
    }
    
   
    /// <summary>
    /// 面板隐藏
    /// </summary>
    public override void Hide()
    {
        base.Hide();
        textInfo.Hide();
    }
    #endregion
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值