Unity 高亮插件HighlightPlus介绍

主要是对官方文档进行了翻译(我做了一些补充和一些小的调整)

但是如果你只是想快速入门:

Unity 高亮插件Highlight Plus快速入门-CSDN博客

注意:官方文档本身就落后实际,但对入门仍很有帮助,核心并没有较大改变,有的功能有差异,以实际为准.(目前我已校正了大部分差异,后续我会继续维护该文档)

为什么为该插件做翻译?功能强大,使用简单,且还在维护.

基于此版本的内置渲染管线文档

一般情况,导入资源会遇到Builtin和URP两种版本,根据你项目的渲染管线选择合适的版本.

快速开始与演示场景

  1. 将资源导入到你的项目中,或创建一个空项目。

  2. 进入Demo文件夹,运行演示场景以快速测试资源效果。

  3. 查看演示场景1中附加在Demo游戏对象上的脚本代码。

演示场景包含3个附带Highlight Effect(高亮效果)和Highlight Trigger(高亮触发器)脚本的球体。每个球体都有以下功能:

Highlight Effect脚本 包含所有效果的设置和外观属性。如果你勾选"Highlighted"复选框,效果会立即呈现。

Highlight Trigger组件检测指针的位置,并在其经过游戏对象时触发。当这种情况发生时,它会激活上一个组件的"Highlighted"复选框,并在指针离开游戏对象时禁用该复选框。

另外,你可以通过顶部菜单GameObject -> Effects -> Highlight Plus -> Create Manager来创建一个**"Highlight Manager"(高亮管理器)**。此命令将创建一个附有Highlight Manager脚本的游戏对象,负责检测与任何符合层级和管理器中其他设置的游戏对象的鼠标交互,并相应地高亮显示。

如何在项目中使用该资源

选项1:高亮显示/自定义游戏对象

给任意游戏对象添加HighlightEffect.cs脚本,自定义外观属性。

可选:给游戏对象添加HighlightTrigger.cs脚本。当鼠标经过该游戏对象时,它会激活高亮效果。游戏对象上必须有一个碰撞器。注意:给游戏对象添加HighlightTrigger.cs脚本时,会自动添加HighlightEffect组件。

在Highlight Effect检查器中,你可以指定除了父对象以外,还有那些对象也会受到效果影响。检查器中的"Include"(包含)属性允许以下选项:

a) 仅影响此对象

b) 影响此对象及其子对象

c) 从根对象到子对象的所有对象

d) 所有属于某一层级的对象

e) 通过脚本指定的自定义目标(参见高级主题与备注)

选项2:自动高亮显示/自定义任意游戏对象

选择顶部菜单GameObject -> Effects -> Highlight Plus -> Create Manager。

定制Highlight Manager的行为设置。该设置将应用于由管理器高亮显示的任何游戏对象。但如果某个游戏对象已经有HighlightEffect组件,管理器将优先使用该对象的设置。

忽略特定游戏对象的高亮显示

你还可以给不希望被高亮的游戏对象添加一个"Highlight Effect"组件,并勾选"Ignore"(忽略)复选框。

如果你在使用Highlight Manager,它也提供了一些过滤选项, Layer Mask选项。

高亮显示与选择

高亮显示

指的是一种临时效果,使对象显示出轮廓、发光或其他类型的效果。例如,使用 Highlight Trigger 或 Highlight Manager 组件时,若启用了"Highlight On Hover"(悬停高亮)复选框,当指针悬停在目标对象上时,资源会自动"高亮"目标对象。当指针移开对象时,高亮效果会消失。

你还可以通过脚本调用 `SetHighlighted()` 方法或设置 `HighlightEffect` 组件的 `highlighted` 属性,来手动切换高亮效果的开/关。

演示场景Demo1展示了高亮显示球体的示例。

选择

指的是在点击对象时保持高亮效果可见的能力。要启用新的选择功能,请勾选"Select On Click"(点击选择)选项,并指定一个"selected"(已选择)配置文件和一个"selected and highlighted"(已选择并高亮)配置文件:

已选择配置文件:用于可视化仅被选择(未高亮)对象的配置文件。

