跳到正文
Qiita · Unity 开发社区· 来源· bet7y·· 1 天前AI 评分13

Unity VRChat 教程:利用 Animation 实现 Avatar 坐姿判定开关

【発展】アバター Sit 判定で学ぶ Animation

正文 · AI 翻译

译文尚不完整,完整内容请切换到原文。

前言

上次,我们仅使用 MA 实现了机关
上一篇文章

作为本次的延续,我们将实现仅靠 MA 无法实现的机关

为了让对 Animation 不太熟悉的人也能将其作为入门教程,本文以步骤为重点,尽可能详细地说明了必要的部分

示例的 UnityPackage 已在以下平台分发,供参考。
GitHub

Booth

切换椅子的启用/禁用状态

使用此 Animator Controller 时,在禁用椅子后

  • 可以将坐在椅子上的人放下,并阻止后续任何人乘坐(与之前讲解的 MA Object Toggle 相同)
  • 可以不放下已坐在椅子上的人,而是在该人自行离开后,才阻止后续任何人乘坐(仅在此处可实现的功能)

可供选择!

这是因为可以按组件单位进行启用/禁用的更改。

以下では、こちらの Animator Controller を使う方式でのみできる後者を実装します

ファイルを置くためのフォルダを作る

Project タブにて、Assets フォルダ以下で右クリックして、「Create > Folder」で今回改変しているアバター用のフォルダを作成してください
image.png

その際、自分で作成したファイルを一括管理するために

Assets
└─ _MyAssets
   ├─ アバター 1 用フォルダ
   ├─ アバター 2 用フォルダ
   └─ ...

のように、_MyAssets のようなフォルダを作成して、その中にアバターごとのフォルダを作るのがおすすめです

こうすれば、次のように一つのプロジェクト内にアバターが増えても管理しやすいです
image.png
筆者が実際に使っているルルネちゃんの改変プロジェクト内の様子

本次将在 Assets/_MyAssets/アバター椅子 内创建文件。

相当于您这次为修改后的 Avatar 创建的文件夹是 アバター椅子 文件夹。
以下请参照图片进行适当替换。

创建 Animation 所需的文件夹和文件

首先

  1. 用于统一管理 Animation Clip 的文件夹
  2. Animator Controller
  3. 表达式菜单
  4. 表达式参数

创建
image.png

此方法与创建文件夹时相同

  1. 创建 > 文件夹
  2. 创建 > Animator Controller
  3. 创建 > VRChat > 头像 > 表情菜单
  4. 创建 > VRChat > 头像 > 表情参数

进行创建
スクリーンショット 2026-11-01 185616.png

表情菜单(以下简称 ExMenu)和表情参数(以下简称 ExParam)不能使用相同的名称。
因为两者的扩展名都是 .asset,会导致无法区分文件路径。

建议将 ExMenu 命名为“<修改过的头像名称>M”,将 ExParam 命名为“<修改过的头像名称>P”。

在图片中如下所示

  • ExMenu: AvatarChairM
  • ExParam: AvatarChairP

接下来,打开刚才创建的“用于统一管理 Animation Clip 的文件夹”,并创建两个 Animaion Clip

  • BoxCollider_Off
  • BoxCollider_On

。

如果想与其他动画片段区分开来,推荐使用类似 AvatarChair_BoxCollider_Off 的命名方式

这些制作方法与以往一样,在 Project 标签页右键选择“Create > Animation”即可
image.png

构建 Animation State Machine 的大致框架

点击创建的 Animator Controller,查看 Animator 标签页。

请点击图像中红色圆圈标记的 + 号以添加 Animation Layer。
スクリーンショット 2026-11-01 213448.png

图像中将 Animation Layer 的名称更改为 AvatarChair_BoxCollider

创建好的 Animation Layer 右侧的 image.png,将 Weight 设置为 1
image.png
如果创建好的 Animation Layer 名称下方的条形图亮度到达最右端,则表示设置正确。

在右侧(网格)空白处右键点击,选择「Create State > Empty」以添加 Animation State
image.png

最初添加的状态会像图片中那样成为 Default State(橙色)

