【VRChat】AnimatorとUdonで扉を動かす:回転軸とポーズの切り替え

作成: 2026-09-08最終更新: 2026-09-09

扉の端に回転軸を作り、閉じたポーズと開いたポーズをAnimatorで切り替えます。Animation ClipとControllerの関係、Has Exit Timeを外す理由、UdonのSetBoolまで解説します。

ボタンを押したら扉が開いてほしい。ただし、瞬間的に位置が変わるのではなく、ゆっくり開いてほしい。

Udonで少しずつ位置を動かすこともできますが、開く速さや途中の動きを調整するのが大変です。こういう「決まった動きの繰り返し」は、Unityのアニメーション機能に任せるほうが楽です。

この記事では、扉のポーズを2つ作って、Udonから切り替える ところまでを解説します。

端を軸にして半分開いた扉

この記事でわかること

  • 扉を端で回すための親子の作り方
  • Animation ClipとControllerの関係
  • 2つのポーズをBoolで切り替える最小構成
  • Udonから1行で動かす方法

メソッドとカスタムイベント を試した状態から始めます。

Sponsored


扉は、端を軸にして回す

扉を作るとき、最初につまずくのがここです。

扉そのものを回すと真ん中で回るが、軸を親にすると端で回る

Unityのオブジェクトは、中心を軸にして回ります。 扉のCubeをそのまま回すと、扉の真ん中がその場でくるくる回って、両端が壁を突き抜けます。

現実の扉は、蝶番のある端を軸にして開きます。同じことをするには、軸になる空のオブジェクトを親にします。

扉の端に軸を置き、その子に扉を入れる

構成はこうなります。

DoorPivot(空のオブジェクト。扉の端に置く)
└─ DoorPanel(扉の板。親から見て右にずらす)

DoorPivot を回すと、その子の DoorPanel は軸を中心に振り回されます。これで扉らしく開きます。

この「軸を親にする」考え方は、扉だけでなく、揺れる看板、回転する扇風機、開く箱のふたなど、回転する物すべてに使えます。

Sponsored

実践:開く扉を作る

ボタンを押すと扉が開き、もう一度押すと閉じます。開閉はなめらかに動きます。

1. 軸と扉を作る

「Create Empty」で DoorPivot を作り、(-0.8, 1, 2.8) に置きます。Rotationは (0, 0, 0) です。

その子に「3D Object → Cube」で DoorPanel を作ります。

項目値(親から見たローカル)
Position(0.8, 0, 0)
Rotation(0, 0, 0)
Scale(1.6, 2, 0.1)

扉の板を、軸から右へ0.8mずらしています。板の幅が1.6mなので、左端がちょうど軸の位置に来ます。

Sceneビューで DoorPivot のY回転を動かしてみてください。扉が端を軸にして開きます。確かめたら 0 に戻します。

2. 2つのポーズを作る

DoorPivot を選んだ状態で、「Window → Animation → Animation」を開きます。

  1. 「Create」を押して、DoorClosed という名前で保存する
  2. 何も記録せずに、そのまま閉じる(Y回転が0の状態が記録されます)

これで「閉じたポーズ」ができました。同じ要領で、開いたポーズも作ります。

  1. Animationウィンドウのクリップ名の欄から「Create New Clip」を選び、DoorOpen として保存する
  2. 録画ボタン(赤い丸)を押す
  3. DoorPivot のRotation Yを 90 にする
  4. 録画を止める

これで、Y回転が90度の状態が記録されました。

アニメーションの中身は「ポーズ1つ」で構いません。 あいだの動きは、次の設定でUnityが自動でつないでくれます。

3. 切り替えの仕組みを作る

DoorPivot に自動で付いた Animator コンポーネントを見てください。Controllerの欄に、さっき作られたAnimator Controllerが入っています。

ダブルクリックして開きます。

2つの状態を、Boolパラメータで行き来する

3つの言葉が出てきますが、関係はシンプルです。