已选择并高亮配置文件:用于同时被选择和高亮对象的配置文件。

Highlight Manager 附带的 Highlight Effect 包含默认的高亮设置,用于高亮未被选中的对象。

Highlight Manager 脚本公开了一个 `selectedObjects` 公共属性,可通过脚本获取当前选中的对象列表。

你可以使用 Highlight Manager 的 `SelectObject`、`ToggleObject` 和 `UnselectObject` 方法,通过脚本手动控制场景中任何对象的选择状态。

Highlight Plus 提供了一项集成在 Highlight Manager(高亮管理器)中的选择功能,可以根据对象是否被选中以不同的方式绘制它们。你可以通过点击对象来选择任意数量的对象。

演示场景Demo2展示了通过点击球体进行选择的示例。

Highlight Effect 组件详细介绍(整个插件最重要的脚本)

注意:譬如Outline设置为0代表不启用,所以它对应的配置选项被隐藏了

Profile: 允许分配具有自定义设置的配置文件。你可以点击"Create/Highlight Plus Profile"来创建配置文件,自定义并将其用于多个Highlight Effect组件中。

常规设置

Cameras Layer Mask: 让你指定哪些相机可以渲染效果。默认情况下,所有相机都可以。

Ignore Object Visibility: 默认情况下,如果对象在屏幕上不可见,Highlight Plus将不会渲染效果。如果使用了GPU实例渲染工具且不使用常规渲染器组件,请启用此选项以强制渲染效果。

Reflection Probes: 启用以在反射探针相机上渲染效果。

Normals Option: 提供多个选项以平滑或重新定向对象几何体的法线。仅在Fast、Average或High质量模式下用于轮廓和发光效果(基于网格的效果,不用于最高质量模式或屏幕空间模式)。

GPU Instancing: 默认启用,改善轮廓和发光效果的渲染性能。

高亮选项

该组件在和其他不同的组件协同会对自身产生影响

不和HighlightManager一起使用

和HighlightManager一起使用

例如这里Ignore选项受到了影响
Ignore: 允许禁用此对象上的任何效果。如果使用Highlight Manager,仍会使用此高亮效果组件的值。

Include: 允许指定哪些其他对象也会被高亮显示。例如,你可以在一组对象的根对象上使用单个高亮效果,并包含所有子对象。如果它们重叠,轮廓和发光效果将结合在一起,并在整个组周围显示一个轮廓。

Object Name Filter: 允许根据名称过滤要包含的对象(根据Include选项)。例如,如果你有5个子对象,可以使用前缀或后缀来指定哪些对象将被高亮显示。

Combine Meshes: 对于不单独旋转的对象,此选项非常有用。Highlight Plus将自动合并组的网格,显著减少绘制调用次数。

Alpha Cut Off: 应用于高亮效果的Alpha截断,适用于半透明对象或具有孔洞或透明部分纹理的对象(如叶子、栅栏等)。

Cull Back Faces: 不对背面应用效果。默认启用。

Fade In/Out Duration: 为指定的持续时间应用渐隐效果。

Constant Width: 无论对象到相机的距离如何,都保持轮廓或发光宽度恒定。

下面有七种效果,前四个效果相对更常用

轮廓效果选项

轮廓通常显示为对象周围的一条细的彩色线条。

Outline: 控制轮廓的透明度。值为0时,完全禁用该效果。调整该值可以看到上面两张图的对比

Width: 轮廓的宽度。前一部分提到的"Constant Width"(恒定宽度)选项可能会影响实际的可见宽度。增加了轮廓宽度

Color: 轮廓的颜色。调整为红色

Quality: 提供四种质量模式:Fast(快速)、Average(普通)、High(高)和Highest(最高)。前三种质量模式使用基于网格的渲染技术,通常渲染速度较快。Highest质量模式使用屏幕空间效果,提供更平滑的结果。质量模式的效果可能因对象的特性而异,因此可以根据实际效果选择最适合的模式,而不必拘泥于名称。例如,"Fast"质量模式通常适合简单对象。

