Final IK学习笔记4:Interaction System

概述

Interaction System旨在轻松设置与动态游戏环境的全身IK交互。 它需要一个带有FullBodyBipedIK的角色,它由3个主要组件组成:InteractionSystem,InteractionObject和InteractionTarget。

使用步骤:

  • 将InteractionSystem组件添加到FBBIK角色
  • 将InteractionObject组件添加到要与之交互的对象
  • 创建一个PositionWeight权重曲线,由3个关键帧{(0,0),(1,1),(2,0)}组成,其中x是水平的,y是垂直值。
  • 将InteractionSystemTestGUI组件添加到角色并填写其参数以快速调试交互
  • 播放场景并按GUI按钮开始交互

可以从以下代码入门:

using RootMotion.FinalIK;
public InteractionSystem interactionSystem; // Reference to the InteractionSystem component on the character
public InteractionObject button; // The object to interact with
public bool interrupt; // If true, interactions can be called before the current interaction has finished
void OnGUI() {
    // Starting an interaction
    if (GUILayout.Button("Press Button")) {
        interactionSystem.StartInteraction(FullBodyBipedEffector.RightHand, button, interrupt);
    }
}

InteractionSystem

应将此组件添加到具有FBBIK组件的同一游戏对象中。它是控制角色交互的主要组件。

组件参数:

  • targetTag - 如果不为空,则此交互系统将仅使用具有指定tag的目标。如果游戏中的角色具有不同的骨骼方向,则此功能非常有用。
  • fadeInTime - 交互使用的所有参数中的衰落时间(effector的权重,伸展,拉动......)
  • speed - 此角色的所有交互的速度。
  • resetToDefaultsSpeed - 如果> 0,则在不进行交互时将交互系统使用的所有FBBIK通道恢复为其默认值或初始值。
  • collider:使用InteractionTriggers加入OnTriggerEnter和OnTriggerExit事件的碰撞体。
  • camera :将由需要摄像机位置的Interaction Trigger使用。分配第一个人物视角相机。
  • camRaycastLayers将从相机(沿camera.forward)进行raycast的层。应该包括所有查看目标碰撞体的InteractionTrigger。
  • camRaycastDistance:从相机进行raycast的最大距离。
  • fullBody - FullBodyBipedIK组件。
  • lookAt - Look At使用LookAtIK组件自动将body / head / eyes朝向Interaction Object。
    iK - 对LookAtIK组件的引用。
    lerpSpeed - 将LookAtIK目标插值到Interaction Objectm的位置的速度
    weightSpeed - 变化到LookAtIK权重的速度。


    Final IK学习笔记4:Interaction System_第1张图片
    InteractionSystem组件

InteractionObject

此组件用于我们希望与之交互的游戏对象中。它包含有关交互性质的大部分信息。它没有指定将使用哪个(哪些)身体部位,而是指定外观和感觉以及交互的动画。这样,交互的特征由对象定义,并且可以在多个effector之间共享。因此,例如,无论使用哪个effector ,都将以相同的方式按下一个按钮。

InteractionObject动画:
Interaction System引入了动画对象的概念,而不是动画角色。因此,我们可以为门打开或按下按钮设置动画,并使交互系统移动角色以跟随该动画,而不是设置打开门或按下按钮的角色。这种方法为交互动力学提供了极大的自由,甚至允许多个同时动画交互。您可以使用摄影表为交互对象设置动画,然后使用可在InteractionObject组件上找到的OnStartAnimation,OnTriggerAnimation,OnReleaseAnimation和OnEndAnimation动画事件调用该动画。