Project 标签页中的

Packages/com.vrchat.avatars/Samples/AV3 Demo Assets/Animation/ProxyAnim/

找到 proxy_empty
image.png

如果想像图片中那样以无缩略图的形式显示列表,请将 Project 标签页右下角的滑动条 image.png 设置到最左端

请在刚才添加的状态的 Inspector 中,将 Motion 拖拽到此处
image.png

点击状态时,Inspector 的显示可能会发生变化。
此时请切换点击其他状态,然后再次点击刚才添加的状态。重复几次即可恢复正常。

接下来,打开“用于统一管理 Animation Clip 的文件夹”,并将刚才创建的

  • BoxCollider_Off
  • BoxCollider_On

拖拽到 Animation State Machine 上
image.png

在图像中,刚才添加的 Animation State 的名称已更改为 Buffer

右键点击 Buffer 状态,选择 Make Transition
image.png

在箭头跟随鼠标的状态下,点击 BoxCollider_Off 状态
image.png
如图所示,如果松开鼠标后箭头从 Buffer 延伸到 BoxCollider_Off,则成功。

同样地,三个箭头

  • 从 Buffer 到 BoxCollider_Off
  • 从 BoxCollider_Off 到 BoxCollider_On
  • BoxCollider_On 到 BoxCollider_Off

请创建。
image.png
另外,请务必注意箭头的方向

有了这个箭头,就可以从 Animation State 转移到另一个 Animation State,并且播放附加到各自状态的 Animation Clip,从而改变 Avatar 的状态。

因为它是通过“Animation”来管理“状态”的“机制”,所以称为 Animation State Machine(动画状态机)

Animation Transition 的设置

分别选择 Animation Transition(箭头),并对所有项目

  • Has Exit Time: 关闭▢
  • Transition Duration: 0

请设置为
image.png

此时有人会将 Exit Time 设置为 0,但本次无需更改该值。
因为已将 Has Exit Time 设为 False,所以不会使用 Exit Time 的值。

当然,即使将 Exit Time 设置为 0 也不会影响运行,因此设置为 0 也是可以的

在上图中,我们将本次不使用的 Animation State(动画状态)Any State 和 Exit 集中放置在了左侧。
这仅是通过拖拽进行了移动,不会影响功能

在 Animator 选项卡左上角选择 Parameters,点击 + 号并选择 Bool。
image.png
图中已将 Parameter 名称更改为 IsBoxCollider。

选择从 Buffer 到 BoxCollider_Off 的过渡,并在 Inspector 的 Conditions 右下角点击 + 号
スクリーンショット 2026-11-03 165719.png

将新增行的左侧设置为 IsBoxCollider,右侧设置为 false
image.png

同样地,请在从 BoxCollider_On 到 BoxCollider_Off 的过渡的 Conditions 中添加「IsBoxCollider false」
image.png

这次,请在从 Buffer 到 BoxCollider_On 的过渡的 Conditions 中添加「IsBoxCollider true」
image.png

同样地,请在从 BoxCollider_Off 到 BoxCollider_On 的过渡的 Conditions 中添加「IsBoxCollider true」
image.png

通过如此设置,操作切换器会使 IsBoxCollider 的值发生切换,并根据 IsBoxCollider 的值进行条件判断以执行状态转移,从而转移到目标状态。

Expression Parameter 的设置

在 Project 选项卡中选择之前创建的 ExParam,然后查看 Inspector。

创建后的默认状态下包含三个参数,这些参数无需使用,请点击右下角的 - 标记将其删除。
スクリーンショット 2026-11-03 172031.png

接下来,点击 + 标记添加参数 IsBoxCollider。
スクリーンショット 2026-11-03 172203.png

请务必将参数名称设置为与 Animator Controller 的 Parameters 中添加的参数完全一致。
无论是大小写、空格还是符号的存在与否,只要有任何细微差异,都无法正常工作。

如有担心,请使用复制粘贴或下方介绍的 Copy from Animator

此时

  • Type: Bool
  • Saved: 开启✅
  • Synced: 开启✅

进行设置

