前回の記事では、ギミックを「きっかけ」と「変化」に分けて考えました。
いよいよ今回からは実際にギミックを作ってみましょう。
作るギミックは、とてもシンプルです。
- きっかけ:CubeをInteractする
- 変化:Spot Lightが消える
暗いワールドにSpot Lightとスイッチ用のCubeを配置し、Cubeを操作するとライトが消える仕組みを作ります。

初めてプログラムコードに触れる人でも、ひとつずつ進めれば大丈夫です。
- 点灯しているSpot Lightを、ギミックで消灯できるようにする

まずは「オブジェクトにきっかけを与えて変化を起こす」というギミックの基本を体験することが目標だよ🚩
準備をしよう
今回は、他の設定やオブジェクトの影響を受けないように、新しいWorldプロジェクトを作って進めます。
VCCからWorld用のプロジェクトを作成し、Unityで開いてください。
ワールドを暗くしよう
今回はSpot Lightの点灯と消灯を分かりやすく確認するため、まずワールド全体を暗くします。
HierarchyにあるDirectional Lightを選択します。Inspectorの一番上にあるチェックを外し、Directional Lightを無効にしてください。

Directional Lightを無効にしても、ワールドはまだ明るく見えます。これは、Skyboxからの環境光がScene内を照らしているためです。
上部メニューから、「Window > Rendering > Lighting」でLighting設定を開きます。
Lightingウィンドウを開いたら、Environmentの項目を確認します。

以下のように設定してください。

- Skybox Material : None
- Environment Lighting – Source : Color
- Environment Lighting – Ambient Color: 暗めのグレー
次に、HierarchyにあるMain Cameraを選択します。Inspectorで、Cameraコンポーネントの以下の項目を設定します。
- Clear Flags : Solid Color
- Background : 暗めのグレー


暗いワールドができました!

これでライトの光が見やすくなったね💡

Spot Lightを追加しよう
次に、今回操作するSpot Lightを追加します。
Hierarchyの+から、「Light > Spot Light」を追加してください。
追加したSpot Lightを選択し、床に光が当たる位置へ移動します。必要に応じて、ColorやIntensityを調整して、見やすい状態にしましょう。

今回は細かなライティングを作ることが目的ではないので、床に光が当たり、ライトが消えたことを見分けられれば十分です。
Spot Lightは、最初は有効にしておきます。
スイッチ用のCubeを追加しよう
続いて、ユーザーが操作するスイッチを用意します。
Hierarchyの+から「3D Object > Cube」を追加します。追加したCubeの名前を、LightSwitchに変更します。
プレイヤーが近づいて操作しやすい位置へ移動し、大きさも調整してください。


これで準備完了!
UdonSharp Scriptを作ろう
Hierarchyから、先ほど作成した「LightSwitch」を選択します。
Inspectorの下部にある「Add Component」をクリックします。

検索欄にudonと入力して、検索結果の中から「Udon Behaviour」を選択してください。

Udon Behaviourは、VRChatワールド内でUdonの処理を動かすためのComponentです。今回は、このLightSwitchにUdonSharpで書いた処理を持たせるために使います。
追加したUdon BehaviourのInspectorを確認します。
Programの種類を選ぶ欄があるので、「Udon C# Program Asset」を選択してください。続いて、「New Program」を押します。

そして、「Create Script」をクリックします。この操作でProgram AssetとScript(スクリプト)が作成されます。

スクリプトの保存場所とファイル名を指定する画面が表示されます。ファイル名はそのまま「LightSwitch.cs」で構いません。(Cubeのオブジェクト名がデフォルトのファイル名になっています)保存場所は、分かりやすいようにAssets内に「Scripts」というフォルダを作り、そこに保存するといいと思います。
作成されたLightSwitch.csには、UdonSharpスクリプトとして必要な基本的な記述があらかじめ用意されています。
このあと、このスクリプトにライトを消す処理を書き加えていきます。

「Light Switch (Script)」のInspectorを見ると、Program Scriptの上に「Program Source」という項目があります。
これはUdonSharpで書いたスクリプトを、VRChatのUdonとして扱うためのProgram Assetです。自動で作成されるもので、基本的には自分で編集する必要はありません。
はじめのうちは気にしなくても大丈夫です。
完成コードを貼り付けよう
Udon BehaviourのInspectorに表示されている「Program Script」の「LightSwitch」をダブルクリックします。
すると、Visual Studioなど、Unityに設定されているコードエディターが開きます。


いきなりプログラムコードなんて書けるかなぁ…

まずはコピペで大丈夫👌
コードの意味もちゃんと解説するから安心して
開いたスクリプトに最初から書かれている内容をすべて削除し、次のコードを貼り付けてください。
using UdonSharp;
using UnityEngine;
public class LightSwitch : UdonSharpBehaviour
{
public Light targetLight;
public override void Interact()
{
targetLight.enabled = false;
}
}
貼り付けたら、Ctrl + Sを押して保存します。