组件参数:

  • otherLookAtTarget - 角色朝向目标的哪个位置。如果为null,将朝向此GameObject。这仅在使用InteractionLookAt组件时有效。
  • otherTargetsRoot - InteractionTargets的根节点。这将用于自动查找所有InteractionTarget组件,因此所有InteractionTargets都应该是该组件的子节点。
  • positionOffsetSpace - 如果已分配,则所有PositionOffset通道将应用在此Transform的旋转空间。如果不是,它们将在角色的旋转空间中。
  • weightCurves - 权重曲线定义了交互过程。交互将与该列表中最长的权重曲线一样长。曲线的水平值表示自交互开始以来的时间。垂直值表示其通道的权重。曲线类型代表以下内容:
    PositionWeight - IKEffector.positionWeight,
    RotationWeight - IKEffector.rotationWeight,
    PositionOffsetX - 相对于角色旋转的插值方向的X偏移,
    PositionOffsetY - 相对于角色旋转的插值方向的Y偏移,
    PositionOffsetZ - 相对于角色旋转的插值方向的Z偏移,
    Pull - 在交互中使用的肢体的拉伸(FBIKChain.pull),
    Reach - 交互中使用的肢体的到达值(FBIKChain.reach),
    RotateBoneWeight - 在FBBIK完成后旋转骨骼。在许多情况下,使用它而不是RotationWeight将为您提供更稳定和平滑的效果。
    Push - 在交互中使用的肢体的推动(FBIKChain.push),
    PushParent - 交互中使用的肢体的pushParent值(FBIKChain.pushParent),
    PoserWeight - 手等姿势的权重。
  • multipliers - 权重曲线乘数用于减少使用AnimationCurves的工作量。如果您需要rotationWeight曲线与positionWeight曲线相同,则可以使用乘数而不是复制曲线。在这种情况下,乘数将如下所示:Curve = PositionWeight,Multiplier = 1和Result = RotationWeight。如果为null,将使用InteractionObject游戏对象。
  • events - 事件可用于在交互开始后的某个时间触发动画,消息,交互暂停或提取。
    time - 触发事件的时间(自交互开始),
    pause - 如果为true,将暂停此事件的交互。可以通过调用InteractionSystem.ResumeInteraction(FullBodyBipedEffector effectorType)或InteractionSystem.ResumeAll()来恢复交互,
    pickUp - 如果为true,则交互对象将成为交互effector的骨骼的父级。这仅在单个effector与此对象交互时才能正常工作。对于双手提货,请参阅“Interaction PickUp2Handed”演示,
    animations - 此事件中调用的动画列表。 “Animator”或“Animation”是指将发生“Animation State”交叉渐变(使用“交叉淡入淡出时间”)的Animator组件。 “Layer”是动画状态的图层,如果选中“Reset Normalized Time",动画将始终从头开始。
    messages - 在此事件上发送的消息列表(使用GameObject.SendMessage(),所有消息都需要接收者)。 “Function”是在“Recipient”游戏对象上调用的函数的名称。


    Final IK学习笔记4:Interaction System_第2张图片
    InteractionObject组件

InteractionTarget

如果交互对象没有交互目标,则交互对象本身的位置和旋转将用于作为目标的所有effector。 但是,如果您需要非常精确地构建一只手,则需要创建一个交互目标。 通常,您首先会为角色的手创建一个副本,将交互对象设为父节点并添加InteractionTarget组件。 交互对象将自动查找其层次结构中的所有交互目标,并将其用于相应 effector。


Final IK学习笔记4:Interaction System_第3张图片
InteractionTarget

使用交互目标:

  • 复制您的角色,在交互对象摆放手
  • 将手层次结构设为交互对象子节点,删除角色的其余部分
  • 将InteractionTarget组件添加到手骨骼,填写它的参数
  • 将HandPoser(或GenericPoser)组件添加到角色的手的故骨骼(不是刚刚复制出来的手)。 这将使手指与摆出的目标相匹配。
  • 播放场景以尝试交互

组件参数:

  • effectorType - 此目标对应的FBBIK effector 的类型
  • multipliers - 权重曲线乘数可以覆盖不同effector 的权重曲线值。
  • interactionSpeedMlp - 可以更改不同effector 的交互速度。
  • pivot - 用于扭转/摆动此交互目标的支点(上图中带有轴和围绕它的圆圈的蓝点)。通常,你希望从任何角度与对象交互,支点使交互系统能够旋转目标以面向角色的方向。
  • twistAxis - 扭曲交互目标的轴(上图中的蓝色轴。圆圈可视化扭转旋转)。
  • twistWeight - 在交互开始时将 interaction target扭向effector bone的权重。
  • swingWeight - 在交互开始时将 interaction target摆向effector bone的权重。这将使从支点到InteractionTarget的方向与从支点到effector bone的方向匹配。
  • rotateOnce - 如果为true,将在交互开始时仅绕支点扭转/摆动一次


    Final IK学习笔记4:Interaction System_第4张图片
    InteractionTarget组件

InteractionTrigger