名前役割
Animation Clip1つのポーズや動き(DoorClosedDoorOpen
Animator Controllerどのクリップをいつ再生するかの地図
Animator(コンポーネント)その地図を持って実際に動かす係

Controllerの画面で、次の設定をします。

  1. 左のParametersタブで + を押し、Bool を選んで IsOpen と名付ける
  2. DoorClosed を右クリックして「Make Transition」を選び、DoorOpen へ矢印を引く
  3. その矢印を選び、Conditionsに IsOpen true を追加する
  4. Has Exit Time のチェックを外す
  5. DoorOpen から DoorClosed へも矢印を引き、Conditionsを IsOpen false にして、同じくHas Exit Timeを外す

Has Exit Time を外すのが重要です。 オンのままだと、アニメーションが最後まで再生されるまで次へ移りません。開いている途中で閉じたくても、開き終わるまで待たされます。

DoorClosed が最初の状態になっているか確認してください(オレンジ色の枠が付いている状態です)。なっていなければ、右クリックして「Set as Layer Default State」を選びます。

4. Udonから動かす

「3D Object → Cube」で DoorButton を作り、扉のそばに置きます。

Assets/Scripts で「Create → U# Script」を選び、DoorSwitch を作ります。

using UdonSharp;
using UnityEngine;

[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class DoorSwitch : UdonSharpBehaviour
{
    [SerializeField] private Animator doorAnimator;

    private bool isOpen;

    public override void Interact()
    {
        if (doorAnimator == null) return;

        isOpen = !isOpen;
        doorAnimator.SetBool("IsOpen", isOpen);   // ここだけ
        Debug.Log("[DoorSwitch] open=" + isOpen);
    }
}

動かす処理は SetBool の1行だけ です。開く速さや途中の動きは、すべてAnimator側が持っています。

"IsOpen" の文字は、Controllerで作ったパラメータ名と 完全に一致 させてください。大文字小文字も区別されます。

5. 確かめる

DoorButton に Udon Behaviour を追加し、DoorSwitch を指定します。Door Animatorに DoorPivot をドラッグします。

Playして押してみてください。

操作期待する結果
ボタンを押す扉がなめらかに開く
もう一度押す閉じる
開いている途中で押すすぐ閉じ始める(Has Exit Timeを外した効果)
扉のあいだを歩く開いていれば通れる

最後の確認で、扉のColliderが動いているかも分かります。当たり判定も一緒に回ります。

Animatorを使うか、Udonで直接動かすか

どちらでも扉は作れます。使い分けの基準はこうです。

決まった動きはAnimator、毎回変わる動きはUdon
AnimatorUdonで直接
向くもの決まった動きの繰り返し毎回違う動き、計算で決める動き
動きの調整タイムラインで視覚的にコードの数値で
コード1行で済む位置の計算が要る
途中で止める得意自分で書く

扉、引き出し、看板の揺れ、装置の作動。同じ動きを繰り返すものはAnimator が楽です。

逆に、「押した回数だけ少しずつ動く」「プレイヤーの位置に合わせて向く」といった動きは、Udonで直接書きます。

Sponsored

うまくいかないときは

  • 扉が真ん中で回る → 軸を親にしていません。空のオブジェクトを端に置いて、その子に扉を入れます
  • 押しても動かない → パラメータ名のつづりが合っているか確認します。大文字小文字も区別されます
  • 開き終わるまで閉じられない → Has Exit Timeのチェックが残っています
  • 最初から開いているDoorClosed が既定の状態になっていません。右クリックで設定します
  • 通り抜けられない → 扉のColliderが開いた先にも残っています。Sceneビューで確認します

おまけ:先に知っておくと良いこと

  • これはローカルの処理です: 押した人の画面だけで扉が開きます。全員で同じ状態にするには 同期する扉を作る の仕組みが要ります
  • 同じ形で他の物も動かせる: 引き出し、跳ね橋、シャッター、回転する看板。軸の置き方と回す軸が変わるだけです
  • 開く速さは遷移で調整する: 矢印を選んだときに出るタイムラインで、切り替えにかける時間を変えられます。重い扉ならゆっくりに
  • 音を足すと自然になる: 開くときにきしむ音を鳴らすと、ぐっとそれらしくなります。ボタンで切り替える の音の扱いが使えます
  • アバター用のAnimatorとは別: アバター改変で出てくるAnimatorの話とは、扱う対象が違います。ワールドの物を動かす用途では、この記事の範囲で足ります

まとめ

Animatorで動かす扉は、3つの手順でできます。

  • 扉の端に空のオブジェクトを置いて、それを親にする
  • 閉じたポーズと開いたポーズを、2つのクリップとして作る
  • Boolのパラメータで行き来させる。Has Exit Timeは外す
  • Udonからは SetBool の1行だけ

作る前の問いかけは、「この動きは毎回同じか、それとも変わるか」 です。同じならAnimatorに任せます。

全員で同じ扉を開けたいなら 同期する扉を作る、時間差で自動的に閉じたいなら 時間差で処理を呼ぶ へ進んでください。

VRChat このセクションのノート63