Final IK学习笔记4:Interaction System

2019-05-05  本文已影响0人  AlpacasKing

概述

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

使用步骤:

可以从以下代码入门:

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组件的同一游戏对象中。它是控制角色交互的主要组件。

组件参数:

InteractionObject

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

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

组件参数:

InteractionTarget

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


InteractionTarget

使用交互目标:

组件参数:

InteractionTrigger

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


InteractionTrigger

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

使用步骤:

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

int closestTriggerIndex = interactionSystem.GetClosestTriggerIndex();

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

interactionSystem.TriggerInteraction(closestTriggerIndex, false);

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

组件参数

上一篇 下一篇

猜你喜欢

热点阅读