对于大多数交互对象,存在一定的角度和位置范围,在这些范围内,它们可以自然地访问并且可以到达角色。 例如,如果角色在合理的范围内并且或多或少朝向它,则只能用左手按下按钮。 交互触发器专门用于为每个effector 和对象定义这些范围。


Final IK学习笔记4:Interaction System_第5张图片
InteractionTrigger

上图显示了一个InteractionTrigger,它定义了左手和右手门把手的互动范围。“
绿色球体是游戏对象上的 trigger Collider ,它将使用角色的InteractionSystem注册此InteractionTrigger。
圆圈定义了角色能够与门进行交互的位置范围。
紫色范围定义了角色向前的角度范围,在该范围内,它可以用右手打开门,粉红色范围是左手的范围。

使用步骤:

  • 将InteractionSystem组件添加到角色,
  • 确保具有InteractionSystem组件的游戏对象也有一个Collider和一个Rigidbody,
  • 创建一个与之交互的InteractionObject,为PositionWeight添加一个权重曲线,例如{(0,0),(1,1),(2,0)},
  • 创建一个空的游戏对象,将其命名为“Trigger”,将Interaction Object设为它的父节点,添加InteractionTrigger组件,
  • 将一个trigger collider添加到InteractionTrigger组件,确保它能够触发InteractionSystem游戏对象上的OnTriggerEnter调用,
  • 将InteractionObject游戏对象分配给InteractionTrigger的“Target”。这将是从触发器到物体的方向的参考。
  • 添加“Range”,在该Range内添加“Interaction”,将InteractionObject分配给“Interaction Objet”,
  • 指定要用于交互的FBBIK effector ,
  • 将“Max Distance”设置为1(可以在Scene视图中看到它以圆圈显示),
  • 将“Max Angle”设置为180,这样就可以从任何角度触发交互,
  • 按照以下说明创建一个控制触发的脚本(有关完整示例,请参阅UserControlInteractions.cs)

InteractionSystem将自动维护与角色的碰撞体关联的触发器列表。 该列表可以通过InteractionSystem.triggersInRange访问; 该列表仅包含具有适合当前位置和角色旋转的effector 范围的触发器。
可以通过以下方式找到最接近角色的触发器:

int closestTriggerIndex = interactionSystem.GetClosestTriggerIndex();

如果GetClosestTriggerIndex返回-1,则当前没有有效的触发器在范围内。 如果不是-1,您可以通过一下代码触发交互。

interactionSystem.TriggerInteraction(closestTriggerIndex, false);

有关如何使 InteractionTrigger工作的完整示例,请参阅 InteractionTrigger演示场景和UserControlInteractions.cs脚本。

组件参数

  • ranges - 角色的有效范围和/或相机的位置,用于在角色与此触发器的碰撞体接触时触发交互。
  • characterPosition - 角色位置和旋转的范围。
    use - 如果为false,则不关心角色所在的位置,只要它与触发器碰撞体接触即可。
    offset - 角色相对于XZ平面中触发器的位置偏移量。只要与碰撞体接触,角色的Y位置就是无限制的。
    angleOffset - 相对默认前方角度的偏移。
    maxAngle - 角色从此触发器方向向前的最大角度偏移。
    radius - 角色从该范围中心的位置的最大偏移量。
    orbit - 如果为真,将围绕它的Y轴相对于角色的位置旋转触发器,因此对象可以从所有侧面进行交互。
    fixYAxis - 将触发器的Y轴固定为Vector3.up。这使得触发器相对于对象对称。例如,无论枪支放在哪一侧,枪都可以从相对于枪管的相同方向拾取。
  • cameraPosition - 角色相机的位置和旋转范围。
    lookAtTarget - 触发交互时相机的朝向
    direction - 从lookAtTarget到相机的方向(在lookAtTarget的空间中)。
    maxDistance - 从lookAtTarget到相机的最大距离。
    maxAngle - 方向和相机方向之间的最大角度。
    fixYAxis - 将触发器的Y轴固定为Vector3.up。这使得触发器相对于对象对称。
    interactions - 将在InteractionSystem.TriggerInteraction上调用的交互的定义。


    Final IK学习笔记4:Interaction System_第6张图片
    InteractionTrigger组件.png

    Final IK学习笔记4:Interaction System_第7张图片
    Iorbit为false的角色的有效位置

    Final IK学习笔记4:Interaction System_第8张图片
    orbit为true的角色的有效位置

你可能感兴趣的:(Final IK学习笔记4:Interaction System)