关于Default,请自行选择开启✅或关闭▢。

如果设置为开启✅,则默认状态下Avatar的Sit判定将处于启用状态。
在重置Avatar后,切换开关会保持启用状态,若要禁用则需要手动操作。

如果设置为关闭▢,则默认状态下Avatar的Sit判定将处于禁用状态。
在重置Avatar后,切换开关会保持禁用状态,若要启用则需要手动操作。

Exprassion Menu 的设置

在 Project 标签页中选择之前创建的 ExMenu,然后查看 Inspector。

请将刚才设置的 ExParam 拖放到 Parameters 栏中
image.png

在 Controls 右下角的 + 标记上点击,并从添加行的右侧下拉菜单中选择 Toggle
スクリーンショット 2026-11-03 174028.png

请在Name中设置您喜欢的切换名称,并从Parameter的下拉菜单中选择IsBoxCollider, Bool
image.png

添加组件

上一篇文章中创建的父对象包含四个组件

  • Animator
  • MA Merge Animator
  • MA 菜单安装程序
  • MA 参数

请添加
image.png

组件设置

请根据下表,将创建的文件分别拖放至对应位置

要附加的文件 附加目标属性
Animator Controller Animator 组件的 Controller
(与上方相同) MA Merge Animator 组件的 統合されるアニメーター
ExMenu MA Menu Installer 组件的「预制件开发者设置」中的 インストールされるメニュー
ExParam MA Parameters 组件的 アセットからインポートする

image.png

关于其他属性,

  • Animator 组件的 Apply Root Motion:关闭▢
  • MA Merge Animator 组件的 付属アニメーターを削除:开启✅
  • MA Merge Animator 组件的 アバターの Write Defaults設定に合わせる:已开启✅

请确认其设置状态。

在您的 Avatar 中,MA Menu Installer 的 インストール先 可能与上图不同,ExMenu 很可能已被自动附加。

如果是这种情况,请保持 ExMenu 处于附加状态。

Animation Clip 录制

选择已添加 Animator 组件的 Game Object,然后查看 Animation 窗口。
Animation 窗口可通过 Unity 界面顶部的「Window > Animation > Animation」菜单打开。

image.png

首先,请从 Animation 窗口左上角的下拉菜单中选择 BoxCollider_Off
image.png

image.png 以进入录制模式,并在 Game Object 的 Inspector 中将 Box Collider 组件关闭 ▢
image.png

image.png 以退出录制模式
image.png

如果此时 Avatar 摆出了 T-Pose 以外的姿势,或者身体仅向下移动,请按 image.png 退出预览模式即可恢复原状

窗口顶部的时间轴表示“第〇秒:第〇帧”。
由于采样率为每秒 60 帧,例如

  • 0:00 表示第 0 秒的第 0 帧(起始点)
  • 1:30 表示的是第 1 秒的第 30 帧(即 1.5 秒处)

表示的是。
并非“0分0秒时点”或“1秒30毫秒时点”

请放大 Animation 窗口,使第 1 帧可见。
image.png

此时,可以通过将窗口右侧区域横向压缩后再重新展开来轻松实现放大。

1. 将窗口左侧边缘拖动至最右端 2. 将其恢复至原始位置
image.png image.png

点击第0帧的关键帧 image.png,使其处于 image.png 状态后,按 Ctrl + C 复制
image.png

在播放头位于第1帧的状态下,按 Ctrl + V 粘贴
image.png

如果上述复制粘贴操作无法顺利进行,请在第1帧重新执行之前的录制操作。
重要的是确保第0帧和第1帧存在具有相同设置值的关键帧

接下来,从 Animation 窗口的下拉菜单中选择 BoxCollider_On。

与之前一样,在播放头位于第0帧的状态下按下录制按钮,
并针对 Box Collider 组件的复选框,这次点击 2 次
image.png
通过这种方式,可以创建处于开启 ✅ 状态的复选框关键帧,从而制作出启用 Box Collider 的动画剪辑(Animation Clip)

与之前一样,放大以显示第1帧 image.png,并在第1帧创建与第0帧相同的 image.png 关键帧
image.png
即使在录制模式期间(时间轴呈红色状态)进行复制粘贴操作也没有问题。

