UGUI 知识精讲与实用案例(第 1 弹)——Canvas 和Text Mesh Pro组件(Text组件)详解包含案例

引言

        在 Unity 游戏开发的广袤领域中,用户界面UI)的设计与实现是打造优质游戏体验的关键一环。UGUIUnity GUI)作为 Unity 引擎内置的用户界面系统,为开发者提供了一套强大且灵活的工具,用于创建各种精美的界面元素和交互功能。无论是简洁的菜单界面,还是复杂的游戏内操作面板,UGUI 都能发挥重要作用。今天,让我们开启 UGUI 的探索之旅,深入了解它的基础构成,第一站为: Canvas 以及携带的组件、EventSystem 和 Text 文本控件


一、什么是 UGUI

        UGUI 是 Unity 自 5.0 版本引入的全新 UI 系统,它取代了旧版的 NGUI 和 GUI 系统。与传统 UI 系统相比,UGUI 具有许多显著优势。它基于 GameObject 和 Component 的架构,与 Unity 的其他功能模块无缝集成,使得开发者能够更方便地进行界面的创建、管理和交互逻辑编写。UGUI 采用了一种可视化的设计方式,通过在 Scene 视图和 Inspector 面板中进行操作,即可快速搭建出各种 UI 界面,大大提高了开发效率。


二、Canvas 以及携带的组件

(一)Canvas 简介

        Canvas(画布)是 UGUI 中所有 UI 元素的容器,它就像是一块承载着各种 UI 内容的画板。在一个 Unity 项目中,可以存在多个 Canvas,每个 Canvas 都有自己独立的渲染顺序和显示规则

(二)Rect Transform 组件

  1. 位置与尺寸
    • Pos XPos YPos Z分别表示 Canvas 在三维空间中的位置坐标
    • WidthHeight定义了 Canvas 的尺寸。合适的尺寸设定能确保 UI 元素有足够的空间进行摆放。
  2. Anchors(锚点)
    • 锚点用于确定 UI 元素与父容器(这里即 Canvas 自身在场景中的相对位置关联)的连接方式。当设置锚点时,UI 元素会根据锚点的位置和父容器的变化而相应调整自身位置和大小。
  3. Pivot(轴心点)
    • PivotXY值为0.50.5,表示 Canvas 的轴心点位于其中心位置值的范围为0-1)。轴心点是对象进行旋转、缩放等变换操作的参考点
  4. Rotation(旋转)
    • 如创建具有倾斜效果的 UI 界面时,可调整这些旋转参数。
  5. Scale(缩放)
    • 缩放操作可以用于调整整个 UI 的大小比例,不过在实际应用中需谨慎调整,以免影响 UI 元素的清晰度和可读性。

(三)Render Mode(渲染模式)

  1. Screen Space - Overlay:这种模式下,Canvas 会覆盖整个屏幕,并且会始终显示在所有摄像机渲染内容的最上方。它常用于创建游戏中的固定界面,如生命值条、菜单栏等,这些界面不需要与游戏场景中的物体进行深度交互。
  2. Screen Space - Camera:此模式需要指定一个摄像机Canvas 会根据该摄像机的视角进行渲染。它可以使 UI 元素与游戏场景中的物体产生深度关系,比如在一些 AR 或 VR 游戏中,将 UI 元素放置在场景中的特定位置,增强沉浸感。
  3. World Space:在这种模式下,Canvas 就像一个普通的游戏对象一样存在于三维世界中,它可以自由地调整位置、旋转和缩放。这种模式适用于创建与游戏场景紧密结合的 UI,例如角色头顶的血条、物品上的提示信息等。

(四)Event Camera(事件摄像机)

        设置为Main Camera表示该 Canvas 的交互事件(如点击、拖拽等)将由主摄像机来检测和处理。如果项目中有多个摄像机,需要确保选择了合适的摄像机来处理 UI 事件,以保证交互的准确性。

(五)Sorting Layer(排序层)

       排序层用于决定 Canvas 在渲染时相对于其他对象的先后顺序。当场景中有多个 Canvas 或者 Canvas 与其他渲染对象有重叠时,通过设置不同的排序层,可以控制它们的显示顺序。

(六)Order in Layer(层内顺序)

     在同一排序层内,该参数进一步确定 Canvas 的渲染顺序,数值越小越先渲染