Visibility: 控制轮廓的Z缓冲测试。可以指定轮廓是否应在所有物体之上显示,或仅在对象被遮挡时可见(还可以查看透视效果获取更多选项),或者选择"Normal",即对象可见时轮廓也可见。

外部光晕效果选项

外部光晕效果显示在对象周围,通常比轮廓更宽,类似于亮光或光晕效果。

Outer Glow(外部光晕):控制外部光晕的透明度。值为0会禁用此效果。

Width(宽度) :光晕的宽度。请检查"Highlight Options"部分中的"Constant Width"设置,因为它可能会影响实际显示的宽度。增加了宽度

Visibility(可见性):控制效果的Z缓冲测试。你可以指定光晕是否应该在所有事物之上显示、仅在对象被遮挡时显示,或者正常显示(即当对象可见时光晕也可见)。

Dithering(抖动):仅在基于网格的质量模式下使用,可以控制光晕使用的抖动样式。这是一个可选的艺术效果。你可以禁用它以显示实心光晕。

Blend Passes(混合通道):在基于网格的质量模式下,外部光晕是通过多个自定义通道渲染对象网格来实现的。启用此选项时,每个通道将与前一个通道混合。如果禁用此选项,每个通道将以叠加方式渲染。

Glow Passes(光晕通道):允许你配置每个光晕通道的数量及特性,包括颜色、偏移和透明度(alpha)。

Animation Speed(动画速度):如果该值大于0,外部光晕将进行动画处理。

要通过脚本快速更改光晕颜色,可以调用HighlightEffect组件中的SetGlowColor(color)方法。请查看演示场景1中的示例。

内部光晕效果选项

内部光晕在对象内部呈现类似于边缘光效的效果。

Inner Glow(内部光晕):控制内部光晕效果的透明度,该效果在对象内部呈现类似边缘光的效果。值为0时禁用此效果。

Color(颜色):此效果的颜色。改为红色

Width(宽度):内部光晕的范围。降低了宽度

Visibility(可见性):控制效果的Z缓冲测试。你可以指定光晕是否应该在所有事物之上显示、仅在对象被遮挡时显示,或者正常显示(即当对象可见时光晕也可见)。

覆盖效果选项

覆盖效果在对象上添加具有自定义透明度的实心颜色。

Overlay(覆盖):控制该效果的透明度。值为0禁用此效果。

Color(颜色):效果的颜色。

Blending(混合):确定颜色与对象原始颜色/纹理的混合程度。

Min Intensity(最小强度):混合的最小强度。

Animation Speed(动画速度):覆盖效果的"脉冲"速度。输入0以禁用动画。

目标效果选项

目标效果在高亮目标上方添加一个动画对象。

Texture(纹理):用于此效果的覆盖纹理。

Color(颜色):该纹理的色调颜色。

Center(中心):指定目标应该被定位的位置。如果未设置,将使用高亮对象的中心。然而,如果对象有多个部分或子对象,你可以分配子对象的变换(例如,怪物的身体部分)。

Rotation Speed(旋转速度):对象旋转的速度。输入0以禁用旋转。

Initial / End Scale(初始/结束缩放):用于创建缩放/脉动效果。

Scale To Object Bound(按对象边界缩放):目标图像的缩放将与对象的屏幕边界成比例(如果对象变大,目标效果也会扩大)。注意,如果对象旋转并且其边界发生变化,目标效果的大小也会发生变化。这可能会导致奇怪的效果,因此对于旋转的角色/对象,最好禁用此选项。

Transition Duration(过渡持续时间):覆盖纹理出现/消失时的透明度过渡持续时间。

Align To Ground(与地面对齐):将目标精灵投射到地面(如贴花)。在此模式下,垂直墙将通过使用相机深度纹理和场景的重建法线被检测,因此贴花不会在墙上显得拉伸。使用Fade Power选项可以随高度减弱目标精灵的效果。

Stay Duration(停留持续时间):当对象不再被高亮显示时,覆盖纹理将显示多长时间,直到它淡出。值为0表示效果将保持可见,直到它被禁用。

Visibility(可见性):控制效果的Z缓冲测试。你可以指定光晕是否应该在所有事物之上显示、仅在对象被遮挡时显示,或者正常显示(即当对象可见时光晕也可见)。