确认关键帧的值时,请将播放头移动到该帧上。
例如,要确认第 1 帧的属性 (Box Collider.Enabled) 的值是否为 ✅,请确保播放头处于 0:01 的状态。
image.png

如下所示,即使 0:01 的关键帧被选中,如果播放头位于 0:00,则属性显示的是 0:00 时刻的值
image.png

至此,“不放下已经坐着的人,并在其自行下车后禁止他人乘坐”的功能实现完毕。辛苦了。

关于机关动作的确认,在 Unity 中也可以使用 Gesture Manager,
但在 VRChat 内

  • 当切换开关为 ON 时,椅子是否可以坐
  • 当已经有人坐着时将切换开关设为 OFF 时,坐着的人是否不会被强制放下
  • 将开关设为关闭,确认在有人下车后是否处于无法再坐下的状态

要确认上述内容时,使用下文介绍的方法,一个人也能轻松完成!

在游戏内移动座位位置(多层)

通过在 VRChat 中操作两个 Radial Puppet,制作可以前后及上下移动座位位置的机制。
有了这个机制,就可以灵活地将人安排在肩膀扛举的位置、膝盖等各种位置上。

在实施工作中,对于与前章内容重叠的部分省略说明,同时并行进行两项实施工作

创建 Animation 所需的文件

打开“用于集中管理 Animation Clip 的文件夹”,创建以下两个 Animation Clip:

  • SeatPosition_Backward2Forward
  • SeatPosition_Down2Up


image.png

构建 Animation State Machine 的大致结构

选择刚才编辑的 Animator Controller,打开 Animator 标签页,
创建 Animation Layer「AvatarChair_SeatPosition_前后」
image.png
此处的 Blending 请保持默认的 Override 不变

请创建名为「AvatarChair_SeatPosition_上下」的 Animation Layer
image.png
本次请将 Blending 设置为 Additive

将其设置为 Override 后,在「AvatarChair_SeatPosition_前后」中应用的椅子前后位置将被位于更下方的「AvatarChair_SeatPosition_上下」覆盖,从而使得“坐下的位置”不再随前后方向移动

请务必将 Animation Layer 的 Weight 设置为 1!

将 Animation Clip「SeatPosition_Backward2Forward」
拖放到 Animation Layer「AvatarChair_SeatPosition_前后」上
image.png

将 Animation Clip「SeatPosition_Down2Up」
拖放到 Animation Layer「AvatarChair_SeatPosition_上下」上
image.png

Animation State 的设置

点击 Parameters 的 + 按钮,选择 Float,创建两个 Float 参数

  • Backward2Forward
  • Down2Up


image.png

Float 参数和 Int 参数仅凭外观无法区分
image.png
(一个是 Float,另一个是 Int)

判断时,请输入小数点 .。
Float 参数可以输入小数,而 Int 参数根本无法输入小数点 .
image.png
(尝试向 Int 参数 var2 连续输入 .,但似乎无法输入)

从这里开始是新的操作。

选择SeatPosition_Backward2Forward并查看 Inspector,
勾选Motion Time的复选框为开启状态 ✅ 后,
从左侧的下拉菜单中选择参数 Backward2Forward。
image.png

同样地,选择SeatPosition_Down2Left并查看 Inspector,
勾选Motion Time的复选框为开启状态 ✅ 后,
从左侧的下拉菜单中选择参数 Down2Up。
image.png

Expression Parameter 的设置

接下来将向 ExParam 添加与已添加的 Animation Parameter(以下简称 AnimParam)同名的参数。
本次我们将采用既不手动输入也不使用复制粘贴的方法。

在刚才创建的 ExParam 的 Inspector 中,请选择“Options > Copy from Animator”。
image.png

在打开的 Explorer 窗口中,选择并确认刚才编辑的 Animator Controller
image.png

在对话框中选择 Yes
image.png

将自动添加正确的参数
image.png
请确认 Type、Default、Saved、Synced 是否正确设置

Expression Menu 的设置