(七)Additional Shader Channels(额外着色器通道)

        这些通道的选择会影响 UI 元素在着色器中的处理方式,对于一些需要特殊效果(如光照、法线贴图等)的 UI 开发,该参数的设置就显得尤为关键。

(八)Vertex Color Always In Gamma(顶点颜色始终在伽马空间)

       建议在伽马空间中保持顶点颜色,以便在 UI 着色器中进行伽马到线性颜色空间的转换,从而提高线性颜色空间中 UI 颜色的精度。在进行高质量的 UI 渲染时,遵循该建议可以使 UI 的颜色表现更加准确。

(九)Canvas Scaler 组件参数

 Dynamic Pixels Per Unit(动态每单位像素数)1Reference Pixels Per Unit(参考每单位像素数)为100。这两个参数共同决定了 UI 元素在世界空间中的尺寸和缩放比例

(十)Graphic Raycaster 组件参数

        (1)Ignore Reversed Graphics(忽略反向图形)

        该选项被勾选,意味着当图形的渲染顺序与预期相反时,将忽略这些图形的交互事件。这在一些复杂的 UI 层级结构中,可以避免误触发不必要的交互。

        (2)Blocking Objects(阻挡对象)

        设置为None,表示没有特定的对象会阻挡 UI 元素的交互射线检测。

        (3)Blocking Mask(阻挡遮罩)

        设置为Everything意味着所有对象都有可能阻挡 UI 元素的交互射线。通过合理设置阻挡对象和遮罩,可以精准控制 UI 元素的交互范围,比如防止在点击 UI 时误触发场景中其他对象的事件。


三、EventSystem

        EventSystem(事件系统)是 UGUI 中处理输入事件的核心机制。它负责接收来自鼠标、键盘、触摸等设备的输入,并将这些输入转化为相应的事件,如 PointerClick(点击)、PointerEnter(鼠标进入)、PointerExit(鼠标离开)等,然后将这些事件分发给对应的 UI 元素。在一个 Unity 项目中,通常只有一个 EventSystem 对象,并且它会自动添加到场景中。EventSystem 还支持自定义事件的处理,开发者可以根据项目需求,创建自己的事件类型和处理逻辑,以实现更加丰富的交互效果。

(一)First Selected(初始选中对象)

        当前设置为None (Game Object)该参数用于指定场景启动时默认被选中的游戏对象。在一些包含多个可交互 UI 元素的界面中,设置合适的初始选中对象可以为用户提供明确的操作起始点例如在菜单界面中,可以将第一个可操作的按钮设置为初始选中对象

(二)Send Navigation Events(发送导航事件)

        此选项处于勾选状态,这表示 EventSystem 会发送导航相关的事件。在使用键盘或游戏手柄等设备进行 UI 导航操作时(如通过方向键在按钮之间切换焦点),这些导航事件会被发送给相应的 UI 元素,使得 UI 元素能够根据导航操作做出反应,比如改变颜色或激活状态。

(三)Drag Threshold(拖拽阈值)

        它定义了触发拖拽操作的最小距离当用户触摸屏幕或移动鼠标的距离超过这个阈值时,系统才会判定为开始执行拖拽操作小于该阈值则可能被视为误操作或简单的点击。合理设置拖拽阈值可以避免因用户轻微的操作抖动而误触发拖拽事件,提升交互的准确性。

(四)Send Pointer Hover To Parent(将指针悬停事件发送给父级)

        该选项被勾选,意味着当指针(如鼠标指针或触摸点)悬停在 UI 元素上时,不仅当前 UI 元素会接收到悬停事件,其所属的父级 UI 元素也会接收到该事件。这在一些具有层级结构的 UI 设计中非常有用,例如一个包含多个子按钮的面板,当鼠标悬停在某个子按钮上时,面板也可以根据需要做出相应的反应,如改变背景颜色。

(五)Horizontal Axis(水平轴)

        设置为Horizontal它指定了用于 UI 导航的水平输入轴。在使用键盘或游戏手柄进行 UI 导航时,与该轴相关的按键(如键盘的左右箭头键)会被用于在水平方向上切换 UI 元素的焦点。

(六)Vertical Axis(垂直轴)

        设置为Vertical,与水平轴类似,它定义了用于 UI 导航的垂直输入轴。当用户使用键盘的上下箭头键或游戏手柄的相应按键时,UI 元素的焦点会在垂直方向上进行切换。

