スイッチでライトが消えるギミックを作ろう|ギミック制作、はじめの一歩 Step 2

前回の記事では、ギミックを「きっかけ」と「変化」に分けて考えました。

いよいよ今回からは実際にギミックを作ってみましょう。
作るギミックは、とてもシンプルです。

  • きっかけ:CubeをInteractする
  • 変化:Spot Lightが消える

暗いワールドにSpot Lightとスイッチ用のCubeを配置し、Cubeを操作するとライトが消える仕組みを作ります。

CubeをInteractしてライトを消灯するギミックの模式図

初めてプログラムコードに触れる人でも、ひとつずつ進めれば大丈夫です。

Step2のゴール
  • 点灯しているSpot Lightを、ギミックで消灯できるようにする
リンカ先生
リンカ先生

まずは「オブジェクトにきっかけを与えて変化を起こす」というギミックの基本を体験することが目標だよ🚩

準備をしよう

今回は、他の設定やオブジェクトの影響を受けないように、新しいWorldプロジェクトを作って進めます。

VCCからWorld用のプロジェクトを作成し、Unityで開いてください。

ワールドを暗くしよう

今回はSpot Lightの点灯と消灯を分かりやすく確認するため、まずワールド全体を暗くします。

HierarchyにあるDirectional Lightを選択します。Inspectorの一番上にあるチェックを外し、Directional Lightを無効にしてください。

Directional Lightを無効化する画面

Directional Lightを無効にしても、ワールドはまだ明るく見えます。これは、Skyboxからの環境光がScene内を照らしているためです。

上部メニューから、「Window > Rendering > Lighting」でLighting設定を開きます。
Lightingウィンドウを開いたら、Environmentの項目を確認します。

LightingウィンドウのEnvironmentタブを開く画面

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

Lightingで環境光を暗くする設定
  • Skybox Material : None
  • Environment Lighting – Source : Color
  • Environment Lighting – Ambient Color: 暗めのグレー

次に、HierarchyにあるMain Cameraを選択します。Inspectorで、Cameraコンポーネントの以下の項目を設定します。

  • Clear Flags : Solid Color
  • Background : 暗めのグレー
Main CameraをSolid Colorにする設定
ゆかり
ゆかり

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

リンカ先生
リンカ先生

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

暗くしたワールドのGameビュー
設定後のワールド

Spot Lightを追加しよう

次に、今回操作するSpot Lightを追加します。
Hierarchyのから、「Light > Spot Light」を追加してください。

追加したSpot Lightを選択し、床に光が当たる位置へ移動します。必要に応じて、ColorやIntensityを調整して、見やすい状態にしましょう。

Spot Lightを床に向けた画面

今回は細かなライティングを作ることが目的ではないので、床に光が当たり、ライトが消えたことを見分けられれば十分です。

Spot Lightは、最初は有効にしておきます。

スイッチ用のCubeを追加しよう

続いて、ユーザーが操作するスイッチを用意します。

Hierarchyのから「3D Object > Cube」を追加します。追加したCubeの名前を、LightSwitchに変更します。
プレイヤーが近づいて操作しやすい位置へ移動し、大きさも調整してください。

スイッチ用のCubeを配置した画面
リンカ先生
リンカ先生

これで準備完了!

UdonSharp Scriptを作ろう

Hierarchyから、先ほど作成した「LightSwitch」を選択します。

Inspectorの下部にある「Add Component」をクリックします。

LightSwitchのAdd Componentボタン

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

Add ComponentからUdon Behaviourを選ぶ画面

Udon Behaviourは、VRChatワールド内でUdonの処理を動かすためのComponentです。今回は、このLightSwitchにUdonSharpで書いた処理を持たせるために使います。

追加したUdon BehaviourのInspectorを確認します。

Programの種類を選ぶ欄があるので、「Udon C# Program Asset」を選択してください。続いて、「New Program」を押します。

Udon C# Program Assetを確認する画面

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

