拼接组件

拼接组件

作者 陈智龙:(161615)
日期 2021.10.22

实现原理

公共

规则管理

Created with Raphaël 2.2.0加载器材读取器材配置 InteractAbilityConfig.json ["rules"] 字段增加规则 RuleManager.AddRule(后续)增获取规则 RuleManager.GetRule加载结束

器材交互能力配对通过RuleManager添加与获取规则。 载入器材时,读取器材的能力配置文件 InteractAbilityConfig.json 其中 rules 为交互配对配置,target 为目标器材ID, 以及 onPreDetectonDetect 对应的行为,创建ActorPoint.Pair

规则检测

Created with Raphaël 2.2.0每帧更新 PreDetectorState.OnTick检测配对 PreDetectorState.Detect创建配对 ActorMap.CreatePair获取配对规则 RuleManager.GetRule是否存在此配对的规则设置或替换当前配对配对检测结束清除当前配对yesno

抓取器材后,添加PreDetectorState,每帧执行PreDetectorState.Detect进行配对检测。获取匹配的ActorPoint.Pair

PreDetectedState.OnAdd PreDetectorState.Detect TryInteractActionTask.DoTask 函数中通过判断 onPreDetect 与 onDetect 的拼接类型名,通过if-else走接下来的逻辑

PC

获取匹配的ActorPoint.Pair后通过PreDetectorState.Filter函数过滤只在VR下有效的行为,比如rubVR。 将Pair存储于 PreDetectorState._curSelectPreDetectedState 中执行高亮等行为
UnionInteractComponent.OnEndDrag 下检测当前配对状态

  1. 通过 _actorCom.actor.RemoveState<PreDetectorState>(context), 回调PreDetectorState.OnRemove , 将当前Pair存入 context.data

  2. 通过_actorCom.actor.DoTask 调用 TryInteractActionTask.DoTask 判断当前环境是否需要执行此行为,添加对应的状态行为。 执行交互逻辑

VR

获取匹配的ActorPoint.PairPair.detector.actor增加PreDetectState状态并将Pair传入。
PreDetectState.OnAddPair.detected.actor中增加PreDetectedState状态,将Pair传入
PreDetectedState.OnAdd通过pair.rule.GetPreDetectAction添加对应的状态行为,执行交互逻辑。

拼接类型和对应状态类

点拼接

JointedState.OnEvent 移除拼接
OnBeginDrag
JointedState.Adjust
JointedState
JointState
joint规则

joint - JointState 通过AddLinkActor添加关联,使子物体一起运动 ->JointedState.Adjust 修正位置 ,通过JointedState.OnEvent 监听OnBeginDrag消息,移除自身

线拼接

PlaneModifier.EscapeEvent 移除拼接
LineJointedState.AdjustTick
LineJointState
lineJoint规则

lineJoint - LineJointState->LineJointedState 通过每帧调用LineJointedState.AdjustTick实现位置修正

面拼接

PlaneModifier.EscapeEvent 移除拼接
PlaneJointedState.AdjustMovePlane
PlaneJointState
planeJoint规则

planeJoint - PlaneJointState ->PlaneJointedState 每帧调用 PlaneJointedState.AdjustMovePlane 实现位置修正, VR下暂无修正, 位置产生问题

以上拼接均有在 UnionInteractComponent.InitEvent 中添加监听,执行初始化位置修正等操作

摩擦

PlaneModifier.EscapeEvent 移除拼接
CubeAlignState.Adjust
CubeAlignState
RubVRManagerState
rubVR规则

rubVR - RubVRManagerState:通过每帧调用CubeAlignState.Adjust实现位置修正

DOTween 结束移除拼接
DOTween
RubState
actor.AddState(StateId.RUB_STATE)
rub规则

rub - RubState:通过 DOTween 实现摩擦动画

脱离检测除了点拼接和PC版摩擦以外,其余均使用 PlaneModifier 调用 EscapeEvent 回调, 进行RemoveSelf操作

虚影

PreDetectedState.OnAdd 中创建,在PreDetectorState.Detect 检测到配对改变后移除,类型名称和对应状态类:
ghost - GhostState
lineGhost - LineGhostState
planeGhost - PlaneGhostState

接入方式

通过能力配置文件 InteractAbilityConfig.json 接入,请参考Rule交互规则

onPreDetect:当被动方被预检测时触发的action, 拼接相关有 highlight, ghost, lineGhost, planeGhost, rubVR

onDetect:当被动方被最终选择时的触发的action, 拼接相关有 joint, lineJoint, planeJoint,rubVR, rub

接口说明

拼接部分除了通用的State接口以外,均为内部逻辑

Action配置请参考Action (交互触发)

注意点

其中 PlaneModifier 这个类使用得比较多,虽然接口上像是修正位置操作,但只执行是否脱离拼接的判断