(七)Submit Button(提交按钮)

        设置为Submit表示当用户按下对应的提交按键(如键盘的回车键或游戏手柄的确认键)时,当前选中的 UI 元素会接收到提交事件。这对于触发按钮的点击操作、确认输入等交互功能至关重要。

(八)Cancel Button(取消按钮)

        设置为Cancel意味着按下相应的取消按键(如键盘的 Esc 键)时,系统会发送取消事件。通常用于关闭窗口、取消操作等场景。

(九)Input Actions Per Second(每秒输入操作次数)

       该参数限定了每秒能够执行的输入操作的最大次数。例如,当用户持续按住某个按键进行重复操作时,系统会根据这个参数来限制操作的触发频率,避免因过快的输入导致 UI 响应异常。

(十)Repeat Delay(重复延迟)

        表示在用户持续按住某个按键时,第一次触发操作后,再次触发重复操作的延迟时间(单位为秒)。例如,当用户按住一个按钮时,第一次点击会立即触发,之后每隔 0.5 秒会再次触发一次,直到用户松开按键


四、Text 文本控件

        Text 文本控件是 UGUI 中最常用的组件之一,用于显示文本信息。它具有丰富的属性设置,能够满足各种文本显示的需求:

(1)Text Input 区域

  • 文本输入框:这里用于输入具体的文本内容。可以手动输入文本,也可通过代码动态赋值,从而在游戏中显示相应文字信息,比如显示角色名称、游戏提示等内容。

(2)Text Style 区域

  • Text Style:用于选择预设的文本样式。可根据实际需求创建和选择不同的样式,方便统一管理文本外观,如标题样式、正文样式等。

(3)Main Settings 区域

  • Font Asset:指定为 “LiberationSans SDF (TMP_Font Asset)”,用于选择文本显示的字体资源。合适的字体能增强游戏的风格一致性,比如复古风格游戏可选择手写字体。
  • Material Preset:“LiberationSans SDF Material”,该材质预设决定了文本的渲染外观,如颜色、纹理等。
  • Font Style:包含一系列按钮(B、I、U、S、ab、AB、SC),用于设置文本的风格,如加粗(B)、斜体(I)、下划线(U)等,方便对文本进行格式调整。
  • Font Size:数值为 “83.24”,用于设置文本的大小。可根据文本在界面中的重要性和布局需求进行调整,比如标题通常设置较大字号。
  • Auto Size:未显示勾选状态,若启用该功能,文本会根据所在矩形区域自动调整大小,以适应空间限制。
  • Vertex Color:白色色块,用于设置文本顶点的颜色,直接决定文本显示的颜色
  • Color Gradient:未勾选,若启用,可设置文本颜色渐变效果,使文本外观更丰富。
  • Override Tags:未勾选,勾选后可覆盖文本中使用的标签效果
  • Spacing Options (em)包含 Character(字符间距)、Word(单词间距)、Line(行间距)、Paragraph(段落间距),可分别调整文本中字符、单词、行、段落之间的距离,优化文本排版。
  • Alignment:一系列按钮用于设置文本对齐方式,如左对齐、居中对齐、右对齐等,确保文本在显示区域内整齐排列。
  • Wrapping:设置为 “Enabled”,表示启用文本换行功能,当文本长度超过显示区域宽度时自动换行。
  • Overflow:设置为 “Overflow”,定义文本超出显示区域时的处理方式,如超出部分是否显示、是否缩放等。
  • Horizontal Mapping 和 Vertical Mapping:均设置为 “Character”,决定文本在水平和垂直方向上的映射方式,一般保持默认即可。