在刚才创建的 ExMenu 的 Inspector 中,点击 Controls 的 + 号,并从新增行的右侧下拉菜单中选择 RadialPuppet
image.png

  • 名称:椅子前后
  • 参数:[无]
  • 旋转:Backward2Forward,Float

请设置为
image.png

同样地,添加行并选择 RadialPuppet

  • 名称:椅子左右
  • 参数:[无]
  • 旋转:Down2Up,Float

请设置
image.png

更改组件的设置

在已添加组件的 Game Object 的 Inspector 中,
将刚才编辑的 ExParam「AvatarChairP」拖放到
MA Parameters 组件的 アセットからインポート 属性中
image.png
由此,新增 2 个参数

  • Backward2Forward
  • Down2Up

将添加到 IsBoxCollider 下方

录制 Animation Clip

首先,选择已添加 Animator 组件的 Game Object,
并从 Animation 窗口的下拉菜单中选择 SeatPosition_Backward2Forward
image.png

按下录制按钮,选择子对象“坐的位置”,在 Inspector 中将 Transform 的 Position 的 Z 坐标输入为 -1
image.png

请注意,关键帧的 Position.y 值为 0。
如果设置为非 0 值,“坐的位置”将在上下方向上偏移该值

放大 Animation 窗口以显示第 1 帧,
将播放头移动到第 1 帧后,
对同一子对象的 Transform 的 Position 的 Z 坐标输入 1
image.png

请按录制按钮和预览按钮,安全地结束录制。

同样地,从 Animation 窗口的下拉菜单中选择 SeatPostion_Down2Up,然后
image.png
按录制按钮进行

在第 0 帧,将子对象的 Transform 的 y 坐标输入为 0,并
image.png

如果 Transform 的 Position 的 Y 值已经是 0,此时再次输入 0,则无法录制属性 Position.Y 值为 0 的关键帧。

可以先输入任意数字并按下确认,然后再输入 0,从而创建值为 0 的关键帧。

在第 1 帧,将子对象的 Transform 的 y 坐标输入为 1。
image.png

请注意,此处 Position.z 为 0。

请按录制按钮和预览按钮,安全地结束录制。

至此,“在游戏内移动坐姿位置”的机制实现完毕。辛苦了。

在这种通过多层进行实现的方式中,
为了操作 Avatar 坐姿判定,使用了三个 Animation Layer:

  • AvatarChair_BoxCollider
  • AvatarChair_SeatPosition_前后
  • AvatarChair_座位位置_上下

需要创建。

此外,每次制作衣物穿脱切换或形状键操作 RadialPuppet 等时,动画层都会增加,导致管理变得复杂。

接下来介绍的单一图层实现方式,可以将这些内容整合到1个动画图层中。
此外,该方式在社区调查中被报告为具有更高的FPS记录1,并且已知其性能更高(使化身更轻量)

在游戏中移动坐姿位置(单一图层)

(与之前重复的部分省略说明)

Animator Controller 的设置

请创建一个新的 Animator Controller「AvatarChair_BlendTree」
image.png

选择 AvatarChair_BlendTree 并打开 Animator 标签页,
创建 Animation Layer「AvatarChair」
image.png
、、、别忘了把 Weight 设为 1?

在右侧(网格)空白处右键单击,然后点击“Create State > From New Blend Tree”
image.png

将 Animation State 名称设为“AvatarChair (WD On)”,并务必确认 Inspector 中的 Write Defaults 处于 开启 ✅ 状态
image.png

在本次实现环境中,实际上无需在 Animation State 名称末尾添加 (WD On)。
Avatar3.0Manager 的 VRCShool 教程中推荐添加 (WD On)2345,因此本次教程遵循该建议进行命名。

ただし、Avatar3.0Manager を使用しない場合でも、(WD On) と明記することで Write Defaults の設定漏れを防ぎやすくなるため、末尾に (WD On) と記載することを推奨します。

作成した Animation State をダブルクリックして、BlendTree の編集画面に移動してください。
image.png

Inspector で BlendType から Direct を選択してください。
image.png

Motion 右下の + マークを押して「New Blend Tree」を選択し、
image.png

