将现实Reality Composer场景带入生活

1,620 阅读11分钟

使用行为、触发器和操作添加动画并处理用户输入。

用户可以通过多种不同的方式与Reality Composer场景进行交互,而无需使用Reality Composer的行为为他们显式编码。例如,您可以允许用户的触摸来影响场景中的对象,或者让对象在用户靠近它们时做出响应。

Reality Composer包含许多行为预置,允许您轻松地将常见的交互形式添加到场景中。您还可以构建自己的自定义行为或使用预置作为构建更复杂行为的起点。有关更多信息,请参阅构建自定义行为。

添加行为预置

Reality Composer提供了六种行为预置,简化了在场景中添加常见交互形式。如果您在从预置中添加行为时选择了场景中的任何对象,则新行为将自动配置为影响所选对象。此列表描述了每个行为预置:

  • 轻点并翻转

    通过响应用户的点击向上跳动旋转,使一个或多个对象成为动画

  • 轻点并播放声音

    响应用户的点击播放声音

  • 轻点并添加力度

    对响应用户点击模拟物理的对象施加力

  • 开始隐藏

    导致场景开始时一个或多个对象不可见

  • 等待和展示

    使一个或多个对象以不可见的方式开始,然后在指定持续时间后变得可见

  • 距离和抖动

    导致一个或多个对象在查看器接近它时晃动

要将行为预置添加到场景中,请选择您想要的一个或多个对象作为行为的目标,轻点工具栏中的“行为”按钮以调出“行为”窗格,然后轻点加号按钮以显示显示所有可用行为预置的弹出窗口以及创建自定义行为的选项。选择一个预置,Reality Composer根据该预置为您的场景添加新行为。例如,如果您选择一个对象并添加“轻点和翻转”行为,则会向您的场景添加新行为。此行为会自动配置,以便每当用户轻点所选对象时,它都会翻转。要测试该行为,请在工具栏中选择播放按钮,然后轻点所选对象。

重命名行为

新添加的行为名为“行为”。立即重命名行为,以反映它们的实际工作。在iOS设备上,按住行为的名称,然后从出现的菜单中选择“重新命名”。在Mac上,选择一种行为,然后从“编辑”菜单中选择“重命名”或按Return键。

Building Custom Behaviors

创建自定义行为来控制场景中的对象。

行为由两部分组成:触发器和动作序列。行为的触发器定义了它如何以及何时触发,动作序列定义了当它触发时实际会发生什么。常见的触发器包括用户正在窃听的对象,与场景中的另一个对象接近,或接收来自代码的通知。常见的操作包括显示、隐藏和移动对象以及播放声音。

行为为您提供了向Reality Composer场景添加交互性的多功能方法。要创建您自己的新行为,请在添加行为时选择自定义选项。该行为在没有定义触发器或动作序列的情况下添加到您的场景中。

定义触发器

每个行为都必须包含一个触发器,该触发器定义该行为如何以及何时触发。看见 Creating a Trigger.

Reality Composer支持五种类型的触发器:轻点、场景开始、接近相机、碰撞和通知。在Reality Composer的行为窗格中,单击或轻点表示触发器的虚线框内,以指定导致该触发器行为触发的条件或事件集。

响应轻点和触摸

当您希望行为响应用户轻点一个或多个特定对象时,请选择轻点触发器。向行为添加轻点触发器后,选择场景中希望用户交互的一个或多个对象。如果您不小心选择了您不想要的对象,请再次单击或轻点它以取消选择它。完成选择后,按“完成”按钮。要对受影响的对象进行进一步更改,请按“选择”按钮返回选择模式。

您只能使用轻点触发器用一根手指检测单点。要检测更复杂的场景,如轻点两下、长按或多指轻点,请使用通知触发器,然后使用手势识别器或SwiftUI手势检测。有关更多信息,请参阅从代码中触发行为。Fire a Behavior from Code.

立即触发行为

如果您希望在场景加载并显示给用户后立即触发行为,请选择场景启动触发器。您通常会使用此类型的触发器来设置开始状态;例如,隐藏您最初不希望看到的对象,或启动动画立即运行。

用户靠近对象时的触发行为

如果您想在相机(因此也是用户)靠近您场景中的特定对象时触发行为,请选择“接近相机”触发器。指定用户必须通过使用触发器上的距离滑块获得多近。如果您然后选择触发器,受影响的对象周围将显示一个绿色球体,以表示指定的距离。您还可以拖动球体在视觉上更改距离。

image.png

回应对象碰撞

如果您希望在特定对象与场景中的其他对象碰撞时触发行为,或者当对象与检测到的真实世界表面碰撞时,请选择碰撞触发器。

碰撞触发器的目标必须参与场景的物理模拟。如果您选择一个不参与的对象,Reality Composer会提示您启用它。

从代码中触发行为

选择一个通知触发器,从您在Xcode中编写的代码中触发行为。当其他触发器类型都不能满足您的需求时,通知触发器是一个不错的选择。当您创建通知触发器时,Xcode会自动生成激活该行为所需的代码。

要触发通知,请在生成的通知上调用“post()”函数。例如,如果您的场景有一个名为“SpinBox”的通知触发器,如下图所示,请从代码中触发该行为如下:

myScene.notifications.spinBox.post()