透视效果选项

透视效果(又称X光效果)显示当对象被其他元素遮挡时,例如墙壁。

See Through(透视):决定透视效果是否仅在对象被高亮显示时可见,或者始终在对象被遮挡时可见,或者从不显示。使用"Never"完全禁用此效果。

Occlude Layer(遮挡层):如果该值与Everything不同,资源将使用光线投射来尝试确定是否有属于匹配层的对象遮挡了高亮对象。如果它击中了遮挡对象,透视效果将被激活。

Threshold(阈值):使用遮挡层时,对象的边界大小乘以此值进行遮挡测试。你可以使用此值避免误报,只有当对象真的在另一个实心对象后面时才显示透视效果。

Check Individual Objects(检查单个对象):默认情况下,Highlight Plus会将所有受此组件影响的子对象的边界组合在一起再进行遮挡测试。如果启用此选项,遮挡测试将对每个单独的子对象执行。

Depth Offset / Max Depth(深度偏移/最大深度):为效果提供距离限制(相对于遮挡物的距离)。值为0时不使用这些选项。

Accurate(准确):使用遮挡层时,此选项启用像素级别的遮挡测试。

Intensity(强度):效果的亮度强度。

Color & Color Blend(颜色与颜色混合):控制颜色及其与对象原始颜色/纹理的混合强度。

Noise(噪声):可选的艺术驱动效果。

Border When Hidden(隐藏时的边框):此选项允许你仅在透视效果激活时显示额外的轮廓。

Ordered(有序的):启用后,渲染透视效果时将尊重相机的相对距离。

使用透视效果的常见场景是当你希望角色被墙遮挡而不是被地面或天花板遮挡。解决方案是将你的墙壁分配到一个与地面/天花板不同的层,并在透视效果的遮挡层中指定该层。启用"Accurate"选项以获得最佳效果。

Hit-FX效果选项

此效果仅在播放模式下可用。它允许你通过短暂更改受击对象的颜色来显示"打击"效果。在播放模式下,你可以测试它。

运行模式点击Execute Hit,会进行紫色的闪烁效果.

请参考下一节中的"执行Hit-FX效果"以获取示例代码。

脚本支持

使用脚本添加效果

你可以使用 GetComponent<HighlightEffect>() 来获取游戏对象上组件的引用。大多数在检查器中显示的属性都可以通过代码访问,例如:

复制代码
 
cs 复制代码
using HighlightPlus;
...
HighlightEffect effect = myGameObject.GetComponent<HighlightEffect>();
effect.outline = true;
effect.outlineColor = Color.blue;
effect.SetGlowColor(Color.yellow);
effect.UpdateMaterialProperties();

要控制高亮的状态,可以使用:

cs 复制代码
effect.SetHighlighted(true/false);

或者设置:

cs 复制代码
effect.highlighted = true/false.

重要提示 :如果你更改了对象的层次结构(例如更改了它的父对象或将其附加到另一个对象上),你需要调用 effect.Refresh() 来让 Highlight Plus 更新其内部数据。

在运行时更改属性

当你在运行时更改脚本的特定属性时,请调用 UpdateMaterialProperties() 以确保这些更改立即生效。

通过脚本更改高亮目标

通过脚本配置要被高亮的对象可以通过 Include 选项来设置。然而,你可以使用两种方式覆盖该选择:

cs 复制代码
effect.SetTarget(transform);

将指示脚本在给定对象上执行效果。

cs 复制代码
effect.SetTarget(transform, Renderer[] additionalObjects);

此方法也可以包括任意数量的其他渲染器。当你希望通过脚本定义一组对象进行高亮显示时,这很有用。

事件 / 响应高亮显示

Highlight Effect 脚本公开了两个事件 (OnObjectHighlightStartOnObjectHighlightEnd),当对象开始或结束高亮时触发。

示例:

cs 复制代码
using UnityEngine;
using HighlightPlus;

public class SphereHighlightEventExample : MonoBehaviour {

   void Start() {
       HighlightEffect effect = GetComponent<HighlightEffect>();
       effect.OnObjectHighlightStart += ValidateHighlightObject;
   }