(4)Extra Settings 区域

  • Margins:包含 Left(左)、Top(上)、Right(右)、Bottom(下)四个边距设置,数值均为 “0”,用于设置文本内容与显示区域边缘的距离,可调整文本在框内的位置。
  • Geometry Sorting:设置为 “Normal”,用于控制文本几何图形的排序方式,一般在处理复杂重叠文本时调整。
  • Is Scale Static:未勾选,若勾选,文本缩放时会保持固定属性,防止因缩放导致的显示问题。
  • Rich Text:勾选,启用富文本功能,允许使用标签对文本进行样式设置,如<b>加粗、<color>设置颜色等。
  • Raycast Target:勾选,使文本成为射线检测目标,可用于响应点击等交互事件
  • Maskable:勾选,使文本可被遮罩影响,在需要制作文本遮罩效果时有用。
  • Parse Escape Characters:勾选,启用转义字符解析功能,确保特殊字符能正确显示和处理
  • Visible Descender:勾选,确保文本中字符的下延部分(如字母 “y”“p” 的下部)可见
  • Sprite Asset:设置为 “None (TMP_Sprite Asset)”,用于指定包含文本中使用的精灵图资源,可实现图文混排效果。
  • Style Sheet Asset:设置为 “None (TMP_Style Sheet)”,用于指定样式表资源,可统一管理文本样式,方便批量修改
  • Kerning:勾选,启用字距调整功能,优化字符之间的间距,使文本显示更美观
  • Extra Padding:未勾选,若勾选,可为文本添加额外的内边距,调整文本在显示区域内的空白空间。

结语

        通过本次对 UGUI 基础元素的学习,我们了解了 Canvas 的作用和渲染模式Canvas 携带的重要组件、EventSystem 的工作原理以及 Text 文本控件的使用方法并通过一个简单的计分板案例进行了实践。UGUI 的世界丰富多彩,还有更多强大的功能和复杂的交互等待我们去探索。在后续的学习中,我们将继续深入 UGUI 的知识领域,学习更多实用的案例和技巧,不断提升我们的 UI 开发能力。希望大家在 UGUI 的学习过程中能够保持热情,勇于尝试,创造出更加精彩的用户界面。