BlendTree を 3 つ追加してください。
image.png

Parameters で 4 つの Float パラメータ

  • Constant_One
  • IsBoxCollider
  • SeatPosition_Backward2Forward
  • SeatPosition_Down2Up

を作成してください
image.png

今回は IsBoxCollider も Float パラメータであることに注意してください!
BlendTree では Float パラメータのみ使うことができます。

如果使用其他 Int、Bool、Trigger 来创建参数,在后续选择应用于 BlendTree 的参数时,这些参数将不会显示在下拉列表中。

如果要将本章的 Avatar Sit 判定与本次的 Avatar Sit 判定同时放入同一个 Avatar 中,请将本次的参数 IsBoxCollider 命名为 IsBoxCollider_BlendTree 以作区分。

因为如果两个机制的参数名相同,一次切换操作会使位于同一位置的两个 Sit 判定同时生效,导致难以分辨正在操作哪个机制,从而使动作检查变得困难。

在示例实现中,即使将所有 prefab 放入同一个 Avatar 也能正常运行,因此也可以参考该做法。

此时建议输入 1 到 Constant_One。

即使在此处输入 0,只要在 ExParam 中将 Default 设置为 1,也能正常运行。
但是,像图中那样将其设置为“Constant_One 1”的话

  • 在添加参数时,Copy from Animator 会自动将其设置为 Default:1
  • 在 Animator Controller 的 Parameters 中,可以避免出现看似矛盾的“Constant_One 0”状态
  • Constant_One 可以明确表示“它是常数 1,无论何时值都不会发生变化”,在应用于 BlendTree 等之后,更容易追踪逻辑,从而便于维护

可以获得这些好处

选择父级 BlendTree,从 Parameter 的下拉菜单中选择 Constant_One
image.png
Normalized Blend Values 必须设置为 关闭 ▢。

选择上方的子级 BlendTree,设置您喜欢的名称,然后
从 Parameter 的下拉菜单中选择 IsBoxCollider
image.png

Motion 右下の + マークを押して「Add Motion Field」で 2 つの Motion Field を追加して
image.png

それぞれに先ほど作成した

  • BoxCollider_Off
  • BoxCollider_On

をドラッグアンドドロップしてください
image.png

「Animation Clip をまとめて管理するフォルダ」に 4 つの Animation Clip

  • SeatPosition_Backward
  • SeatPosition_Forward
  • SeatPosition_Down
  • SeatPosition_Up

を作成してください
image.png

先ほど同様、画面中央にある子 BlendTree を選択し、お好きな名前を設定して、
Parameter に SeatPosition_Backward2Forward を設定してください。
「Add Motion Field」で 2 つの Motion Field を追加し、いま作成した

  • SeatPosition_Backward
  • SeatPosition_Forward

をドラッグアンドドロップしてください
image.png

同じように、画面下方にある子 BlendTree を選択し、お好きな名前を設定して、
Parameter に SeatPosition_Down2Up を設定してください。
「Add Motion Field」で 2 つの Motion Field を追加し、いま作成した

  • SeatPosition_Down
  • SeatPosition_Up

をドラッグアンドドロップしてください
image.png

ファイルの作成と編集

Project タブにて、2 つのファイル

  • ExParam: AvatarChair_BlendTreeP
  • ExMenu: AvatarChair_BlendTreeM

を作成してください
image.png

ExParam「AvatarChair_BlendTreeP」の Inspector にて、
以下のデフォルトで生成される 3 つのパラメータを削除し
image.png

Animator Controller の Parameters と同名のパラメータを追加してください
image.png
その際、先頭に追加される Blend パラメータを削除し、

Name Type Default Saved Synced
Constant_One Float 1 オフ ▢ オフ ▢
IsBoxCollider Bool オフ ▢ オン ✅ オン ✅

としてください

AnimParam の IsBoxCollider は Float 型に設定しましたが、
ExParam の IsBoxCollider は Bool 型に設定してください

AnimParam と ExParam の型を「不一致」にさせる理由は次の記事で解説しています。
今回の場面を例にしているので、合わせてご覧ください