   bool ValidateHighlightObject(GameObject obj) {
       // 用于细控制对象是否可以被高亮显示;返回 false 取消高亮
       return true;
   }
}

这些事件同样在 HighlightManagerHighlightTrigger 中公开。例如,使用 HighlightManager 时,你可以关联以下事件:OnObjectHighlightStartOnObjectHighlightEndOnObjectSelectedOnObjectUnselected

cs 复制代码
HighlightManager.instance.OnObjectHighlightStart += MyEventHandler;

事件 / 响应选择

HighlightManager 或 HighlightTrigger 组件提供了选择事件:OnObjectSelectedOnObjectUnSelected。查看演示场景2中的代码示例。

使用 Highlight Manager

cs 复制代码
using UnityEngine;
using HighlightPlus;

public class SelectionEventExample : MonoBehaviour {

   void Start() {
       HighlightManager.instance.OnObjectSelected += SelectObject;
       HighlightManager.instance.OnObjectUnSelected += UnSelectObject;
   }

   bool SelectObject(GameObject obj) {
       // 用于细控制对象是否可以被选中;返回 false 取消选择
       return true;
   }

   bool UnSelectObject(GameObject obj) {
       // 用于细控制对象是否可以被取消选择;返回 false 取消取消选择操作
       return true;
   }
}

使用 Highlight Trigger

cs 复制代码
using UnityEngine;
using HighlightPlus;

public class SelectionEventExample : MonoBehaviour {

   void Start() {
       HighlightTrigger ht = GetComponent<HighlightTrigger>();
       ht.OnObjectSelected += SelectObject;
       ht.OnObjectUnSelected += SelectObject;
   }

   bool SelectObject(GameObject obj) {
       // 用于细控制对象是否可以被选中;返回 false 取消选择
       return true;
   }

   bool UnSelectObject(GameObject obj) {
       // 用于细控制对象是否可以被取消选择;返回 false 取消取消选择操作
       return true;
   }
}

消息传递

当对象被高亮显示或高亮结束时,Highlight Effect 会向附加在游戏对象上的任何脚本发送 "HighlightStart" 和 "HighlightEnd" 消息。你可以使用以下代码获取这些消息:

cs 复制代码
using UnityEngine;
using HighlightPlus;

public class MyBehaviour : MonoBehaviour {

  void HighlightStart() {
      Debug.Log("Object highlighted!");
  }

  void HighlightEnd() {
      Debug.Log("Object not highlighted!");
  }
}

手动选择/切换/取消选择对象

Highlight Manager 提供了"选择"状态功能,你可以通过调用 SelectObjectToggleObjectUnselectObject 方法来手动控制对象的选择状态。以下代码摘自演示场景2:

cs 复制代码
using UnityEngine;
using HighlightPlus;

namespace HighlightPlus.Demos {

    public class ManualSelectionDemo : MonoBehaviour {

        HighlightManager hm;

        public Transform objectToSelect;

        void Start() {
            hm = FindObjectOfType<HighlightManager>();
        }

        void Update() {
            if (Input.GetKeyDown(KeyCode.Alpha1)) {
                hm.SelectObject(objectToSelect);
            }
            if (Input.GetKeyDown(KeyCode.Alpha2)) {
                hm.ToggleObject(objectToSelect);
            }
            if (Input.GetKeyDown(KeyCode.Alpha3)) {
                hm.UnselectObject(objectToSelect);
            }
        }
    }
}

执行 Hit-FX 效果

Hit-FX 效果是一种快速的闪光覆盖效果,可以通过代码调用。只需调用 HitFX() 并传入所需的参数:

cs 复制代码
using HighlightPlus;
...
HighlightEffect effect = myGameObject.GetComponent<HighlightEffect>();
effect.HitFX(color, duration, initial_intensity);

按需启动 Target FX

调用 effect.StartTargetFX() 方法可以随时启动 Target FX。注意,如果你通过脚本更改了目标效果的属性,可能需要调用 UpdateMaterialProperties() 来确保新值在目标效果的执行中得以反映。

