版本: Unity 6 (6000.0)
语言英语
  • C#

HandleUtility.RegisterRenderPickingCallback

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交内容,但我们确实会阅读用户提出的每个建议更改,并在适用时进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public static bool RegisterRenderPickingCallback(HandleUtility.RenderPickingCallback renderPickingCallback);

参数

renderPickingCallback 要注册到回调的委托对象。

返回值

bool 如果注册成功则返回 True。如果回调已注册则返回 False。

描述

注册一个回调,在 Unity 进行拾取渲染时调用。

使用此回调在现有场景对象的顶部渲染自定义几何体到拾取渲染纹理,以便可以拾取自定义几何体所表示的游戏对象。

每次渲染都必须将 Vector4 类型的 selectionId 写入拾取渲染纹理。 selectionId 是从通过 RenderPickingArgs 结构体传递给回调的 pickingIndex 使用函数 HandleUtility.EncodeSelectionId 编码的。如果这些 selectionId 是通过递增 pickingIndex 顺序编码的,则您可以在一个回调中渲染多个 SelectionId,并在从回调返回时返回已渲染的拾取索引总数。

大多数 Unity 着色器都有一个 "ScenePickingPass" 通道,可用于渲染。使用 Material.FindPass 和通道名称 "ScenePickingPass" 从 Material 中查找着色器通道的索引,并在调用诸如 Material.SetPass 之类的 API 时使用此通道索引。请注意,您只能使用被认为会立即生效的渲染函数,例如 Graphics.DrawMeshNowGraphics.DrawProceduralNow(而不是其非立即对应项 Graphics.DrawMeshGraphics.DrawProcedural)。另一种方法是将您的渲染记录到 CommandBuffer 对象,并在记录后调用 Graphics.ExecuteCommandBuffer

当进入回调时,拾取渲染纹理已被绑定为活动渲染纹理。您可以在回调期间更改活动渲染纹理,但在退出回调之前必须恢复活动渲染纹理。

您的渲染必须尊重通过 RenderPickingArgs 结构体参数传递给回调的忽略和过滤 GameObject 集,以确定在当前上下文中应该渲染什么。有关更多信息,请参阅 RenderPickingArgs

渲染后,返回一个 RenderPickingResult 结构体,其中包含您使用的拾取索引数,以及另一个回调函数,用于在用户最终单击鼠标下的已渲染像素时将拾取索引解析为要选择的 GameObject 引用。如果不需要渲染任何内容,则可以返回 renderedPickingIndexCount 为 0 的结构体,或者简单地返回 RenderPickingResult.NoOperation。有关更多信息,请参阅 RenderPickingResult

如果您尝试在渲染拾取回调中调用此方法,则该方法会抛出 InvalidOperationException

其他资源:UnregisterRenderPickingCallback