ただし、高度な内容を含み、これを知らなくても上記の操作を行えば問題なく実装できるので、初学段階であれば飛ばすことをお勧めします。

ExMenu「AvatarChair_BlendTreeM」の Inspector にて、
Parameter に ExParam「AvatarChair_BlendTreeP」をドラッグアンドドロップして、
複数レイヤーのときと同じように設定してください
image.png

ExParam「IsBoxCollider」で Bool 型を設定したので、画像の通り「IsBoxCollider, Bool」と表示されます

コンポーネントの設定変更

まず、コンポーネントが追加された Game Object の Inspector にて、MA Parameters の - マークを使って、複数レイヤーのときに追加したパラメータをすべて削除してください
image.png

次に、MA Parameters の アセットからインポートする プロパティに対して、
先ほど作った ExParam をドラッグアンドドロップしてください
image.png

また、MA Menu Installer の インストールされるメニュー に、先ほど編集した ExMenu をドラッグアンドドロップしてください
image.png

Animation Clip の録画

コンポーネントがアタッチされている親オブジェクトの Inspector にて、2 つのプロパティ

  • Animator コンポーネントの Controller プロパティ
  • MA Merge Animator コンポーネントの 統合されるアニメーター プロパティ

に対して、先ほど編集した Animator Controller「AvatarChair_BlendTree」をドラッグアンドドロップしてください
image.png

同じ Game Object が選択されている状態で、Animation ウィンドウにてドロップダウンから「SeatPosition_Backward」を選択してください
image.png

録画ボタンを押し、0 フレーム目と 1 フレーム目に子オブジェクト「座る位置」の Transform の Position Z を -1 に設定するキーフレームを作成してください
image.png
同様に残りの Animation Clip も録画します。

「SeatPosition_Forward」を選択して、Position Z を 1 に設定するキーフレームを作成し
image.png

「SeatPosition_Down」を選択して、Position Y を 0 に設定するキーフレームを作成し
image.png

「SeatPosition_Up」を選択して、Position Y を 1 に設定するキーフレームを作成してください
image.png

以上で「座る位置をゲーム内で動かす」ギミックの単一レイヤーでの実装は終了です。お疲れさまでした。

終わりに

今回はアバター Sit 判定関連のギミック実装を通して、Animation の入門をしました

入門と言いつつ単一レイヤー方式の実装で「DBT を使ったレイヤー圧縮」という高度なトピックにも触れました

ギミックの実装は 3 回しかしていませんが、入門記事となれるように丁寧に説明していたら、おぞましいほどの文章量になってしまいました、、、

そのうち、アバターギミックを網羅的に解説した全 5 編程度のシリーズ記事を書こうと思っています。
そのときは何万字書くのか、執筆に何十時間かかるのか、今から恐怖しつつ、今回の記事を終えようと思います

  1. Jellejurre. "Unity/VRChat Performance Benchmarks". VRCShool. 2025. https://vrc.school/docs/Other/Benchmarks/#direct-blend-trees, (2026-11-04). ↩

  2. Jellejurre, JustSleightly, hfcred. "Combining Layers Using Direct Blend Trees". VRCShool. 2025. https://vrc.school/docs/Other/DBT-Combining/#af9b08d723fb47698407a8c0dde577dc, (2026-11-04) ↩

  3. Jellejurre, JustSleightly. "Advanced Blend Tree Techniques". VRCSchool. 2025. https://vrc.school/docs/Other/Advanced-BlendTrees/#0736f78b3ffe4e28ad156809d48eff21, (2026-11-04) ↩

  4. Jellejurre, JustSleightly. "Animated Animator Parameters (AAP)". VRCShool. 2024. https://vrc.school/docs/Other/AAPs/#9730068c176e46029b8142d99210456f, (2026-11-04). ↩

  5. Jellejurre, JustSleightly. "Designing Scale-Friendly Systems". VRCShool. 2024. https://vrc.school/docs/Other/Scale-Friendly/#12ffd925c0fd4776b0116e01ead50121, (2026-11-04). ↩

来源:Qiita · Unity 开发社区 · qiita.com