image.png

构建操作序列

行为的动作序列定义了行为触发时的实际情况。该序列可以由一个或多个您配置为按顺序或并发运行的操作组成。看见 Adding Interactivity to Behaviors.

Reality Composer提供了许多操作,您可以在构建行为的操作序列时用作构建块。常见的操作包括移动场景中的对象,以各种方式为对象添加动画效果,播放声音,为参与物理模拟的对象添加力量,以及过渡到完全不同的场景。您还可以调用用Xcode编写的函数来完成内置操作以外的其他任务。

从行为中移动、旋转或缩放对象

行为可以使用移动、旋转、缩放到操作将对象转换为特定位置、旋转和缩放,该动作将对象平滑地动画化到指定的世界位置、方向和大小。无论目标的启动转换值如何,使用移动、旋转、缩放到操作的最终结果都是一样的。例如,如果您创建的行为配置了缩放值为0.5的移动、旋转、缩放到操作,则其所有目标对象最终的缩放值为0.5,无论其起始缩放值是什么。

image.png

行为还可以使用移动、旋转、按操作缩放来转换对象相对于其起始位置、方向和大小。通过此操作,您输入到转换字段的值将应用于对象的当前转换值,而不是用作绝对值。因此,当对具有不同启动转换值的对象运行时,移动、旋转、缩放操作具有不同的效果。动作的位置和旋转值添加到对象的起始位置和旋转值中,而其缩放值乘以对象的起始缩放值。

例如,位置X值为5厘米的移动、旋转、缩放操作会导致其每个目标对象沿着场景的X轴从起始位置移动5厘米。同样,配置缩放值为0.5的移动、旋转、缩放操作,并对起始缩放值为10.0的对象运行,则会导致操作完成后缩放值为5.0的对象。然而,同一操作针对起始缩放值为2.0的对象运行,会导致行为运行后缩放值为1.0的对象。

image.png

通过这两个操作,您可以在操作的文本字段中输入移动、旋转或缩放量,或使用机械手在场景中进行可视化更改转换。在“行为”窗格可见并选择行为后,单击或轻点“移动”、“旋转”、“缩放方式”或“移动”、“旋转”、“缩放至”操作会将场景置于交互式模式,如下图所示。交互式模式允许您使用机械手将对象转换为所需的位置、方向和比例。在互动模式下,场景视图同时显示开始和结束位置、方向和规模。

image.png

引起对物体的注意

要吸引对物体的注意,请使用强调动作,该动作会导致场景中的一个或多个物体以各种方式在原地动画,例如摇晃、翻转、晃动、旋转或弹跳。

向对象添加力

行为可以通过使用添加力动作模拟被风推、踢、抛掷或吹的影响,为场景中参与物理模拟的任何物体添加力量。选择力所应用的一个或多个对象后,场景中会出现一个表示要添加的力的方向和强度的机械手。要改变力的方向,请移动蓝色锥体或旋转蓝色环。要更改要施加的力量,请使用动作上的速度滑块。

image.png

播放行为中的声音

在Reality Composer场景中,有三个操作可以播放音频文件:播放声音、播放环境和播放音乐。这三项行动的功能相似,但设计的目的略有不同:

  • 播放声音动作播放声音,就像它来自场景中的特定对象一样。声音的音量会根据相机相对于物体的位置以及相机是指向还是远离它而变化。当用户靠近对象时,声音会发出更大的声音,当用户远离对象时,声音会更柔和。
  • 播放氛围动作剧的声音锚定在你的场景上。这些声音跟踪方向的变化,但不减弱,因此环境声音的音量不会根据用户相对于场景中任何物体的位置而变化。播放环境动作旨在播放背景噪音,听起来好像来自很远的地方。
  • 播放音乐动作以恒定音量播放声音,完全独立于用户的位置和方向,旨在播放背景音乐和语音旁白。

过渡到另一个场景

对于游戏和复杂的增强现实体验,您可以选择将应用程序的内容拆分为多个场景,以更好地组织工作,并减少加载时间和所需的内存量。例如,您可以选择为游戏中的每个级别设置单独的场景。

要切换到其他场景,请使用更改场景操作,指定要加载的新场景。要将当前场景重置为起始状态,请选择当前场景,而不是其他场景。

来自行为的代码

要从行为中调用您在Xcode中编写的代码,请使用通知操作。通知操作有一个名为标识符的可配置参数,用于唯一标识此操作发送的通知。默认情况下,通知操作的标识符与行为名称相同,但您可以将其更改为对项目有意义的任何字符串值。Xcode的代码生成使用标识符值自动创建用于响应此操作的通知。

image.png

要编写响应通知操作的代码,请先编写一个代码函数,该函数将 Entity参数。此函数应包含您希望您的行为调用的代码:

func handleTapOnEntity(_ entity: Entity?) { guard let entity = entity else { return } // Do something with entity... }

Once you have your function, you register it as the action’s onAction handler. Because the Notify action in the preceding figure specifies an identifier value of Tapped, Xcode automatically creates an action called tapped on the class representing its scene. Assign the new function as the generated action’s onAction handler to call that function whenever the behavior is triggered.

// Register an onAction handler for the notification // action you created in Reality Composer boxAnchor.actions.tapped.onAction = handleTapOnEntity(_:)