Grabbable(抓握)组件
Grabbable 组件介绍
“Grabbable 是个复杂的东西” —— AlexFromAlaska
Grabbable(可抓取)组件允许你抓取其所附着的任意插槽(Slot),前提是该物体必须拥有某种类型的 Collider(碰撞体)。
用法
| 属性名称 | 类型 | 描述 |
|---|---|---|
| ReparentOnRelease (释放时重置父级) |
Bool | 当物体被放下时,将其父级重置为 _lastParent 的值,而不是 Root(世界根节点)。* |
| PreserveUserSpace (保留用户空间) |
Bool | 物体将被重置父级到 Local User Space(本地用户空间)。* |
| DestroyOnRelease (释放时销毁) |
Bool | 该组件附着的物体在被放下时会被销毁。 |
| GrabPriority (抓取优先级) |
Int | 决定抓取的优先顺序(数值越高优先级越高)。 |
| GrabPriorityWhenGrabbed (被抓取时的优先级) |
Nullable<Int> | (可选)当物体已经被抓取时更改其抓取优先级。用于处理当物体可能被其他玩家“抢夺”时的不同行为逻辑。 |
| CustomCanGrabCheck (自定义抓取检查) |
GrabCheck | 在 Resonite 内部不可用。需要 Mod 才能与 Sync Delegates 交互。 |
| EditModeOnly (仅编辑模式) |
Bool | 决定此物体是否仅在 Edit Mode(编辑模式)下可被抓取。 |
| AllowSteal (允许抢夺) |
Bool | 允许其他用户抓取该组件附着的物体(即便它正被别人拿着)。就像夺旗模式里的旗帜一样。 |
| DropOnDisable (禁用时掉落) |
Bool | 当此组件被禁用时,父级 Slot 将被强制放下。 |
| ActiveUserFilter (活跃用户过滤器) |
ActiveUserHandling | 根据当前的活跃用户(如果有),更改此组件是否可被抓取。 |
| OnlyUsers (仅限用户) |
List<UserRef> | 允许抓取此物体的特定用户白名单。 |
| Scalable (可缩放) |
Bool | 允许通过双手抓取来缩放物体。 |
| Receivable (可接收) |
Bool | 允许该物体被接收(例如放入库存或插槽)。 |
| AllowOnlyPhysicalGrab (仅允许物理抓取) |
Bool | 仅允许通过物理接触抓取物体——不允许远程(激光)抓取。 |
| _grabber | Grabber | 自动赋值,当前正在抓取此组件的 Grabber。 |
| _lastParent | Slot | 自动赋值,此 Slot 上一次的父级。用于在松手时(如果允许)将 Slot 放回原处。 |
| _lastParentIsUserSpace | Bool | 自动赋值,上一个父级 Slot 是否为抓取者的用户空间 Slot。 |
| __legacyActiveUserRootOnly | Bool | 自动赋值,遗留字段,请勿使用。建议使用 ActiveUserFilter! |
行为机制
ReparentOnRelease、PreserveUserSpace 以及任何 Grabbable extensions(可抓取扩展,例如 GrabbableReparentBlock)之间的交互逻辑非常复杂。
当物体被释放(松手)时,系统将按以下顺序进行评估:
- 如果
ReparentOnRelease为真(True),Slot 的父级将被设置为_lastParent中的值。 - 如果
PreserveUserSpace和_lastParentIsUserSpace均为真,Slot 的父级将被设置为 Local User Space(本地用户空间)。 - 如果在层级结构中,该组件上方存在 IGrabbable(例如 GrabbableReparentBlock),且处于该块指定的
MaxDepth范围内,Slot 的父级将被设置为 Local User Space。 - 否则,Slot 的父级将被设置为 Root(世界根节点)。
注意: 即使 Scalable 布尔值为 False,你仍然可以通过其他方式驱动 Grabbable 对象的缩放。
示例
暂无示例。
参见
- IGrabbable:列出了行为类似但不完全相同的可抓取类型列表。
No comments to display
No comments to display