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

被折叠的 条评论
为什么被折叠?