え…プログラムコードってたったこれだけですか?

そ!意外と少ないでしょ?
コードの解説
using UdonSharp;
using UnityEngine;
public class LightSwitch : UdonSharpBehaviour
{
// ここがコードの本体
}
まず最初の2行は「UdonSharp」と「UnityEngine」という道具箱を使うよ、という宣言をしています。ここはあまり気にしなくていいです。
その後LightSwitchという処理のまとまりを作り、その中括弧 { } の中に今回のギミックの処理を書いていきます。
public Light targetLight;
今回のギミックでは「Light」を操作します。Sceneには複数のLightがあることもありますから、どのLightを対象とするのかを指定できるようにする必要があります。
public Light targetLight; と書くことで、Inspectorに「Target Light」という項目が表示され、そこから操作したいLightを指定できるようになります。
public override void Interact()
{
targetLight.enabled = false;
}
ここはInteractしたときにどのような処理を行うのかを記述しています。
targetLightは、先ほど指定した操作対象のLightです。
Lightにはさまざまな設定項目がありますが、enabledはLightコンポーネントを有効/無効にする設定です。これをfalseにすることでLightが無効になり、ライトが消えます。
つまり、この処理は、
「Interactされたら、対象のLightをOFFにしてね」
という意味です。
ギミックを動かしてみる
プログラムコードの意味がなんとなくわかったところで、実際にギミックを動かしてみましょう。
Unityへ戻ると、スクリプトの読み込みが始まります。画面右下などに処理中の表示が出ている間は、操作せずに少し待ちます。
LightSwitchを選択すると、Inspectorの「Light Switch (Script)」にTarget Lightという登録欄が表示されます。
これは、コードに書いた次の行によって作られた欄です。
public Light targetLight;
HierarchyにあるSpot Lightを、InspectorのTarget Light欄へドラッグ&ドロップします。

これで、スクリプトがどのライトを操作するのか指定できました。
つまり、「きっかけ」となるLightSwitchと、「変化」の対象となるSpot Lightをつないだことになります。
ギミックの動作を確認する
準備ができたら、Client SimulatorかBuild & Testでワールドに入ります。
ワールドに入ったら、次の順番でギミックが意図通りに動作するか確認してみましょう。
- Spot Lightが点灯していることを確認
- CubeにInteractする
- Spot Lightが消える
ライトが消えれば、最初のギミックは完成です。

たった1回の変化ですが、
- ユーザーの操作を受け取る
- スクリプトが処理を実行する
- オブジェクトに変化を起こす
という、ギミック制作の基本がすべて含まれています。

やった!できました✨

おめでとう🎉ゆかりんもギミックデビューだね
もう一度押してもライトが点かないのはなぜ?

あれ…?もう一度スイッチを教えてもLightが付きません!

うん、それは正常だよ
なぜかを説明するね
今回のコードには、ライトを消す処理だけが書かれています。
targetLight.enabled = false;
Interactするたびに、Lightの状態を falseにしています。
一度目の操作では、点灯していたライトが消えます。
二度目以降も falseを設定しますが、すでにライトは消えているため、見た目には何も変化しません。
これは不具合ではなく、現在のコードどおりの動作です。

でも、消えっぱなしだと困るんですけど…
次のStepでは、ライトの現在の状態を使って、
- 点灯中なら消す
- 消灯中なら点ける
という切り替え処理を作ります。

少しずつギミックをパワーアップしていこう💪
うまく動かないときは
Interactの表示が出ない
次の点を確認してみてください。
- CubeにBox Colliderが付いているか
- CubeにUdon Behaviourが付いているか
- Cubeから離れすぎていないか
- Udon BehaviourのProximityが小さすぎないか
Cubeを操作してもライトが消えない
InspectorのTarget Light欄を確認してください。
Spot Lightが登録されていない場合、スクリプトは操作する対象を見つけられません。
HierarchyからSpot Lightをドラッグ&ドロップして登録します。

Consoleに赤いエラーが出ている
もう一度コードをコピペしてみてください。
また、Scriptのファイル名と、コード内のクラス名が一致しているか確認してください。
たとえば、ファイル名がLightSwitch.csの場合は、コードもpublic class LightSwitch : UdonSharpBehaviourとなっている必要があります。
このステップのまとめ
今回は、CubeをInteractするとSpot Lightが消灯するギミックを作りました。
今回の仕組みを、「きっかけ」→「変化」にあてはめると次のようになります。
- きっかけ:CubeをInteractする
- 変化:Spot LightのLightコンポーネントを無効にする
また、Inspectorに登録欄を表示し、スクリプトと操作対象をつなぎました。
ギミック制作では、どのオブジェクトがきっかけを受け取り、どのオブジェクトを変化させるのかを意識することが大切です。
次のStepでは、現在のライトの状態を反転させ、Cubeを押すたびに点灯と消灯を切り替えられるようにします。

はじめて作ったギミック、嬉しかったなぁ♪

思っていたよりも簡単だったでしょ?





コメント