前回のStepでは、CubeをInteractするとSpot Lightが消えるギミックを作りました。
ただし、前回のコードでは、ライトを消すことしかできません。
今回はコードを少しだけ書き換えて、Cubeを押すたびに、Spot Lightの点灯と消灯を切り替えられるようにします。
- ライトが点いているときに押すと、消える
- ライトが消えているときに押すと、点く
これで、実際の照明スイッチに近い動きになります。
- CubeをInteractするたびにSpot Lightが点灯/消灯するギミックを作る
前回のコードを確認しよう
前回のLightSwitchスクリプトは、次のような内容でした。
using UdonSharp;
using UnityEngine;
public class LightSwitch : UdonSharpBehaviour
{
public Light targetLight;
public override void Interact()
{
targetLight.enabled = false;
}
}
ライトを消しているのは、次の1行です。
targetLight.enabled = false;
targetLightは、InspectorのTarget Light欄に登録したSpot Lightです。そのLightコンポーネントが持つ enabled という設定を、false に変更しています。
なぜ、もう一度押しても点かないのか
enabled は、そのコンポーネントが有効になっているかどうかを表す設定です。
Lightコンポーネントの場合は、次のようになります。
- true:Lightが有効で、点灯している
- false:Lightが無効で、消灯している
前回のコードでは、CubeをInteractするたびに、必ずfalseを設定しています。
targetLight.enabled = false;
最初にライトが点灯している場合は、true から false に変わるため、ライトが消えます。しかし、二度目に押したときも設定されるのは false です。すでにライトは false の状態なので、見た目には何も変わりません。
ライトを再び点灯させるには、消灯中はtrueへ変更する必要があります。
現在と反対の状態にしよう
今回作りたい動きは、次のとおりです。
- 現在が
trueなら、falseにする - 現在が
falseなら、trueにする

つまり、スイッチが押されるたびに現在とは反対の状態に切り替えるんですね💡

その通り!いいところに気がついたね
このように true と false を反対にするには、!という記号を使います。
!targetLight.enabled
!は「NOT(否定)」を表す記号で、trueとfalseを反対にします。
targetLight.enabledがtrueのとき:!targetLight.enabledはfalsetargetLight.enabledがfalseのとき:!targetLight.enabledはtrue
コードを書き換えよう
ProjectウィンドウにあるLightSwitchスクリプトをダブルクリックし、コードエディターで開きます。
前回書いた次の行を探してください。
targetLight.enabled = false;
この行を、次のように書き換えます。
targetLight.enabled = !targetLight.enabled;
このコードでは、まず右側の!targetLight.enabledで現在とは反対の値を作り、その結果を左側のtargetLight.enabledに設定しています。
修正後のコード全体は、次のようになります。
using UdonSharp;
using UnityEngine;
public class LightSwitch : UdonSharpBehaviour
{
public Light targetLight;
public override void Interact()
{
targetLight.enabled = !targetLight.enabled;
}
}
コードを書き換えたら、Ctrl + Sを押して保存します。
Unityへ戻り、スクリプトの読み込みが終わるまで待ちます。
ギミックを動かしてみる
Client SimulatorかBuild & Testでワールドに入ります。
ワールドに入ったら、次の順番でギミックが意図通りに動作するか確認してみましょう。
- Spot Lightが点灯していることを確認する
- CubeをInteractする
- Spot Lightが消灯する
- もう一度CubeをInteractする
- Spot Lightが点灯する
何度か繰り返し操作し、点灯と消灯が交互に切り替わることを確認してください。
ワールドに入ったときのライトの状態は、Unity上のSpot Lightの設定によって決まります。
最初から点灯させたい場合は、Spot Lightを有効にしておきます。
最初から消灯させたい場合は、Spot Lightを無効にしておきます。
HierarchyでSpot Lightを選択し、InspectorのLightコンポーネントのチェックを外すと無効にできます。

今回のコードは、現在の状態を反対にする仕組みです。そのため、最初の状態がどちらであっても動作します。
状態によって動作が変わるギミック
前回のギミックは、Interactすると必ずライトを消すものでした。
今回は、現在の状態によって、次に起こる変化が変わります。
- 点灯中に押すと消灯する
- 消灯中に押すと点灯する
このように、現在の状態から別の状態へ切り替わることを「状態遷移」と呼びます。
今回のライトスイッチには、「点灯」と「消灯」という2つの状態があります。
CubeをInteractするたびに、
点灯 → 消灯 → 点灯 → 消灯……
と、2つの状態を行き来しているわけです。

状態遷移は、プログラミングでよく使われる基本的な考え方です。
たとえば、ライト以外にも次のようなギミックで使われます。
- ドアが閉じていれば開く/ドアが開いていれば閉じる
- ミラーが非表示なら表示する/ミラーが表示中なら非表示にする
- オブジェクトが隠れていれば表示する/オブジェクトが表示中なら隠す
ギミックを作るときには、「何が起こるか」だけでなく、現在どのような状態なのか、そして次にどの状態へ変化するのかを考えることも大切です。
今回のライトスイッチは、「点灯」と「消灯」という2つの状態を切り替える、もっともシンプルな状態遷移の例です。
うまく動かないときの確認
ライトが消えるだけで、再び点かない
コードが前回のままになっていないか確認してください。
targetLight.enabled = false;
ではなく、次のようになっている必要があります。
targetLight.enabled = !targetLight.enabled;
特に、!が抜けていないか確認します。
Consoleにエラーが出る
コードを記事の完成形と見比べてください。
次のような入力間違いがないか確認します。
!が全角の記号になっていないかtargetLightの大文字と小文字が合っているか- 行末の
;が抜けていないか - 不要な文字が入っていないか
プログラムコードでは、記号は半角で入力します。
Cubeを押しても反応しない
前回と同じく、次の点を確認してください。
- CubeにBox Colliderが付いているか
- CubeにUdon Behaviourが付いているか
Target Light欄にSpot Lightが登録されているか- Consoleに赤いエラーが出ていないか
- Cubeから離れすぎていないか
最初からライトが消えている
Spot LightがUnity上で無効になっている可能性があります。
最初から点灯させたい場合は、Spot Lightを選択し、InspectorのLightコンポーネントのチェックを有効にしてください。
ただし、最初から消灯した状態で始めたいのであれば、そのままでも問題ありません。
このステップのまとめ
今回は、前回作ったライトスイッチのコードを1行だけ書き換えました。
targetLight.enabled = !targetLight.enabled;
enabledには、Lightコンポーネントが有効かどうかを表すtrueまたはfalseが入っています。
先頭に!を付けることで、その値を反対にできます。
その結果、CubeをInteractするたびに、
- 点灯中なら消灯する
- 消灯中なら点灯する
という切り替えができるようになりました。
今回のギミックを整理すると、次のようになります。
- きっかけ:CubeをInteractする
- 現在の状態:Spot Lightが点灯しているか、消灯しているか
- 変化:現在とは反対の状態に切り替える
次のStepでは、Cubeを押したときに操作音が鳴るようにします。ライトの変化に音を加えて、操作したことが伝わるギミックに仕上げていきましょう。

だんだんそれらしいギミックになってきました!

次回も楽しんでいこうね✨




コメント