在运行时设置配置文件

可以通过调用 ProfileLoad()ProfileReload() 方法并传入你的高亮配置文件对象来设置运行时的配置文件。

高级主题与注意事项(个人觉得不常用)

法线选项

Highlight Plus 可以自动优化网格法线,以提供更好的效果。可用的选项有:

Smooth(平滑):在使用快速或高质量级别时,这会改善轮廓效果(不适用于最高质量模式)。

Preserve Original(保留原始):在某些情况下,你可能希望动态修改你的网格,并且不希望 Highlight Plus 缓存该网格------启用"Preserve Original Mesh"以强制 Highlight Plus 始终使用原始网格。

Reorient(重新定向):这将用一个从对象中心指向外部的向量替换现有法线。对于某些2D几何体或没有法线的对象很有用。

注意:Highlight Plus 不会更改你对象的原始网格,因此这些操作是安全的。

进入体积时的高亮效果

可以通过对象进入或退出体积时自动启用或禁用高亮效果。为对象添加 HighlightTrigger 组件,并选择"Volume"作为触发模式。

此脚本使用 OnTriggerEnter / OnTriggerExit 事件。体积必须具有标记为 IsTrigger 且为静态的碰撞体。进入体积的对象必须具有 Rigidbody 组件才能触发这些事件。

深度裁剪选项

在高质量模式下使用轮廓或外部光晕效果时,资源依赖深度缓冲区来执行正确的深度剔除或裁剪。然而,当启用MSAA(多重采样抗锯齿)时,Highlight Plus 渲染时的深度缓冲区不可用。如果项目需要MSAA并希望进行深度裁剪/剔除,可以在 Highlight 检查器中启用"Depth Clip"选项。此选项仅在高质量下的轮廓或外部光晕时使用(其他质量模式工作方式不同,不需要特殊处理)。

透明对象与深度裁剪选项的兼容性

深度裁剪选项仅适用于高质量模式下的轮廓和外部光晕效果。启用后,将使用特殊的 _CameraDepthTexture 缓冲区来裁剪效果。此选项在需要使用 MSAA 时很有用,因为启用MSAA会禁用高质量模式下的深度检测。透明对象默认不写入此特殊纹理,除非你在菜单 GameObject -> Effects -> Highlight Plus -> "Make Transparent Object Compatible With Depth Clip" 中为透明对象添加该功能。

添加该功能后,确保高亮对象使用的轮廓或外部光晕效果的"Depth Clip"选项也被启用。

透明着色器与透视效果的兼容性

如果希望透视效果能够透过其他透明对象显示,则需要修改这些对象的着色器,使其能够写入深度缓冲区(默认情况下,透明对象不写入Z缓冲区)。可以通过顶部菜单 GameObject -> Effects -> Highlight Plus -> "Add Depth To Transparent Object" 来实现。

需要注意的是,强制透明对象写入深度缓冲区可能会导致透明度问题。

UI遮罩

为防止 Highlight Plus 效果显示在任何 UI 或精灵元素之上,有几种方法:

a) 使用 Screen Space Overlay 模式来渲染画布。这种模式在渲染循环的末尾渲染 UI,因此 UI 将显示在任何 Highlight Plus 效果之上。

b) 使用第二个相机渲染世界空间的 UI。根据你的主相机和 UI 相机的剔除掩码进行设置(确保 UI 相机只渲染 UI),并将 UI 相机的清除标志设置为"Depth only"(仅深度)。确保 UI 相机的深度值大于主相机,这样 UI 相机会在主相机之后渲染。这种设置简单并且能确保世界空间的 UI 显示在任何 Highlight Plus 效果之上。

c) 创建一个 UI 面板并分配 HighlightUIMask 材料,该材料位于 HighlightPlus/Resources/Materials 文件夹中。此特殊材质会写入模板缓冲区,并防止 Highlight Plus 效果渲染在该面板之上。该面板不会可见,它仅用于屏蔽该屏幕部分的效果。

静态批处理

标记为静态的对象需要 MeshCollider 才能被高亮(其他类型的碰撞体无法工作)。这是因为 Unity 会将静态对象的网格合并,因此无法访问未批处理的对象的单个网格。

