ボタンを押したら扉が開い てほしい。ただし、瞬間的に位置が変わるのではなく、ゆっくり開いてほしい。
Udonで少しずつ位置を動かすこともできますが、開く速さや途中の動きを調整するのが大変です。こういう「決まった動きの繰り返し」は、Unityのアニメーション機能に任せるほうが楽です。
この記事では、扉のポーズを2つ作って、Udonから切り替える ところまでを解説します。
この記事でわかること
- 扉を端で回すための親子の作り方
- Animation ClipとControllerの関係
- 2つのポーズをBoolで切り替える最小構成
- Udonから1行で動かす方法
メソッドとカスタムイベント を試した状態から始めます。
扉は、端を軸にして回す
扉を作るとき、最初につまずくのがここです。

Unityのオブジェクトは、中心を軸にして回ります。 扉のCubeをそのまま回すと、扉の真ん中がその場でくるくる回って、両端が壁を突き抜けます。
現実の扉は、蝶番のある端を軸にして開きます。同じことをするには、軸になる空のオブジェクトを親にします。

構成はこうなります。
DoorPivot(空のオブジェクト。扉の端に置く)
└─ DoorPanel(扉の板。親から見て右にずらす)
DoorPivot を回すと、その子の DoorPanel は軸を中心に振り回されます。これで扉らしく開きます。
この「軸を親にする」考え方は、扉だけでなく、揺れる看板、回転する扇風機、開く箱のふたなど、回転する物すべてに使えます。
実践:開く扉を作る
ボタンを押すと扉が開き、もう一度押すと閉じます。開閉はなめらかに動きます。
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」を開きます。
- 「Create」を押して、
DoorClosedという名前で保存する - 何も記録せずに、そのまま閉じる(Y回転が0の状態が記録されます)
これで「閉じたポーズ」ができました。同じ要領で、開いたポーズも作ります。
- Animationウィンドウのクリップ名の欄から「Create New Clip」を選び、
DoorOpenとして保存する - 録画ボタン(赤い丸)を押す
DoorPivotのRotation Yを90にする- 録画を止める
これで、Y回転が90度の状態が記録されました。
アニメーションの中身は「ポーズ1つ」で構いません。 あいだの動きは、次の設定でUnityが自動でつないでくれます。
3. 切り替えの仕組みを作る
DoorPivot に自動で付いた Animator コンポーネントを見てください。Controllerの欄に、さっき作られたAnimator Controllerが入っています。
ダブルクリックして開きます。

3つの言葉が出てきますが、関係はシンプルです。
| 名前 | 役割 |
|---|---|
| Animation Clip | 1つのポーズや動き(DoorClosed と DoorOpen) |
| Animator Controller | どのクリップをいつ再生するかの地図 |
| Animator(コンポーネント) | その地図を持って実際に動かす係 |
Controllerの画面で、次の設定をします。
- 左のParametersタブで
+を押し、Bool を選んでIsOpenと名付ける DoorClosedを右クリックして「Make Transition」を選び、DoorOpenへ矢印を引く- その矢印を選び、Conditionsに
IsOpentrueを追加する - Has Exit Time のチェックを外す
DoorOpenからDoorClosedへも矢印を引き、ConditionsをIsOpenfalseにして、同じく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で直接 | |
|---|---|---|
| 向くもの | 決まった動きの繰り返し | 毎回違う動き、計算で決める動き |
| 動きの調整 | タイムラインで視覚的に | コードの数値で |
| コード | 1行で済む | 位置の計算が要る |
| 途中で止める | 得意 | 自分で書く |
扉、引き 出し、看板の揺れ、装置の作動。同じ動きを繰り返すものはAnimator が楽です。
逆に、「押した回数だけ少しずつ動く」「プレイヤーの位置に合わせて向く」といった動きは、Udonで直接書きます。
うまくいかないときは
- 扉が真ん中で回る → 軸を親にしていません。空のオブジェクトを端に置いて、その子に扉を入れます
- 押しても動かない → パラメータ名のつづりが合っているか確認します。大文字小文字も区別されます
- 開き終わるまで閉じられない → Has Exit Timeのチェックが残っています
- 最初から開いている →
DoorClosedが既定の状態になっていません。右クリックで設定します - 通り抜けられない → 扉のColliderが開いた先にも残っています。Sceneビューで確認します
おまけ:先に知っておくと良いこと
- これはローカルの処理です: 押した人の画面だけで扉が開きます。全員で同じ状態にするには 同期する扉を作る の仕組みが要ります
- 同じ形で他の物も動かせる: 引き出し、跳ね橋、シャッター、回転する看板。軸の置き方と回す軸が変わるだけです
- 開く速さは遷移で調整する: 矢印 を選んだときに出るタイムラインで、切り替えにかける時間を変えられます。重い扉ならゆっくりに
- 音を足すと自然になる: 開くときにきしむ音を鳴らすと、ぐっとそれらしくなります。ボタンで切り替える の音の扱いが使えます
- アバター用のAnimatorとは別: アバター改変で出てくるAnimatorの話とは、扱う対象が違います。ワールドの物を動かす用途では、この記事の範囲で足ります
まとめ
Animatorで動かす扉は、3つの手順でできます。
- 扉の端に空のオブジェクトを置いて、それを親にする
- 閉じたポーズと開いたポーズを、2つのクリップとして作る
- Boolのパラメータで行き来させる。Has Exit Timeは外す
- Udonからは
SetBoolの1行だけ
作る前の問いかけは、「この動きは毎回同じか、それとも変わるか」 です。同じならAnimatorに任せます。