Udon BehaviourのCreate Scriptボタン

スクリプトの保存場所とファイル名を指定する画面が表示されます。ファイル名はそのまま「LightSwitch.cs」で構いません。(Cubeのオブジェクト名がデフォルトのファイル名になっています)保存場所は、分かりやすいようにAssets内に「Scripts」というフォルダを作り、そこに保存するといいと思います。

作成されたLightSwitch.csには、UdonSharpスクリプトとして必要な基本的な記述があらかじめ用意されています。
このあと、このスクリプトにライトを消す処理を書き加えていきます。

作成されたUdon Script
補足:「Program Source」について

「Light Switch (Script)」のInspectorを見ると、Program Scriptの上に「Program Source」という項目があります。

これはUdonSharpで書いたスクリプトを、VRChatのUdonとして扱うためのProgram Assetです。自動で作成されるもので、基本的には自分で編集する必要はありません。
はじめのうちは気にしなくても大丈夫です。

完成コードを貼り付けよう

Udon BehaviourのInspectorに表示されている「Program Script」の「LightSwitch」をダブルクリックします。

すると、Visual Studioなど、Unityに設定されているコードエディターが開きます。

UdonのScriptをVisual Studioで開いた画面

コードエディターが開かない場合は、Unityの上部メニューから次の場所を確認します。

「Edit > Preferences」の「External Tools > External Script Editor」

External Script Editorに、使用するコードエディターが設定されているか確認してください。

ゆかり
ゆかり

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

リンカ先生
リンカ先生

まずはコピペで大丈夫👌
コードの意味もちゃんと解説するから安心して

開いたスクリプトに最初から書かれている内容をすべて削除し、次のコードを貼り付けてください。

using UdonSharp;
using UnityEngine;

public class LightSwitch : UdonSharpBehaviour
{
    public Light targetLight;

    public override void Interact()
    {
        targetLight.enabled = false;
    }
}

コードの「public class LightSwitch : UdonSharpBehaviour」の「LightSwitch」の部分はScriptのファイル名と一致している必要があります。

たとえば、ファイル名をMySwitch.csにした場合は、次のように変更します。

public class MySwitch : UdonSharpBehaviour

貼り付けたら、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欄へドラッグ&ドロップします。

Target LightにSpot Lightを登録する画面

これで、スクリプトがどのライトを操作するのか指定できました。
つまり、「きっかけ」となるLightSwitchと、「変化」の対象となるSpot Lightをつないだことになります。

ギミックの動作を確認する

準備ができたら、Client SimulatorかBuild & Testでワールドに入ります。

ワールドに入ったら、次の順番でギミックが意図通りに動作するか確認してみましょう。

  1. Spot Lightが点灯していることを確認
  2. CubeにInteractする
  3. 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をドラッグ&ドロップして登録します。

Target LightにSpot Lightを登録する画面

Consoleに赤いエラーが出ている

もう一度コードをコピペしてみてください。
また、Scriptのファイル名と、コード内のクラス名が一致しているか確認してください。
たとえば、ファイル名がLightSwitch.csの場合は、コードも
public class LightSwitch : UdonSharpBehaviourとなっている必要があります。

このステップのまとめ

今回は、CubeをInteractするとSpot Lightが消灯するギミックを作りました。

今回の仕組みを、「きっかけ」→「変化」にあてはめると次のようになります。

  • きっかけ:CubeをInteractする
  • 変化:Spot LightのLightコンポーネントを無効にする

また、Inspectorに登録欄を表示し、スクリプトと操作対象をつなぎました。

ギミック制作では、どのオブジェクトがきっかけを受け取り、どのオブジェクトを変化させるのかを意識することが大切です。

次のStepでは、現在のライトの状態を反転させ、Cubeを押すたびに点灯と消灯を切り替えられるようにします。

ゆかり
ゆかり

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

リンカ先生
リンカ先生

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

コメント

タイトルとURLをコピーしました