注意:MeshCollider 可以被禁用。其唯一的作用是允许 Highlight Effect 在 Unity 开始场景时获取合并前的原始网格。

取消透视效果对某些对象的影响

可以为想要阻挡透视效果的对象添加 HighlightSeeThroughOccluder 脚本。如果有任何遮挡对象使用射线投射模式遮挡高亮对象,HighlightEffect.isSeeThroughOccluded 将返回 true

排除子网格

使用 SubMesh Mask 属性指定哪些子网格会受到影响。

默认情况下,值 -1 表示所有子网格都被包含在内。这是一个组件掩码字段。此效果会执行以下测试来确定是否包含子网格:

cs 复制代码
(1 << subMeshIndex) & SubMeshMask != 0

示例:

  • 如果你只想包含子网格1(索引1),请将值设置为 1 << 1
  • 如果只想包含子网格2,请将值设置为 1 << 2
  • 对于子网格3,将值设置为 1 << 3
  • 对于子网格2和3,将值设置为 1 << 2 + 1 << 3

通常,这个掩码字段的工作方式与 Unity 中的层级掩码或剔除掩码类似。

自定义顶点变换

你可以在 CustomVertexTransform.cginc 文件中应用自定义的顶点变换。函数 ComputeVertexPosition 被所有 Highlight Plus 着色器使用,因此这是一个集中应用自定义顶点变换的方便位置。

请注意,任何对该文件的修改将在你升级 Highlight Plus 时被覆盖。

控制可以选择的对象

Highlight Manager 提供了两个事件 OnObjectSelectedOnObjectUnSelected,当用户选择或取消选择对象时触发。这些事件可以用于根据事件处理程序返回的布尔值来取消选择或取消取消选择操作:

cs 复制代码
using UnityEngine;
using HighlightPlus;

public class ControlExample : MonoBehaviour {

   void Start() {
       HighlightManager manager = FindObjectOfType<HighlightManager>();
       manager.OnObjectSelected += ValidateSelection;
   }

   bool ValidateSelection(GameObject obj) {
       // 用于细控制对象是否可以被选中;返回 false 取消选择
       return true;
   }
}

自定义排序

默认情况下,Highlight Plus 效果在透明队列之后渲染,顺序任意。然而,你可以通过向场景中添加以下脚本来控制效果的排序:

cs 复制代码
using UnityEngine;
using HighlightPlus;

[ExecuteAlways]
public class CustomRendering : MonoBehaviour {

    void OnEnable() {
        HighlightEffect.customSorting = true;
    }

    void Update() {
        HighlightEffect.effects.Sort(Comparer);
    }

    int Comparer(HighlightEffect effect1, HighlightEffect effect2) {
        float dist1 = effect1.transform.position.z;
        float dist2 = effect2.transform.position.z;
        return dist2.CompareTo(dist1);
    }
}

在这种情况下,效果将按Z轴位置排序。你可以根据需要对 effects 列表进行排序。

END

相关推荐
charon877831 分钟前
UE ARPG | 虚幻引擎战斗系统
游戏引擎
小春熙子2 小时前
Unity图形学之Shader结构
unity·游戏引擎·技术美术
Sitarrrr4 小时前
【Unity】ScriptableObject的应用和3D物体跟随鼠标移动:鼠标放置物体在场景中
3d·unity
极梦网络无忧4 小时前
Unity中IK动画与布偶死亡动画切换的实现
unity·游戏引擎·lucene
逐·風12 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
_oP_i14 小时前
Unity Addressables 系统处理 WebGL 打包本地资源的一种高效方式
unity·游戏引擎·webgl
代码盗圣17 小时前
GODOT 4 不用scons编译cpp扩展的方法
游戏引擎·godot
Leoysq1 天前
【UGUI】实现点击注册按钮跳转游戏场景
游戏·unity·游戏引擎·ugui
PandaQue1 天前
《潜行者2切尔诺贝利之心》游戏引擎介绍
游戏引擎
_oP_i1 天前
unity中 骨骼、纹理和材质关系
unity·游戏引擎·材质