<think>好的,用户现在问的是“eventsystem怎么修改”。首先,我需要回顾之前的对话历史,之前用户询问的是关于Unity中模型世界UI的缩放对射线检测事件响应的影响,我详细介绍了问题原因解决方法,包括EventSystem的使用,比如射线检测分层处理。 现在用户的新问题是关于如何修改EventSystem。用户可能在使用EventSystem时遇到了问题,或者想要自定义其行为。需要确定用户的具体需求是什么。可能的情况包括他们想修改输入模块(比如从鼠标输入改为触摸输入),调整射线检测的方式,或者处理多场景中的EventSystem冲突。 首先,我应该解释EventSystem的基本组成,包括Input ModuleRaycaster。然后,介绍常见的修改场景,比如更换输入模块、自定义射线检测、处理多实例问题等。用户可能是一个Unity开发者,正在开发一个需要处理多种输入方式的应用程序,或者需要优化UI事件的响应机制。 要注意用户可能的实际需求。例如,他们可能在制作VR应用,需要基于手柄的射线交互,或者在做移动端游戏,需要触摸输入。此外,可能遇到多个EventSystem导致的问题,需要指导如何正确管理单例。 还需要考虑用户的技术水平,是否需要代码示例,或者更偏向于Unity编辑器中的设置。之前的回复中有代码示例,所以继续提供代码是合适的,但也要解释每一步的作用,确保用户理解如何应用到项目中。 最后,总结修改EventSystem的常见方法,并提醒注意事项,比如避免重复实例组件依赖,帮助用户避免常见错误。</think>在 Unity 中,**EventSystem** 是处理 UI 事件(如点击、拖拽、悬停)的核心组件。修改 EventSystem 通常涉及调整其输入模块、射线检测方式或自定义事件逻辑。以下是常见的修改方法场景: --- ### **1. EventSystem 的核心组件** - **Input Module**:负责处理输入设备(如鼠标、触摸、手柄)的事件逻辑,常用的有: - `StandaloneInputModule`:适用于键鼠基础触摸输入。 - `TouchInputModule`:专为移动端触摸优化。 - `BaseInputModule`:可继承此类实现自定义输入模块。 - **Raycaster**:用于检测 UI 或 3D 物体的射线投射,如: - `GraphicRaycaster`:检测 Canvas UI。 - `PhysicsRaycaster`:检测 3D 物体的碰撞体。 - `Physics2DRaycaster`:检测 2D 碰撞体。 --- ### **2. 修改 EventSystem 的常见需求** #### **需求 1:更换输入模块** - **场景**:需要适配不同输入设备(如手柄、XR 控制器)。 - **步骤**: 1. 移除默认的 `StandaloneInputModule`。 2. 添加自定义模块或 Unity 内置模块(如 `XRUIInputModule`)。 ```csharp // 移除旧模块 Destroy(GetComponent<StandaloneInputModule>()); // 添加 XR 输入模块 gameObject.AddComponent<XRUIInputModule>(); ``` #### **需求 2:自定义射线检测逻辑** - **场景**:需要过滤特定层或修改射线检测逻辑。 - **步骤**: 1. 创建自定义 Raycaster: ```csharp public class CustomRaycaster : GraphicRaycaster { public LayerMask targetLayer; // 指定检测层级 public override void Raycast(PointerEventData eventData, List<RaycastResult> resultAppendList) { // 重写射线检测逻辑 Ray ray = Camera.main.ScreenPointToRay(eventData.position); RaycastHit[] hits = Physics.RaycastAll(ray, Mathf.Infinity, targetLayer); foreach (var hit in hits) { RaycastResult result = new RaycastResult { gameObject = hit.collider.gameObject, module = this, distance = hit.distance }; resultAppendList.Add(result); } } } ``` 2. 将自定义 Raycaster 挂载到 Canvas 或摄像机。 #### **需求 3:动态切换输入设备** - **场景**:同时支持键鼠手柄,并根据设备动态切换。 - **步骤**: ```csharp void Update() { if (Input.GetKeyDown(KeyCode.JoystickButton0)) { // 切换到手柄输入 EventSystem.current.currentInputModule.Process(); } else if (Input.GetMouseButtonDown(0)) { // 切换回键鼠输入 } } ``` #### **需求 4:多 EventSystem 冲突处理** - **场景**:多场景加载时出现多个 EventSystem,导致事件重复触发。 - **解决方法**: - 确保全局仅保留一个 EventSystem(单例模式)。 - 在代码中销毁多余的实例: ```csharp void Start() { if (FindObjectsOfType<EventSystem>().Length > 1) { Destroy(gameObject); // 销毁新增的 EventSystem } } ``` --- ### **3. 自定义 EventSystem 的通用方法** #### **方法 1:继承 EventSystem** - 创建自定义事件系统类,覆盖基础逻辑: ```csharp public class CustomEventSystem : EventSystem { protected override void Update() { // 自定义事件更新逻辑 base.Update(); } } ``` #### **方法 2:修改事件优先级** - 调整不同 UI 元素的响应顺序(如优先触发窗按钮): ```csharp EventSystem.current.SetSelectedGameObject(priorityButton.gameObject); ``` #### **方法 3:过滤无效点击** - 忽略特定区域的点击事件: ```csharp public class ClickFilter : MonoBehaviour, IPointerClickHandler { public void OnPointerClick(PointerEventData eventData) { if (eventData.pointerCurrentRaycast.gameObject != null) { // 仅允许点击特定物体 if (eventData.pointerCurrentRaycast.gameObject.CompareTag("Clickable")) { Debug.Log("有效点击"); } else { eventData.Use(); // 标记事件已处理,不再传递 } } } } ``` --- ### **4. 调试 EventSystem** - **查看当前选中对象**: ```csharp Debug.Log("当前选中对象:" + EventSystem.current.currentSelectedGameObject); ``` - **可视化射线路径**: 在 Scene 视图中启用 **Gizmos > UI Raycast**。 - **日志输出**: 在 `BaseInputModule` 的子类中插入调试日志,追踪事件触发流程。 --- ### **5. 常见问题解决** 1. **事件无响应**: - 检查 Canvas 的 `Raycast Target` 是否启用。 - 确保 EventSystem 的 `Input Module` `Raycaster` 配置正确。 2. **多个 UI 元素同时触发**: - 调整 UI 元素的 `Sort Order` 或 `Canvas Order`,确保顶层 UI 优先响应。 3. **跨摄像机检测失效**: - 为不同摄像机分配独立的 `PhysicsRaycaster` 或 `GraphicRaycaster`。 --- ### **总结** 修改 EventSystem 的核心是调整其 **输入模块**、**射线检测逻辑** **事件优先级**。通过继承 Unity 的 `BaseInputModule` 或 `BaseRaycaster` 类,可实现高度自定义的事件系统。关键点: - 避免多个 EventSystem 实例冲突。 - 根据目标平台选择合适的输入模块。 - 合理使用射线层级过滤(LayerMask)优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值