Udonのスクリプトを作って、Cubeを動かすところまでは進みました。ただ、サンプルのコードを写しているだけで、何を書いているのかは分かっていません。
覚えることは、それほど多くありません。ワールドの仕掛けの大半は、たった4つの部品でできています。
この記事では、その4つを 1つの作例の中で順に使います。 押すたびに3つのライトの色が変わり、3回で最初に戻るボタンを作ります。
この記事でわかること
- 変数:値をしまっておく箱
- if:はいかいいえで道が分かれる
- for:同じことを繰り返す
- 関数:処理に名前を付けてまとめる
UdonSharpをはじめる でスクリプトを作れる状態から始めます。
4つの部品でできている
プログラムを「呪文」だと思っていると、覚える量が無限に見えます。実際には、やっていることは4種類しかありません。

| 部品 | やること | ひとことで言うと |
|---|---|---|
| 変数 | 値をしまう | 箱 |
| if | 条件で道を分ける | 分かれ道 |
| for | 同じことを繰り返す | 繰り返し |
| 関数 | 処理に名前を付ける | 名前付きの手順書 |
この4つを組み合わせると、扉も、照明も、カウンターも書けます。
新しい仕掛けを作るときも、この4つの範囲で考えられます。 「何をしまうか」「どこで分かれるか」「何を繰り返すか」「どこで区切るか」。この4つに答えられれば、コードは自然に形になります。
1つずつ見ていく
変数:値をしまう箱
変数は箱です。 中に値を入れておいて、あとで取り出したり、書き換えたりします。

int pressCount = 0; // 「整数を入れる箱」を作って、0 を入れた
int が「箱の種類」、pressCount が「箱の名前」、0 が「最初に入れる値」です。
箱には種類があります。整数の箱に文字は入りません。
| 書き方 | 入るもの | 例 |
|---|---|---|
int | 整数 | 0 3 -5 |
float | 小数 | 0.5f 3.14f |
bool | はい・いいえ | true false |
string | 文字 | "開いた" |
float の値に f が付くのは、C#の決まりです。忘れるとエラーになりますが、エラーが教えてくれるので気にしなくて構いません。
箱の中身は、あとから何度でも変えられます。
pressCount = pressCount + 1; // いまの中身に 1 を足して、入れ直す
= は「等しい」ではなく 「右のものを、左の箱に入れる」 という意味です。ここが最初の関門なので、覚えておいてください。
if:はいかいいえで道が分かれる
ifは分かれ道です。 条件が「はい」なら中の処理をして、「いいえ」なら飛ばします。

if (pressCount >= 3)
{
pressCount = 0; // 3以上なら、0に戻す
}
( ) の中に書くのは、答えが「はい」か「いいえ」になる質問 です。
| 書き方 | 意味 |
|---|---|
a == b | aとbは同じか |
a != b | aとbは違うか |
a > b / a < b | aはbより大きいか、小さいか |
a >= b / a <= b | 以上か、以下か |
== を2つ書くのが比べるとき、= が1つなら入れるときです。 これも全員が一度は間違えます。
「いいえ」のときにも何かしたいなら、else を足します。
if (isOpen)
{
// 開いているときの処理
}
else
{
// 閉じているときの処理
}
for:同じことを繰り返す
forは繰り返しです。 同じ処理を、決めた回数だけ実行します。

ワールド制作で最初にforが要るのは、同じものが複数あるとき です。ライトが3つ、椅子が5脚、看板が4枚。1つずつ書くこともできますが、増えたときに書き直しになります。
for (int i = 0; i < 3; i++)
{
// ここが3回動く。i は 0, 1, 2 と変わる
}
( ) の中は3つに分かれています。
| 部分 | 意味 |
|---|---|
int i = 0 | 数える箱を作っ て、0から始める |
i < 3 | この条件を満たすあいだ繰り返す |
i++ | 1回終わるごとに、1増やす |
i++ は i = i + 1 の短い書き方です。
配列と組み合わせると、真価が出ます。
for (int i = 0; i < lights.Length; i++)
{
lights[i].enabled = true; // 全部のライトを点ける
}
lights.Length は「配列に入っている個数」です。個数を数字で書かずに済むので、ライトを増やしてもコードは直さなくて済みます。
関数:名前を付けてまとめる
関数は、処理に名前を付けたものです。 何度も使う手順をまとめて、名前で呼び出せるようにします。

private void ApplyColor(Color color)
{
// 色を反映する処理
}
読み方はこうです。
| 部分 | 意味 |
|---|---|
private | このスクリプトの中だけで使う |
void | 呼んでも値を返さない |
ApplyColor | 名前 |
(Color color) | 呼ぶときに渡すもの |
呼ぶときは、名前を書くだ けです。
ApplyColor(Color.red);
分ける理由は2つあります。 同じ処理を何度も書かずに済むこと。そして、名前が説明になること です。
ApplyColor と書いてあれば、中を読まなくても「色を反映するんだな」と分かります。コードは自分が半年後に読み返すものです。 名前を付けておくと、そのときの自分が助かります。
実践:押した回数で色が変わるボタン
押すたびに3つのライトの色が変わり、3回で最初に戻るボタンを作ります。4つの部品が全部出てきます。
1. ライトとボタンを置く
床のあるシーンに、次を置きます。
| 名前 | 作り方と設定 |
|---|---|
Light1 Light2 Light3 | Point Light。(-2, 2.5, 3) (0, 2.5, 3) (2, 2.5, 3)。Range 6、Mode「Realtime」 |
ColorButton | Cube。(0, 1, 1)、Scale (0.4, 0.4, 0.4) |

2. コードを書く
Assets/Scripts で「Create → U# Script」を選び、ColorCycleButton を作ります。
using UdonSharp;
using UnityEngine;
[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class ColorCycleButton : UdonSharpBehaviour
{
[SerializeField] private Light[] targetLights; // 3つのライト
[SerializeField] private Color[] colors; // 3色
private int pressCount = 0; // ① 変数
public override void Interact()
{
pressCount = pressCount + 1;
// ② if:3以上になったら、最初に戻す
if (pressCount >= colors.Length)
{
pressCount = 0;
}
// ④ 関数を呼ぶ
ApplyColor(colors[pressCount]);
Debug.Log("[ColorCycle] " + pressCount + " 番目の色");
}
// ④ 関数:色を全部のライトに反映する
private void ApplyColor(Color color)
{
// ③ for:ライトの数だけ繰り返す
for (int i = 0; i < targetLights.Length; i++)
{
if (targetLights[i] == null) continue; // ② if:空なら飛ばす
targetLights[i].color = color;
}
}
}
4つの部品が、全部1か所に集まっています。
| 番号 | 部品 | どこで何をしているか |
|---|---|---|
| ① | 変数 | 押した回数を pressCount にしまう |
| ② | if | 3以上なら0に戻す。空のライトは飛ばす |
| ③ | for | ライトの数だけ繰り返して、全部に色を入れる |
| ④ | 関数 | 色を反映する手順に ApplyColor という名前を付けた |
continue は「この回は飛ばして次へ」という意味です。ライトの欄が空のままでもエラーにならないようにしています。
colors.Length を使っているので、色を4つに増やしてもコードは直りません。 >= 3 と書いていたら、直す必要がありました。これが Length を使う理由です。
3. 割り当てて確かめる
ColorButton に Udon Behaviour を追加して、ColorCycleButton を指定します。
| 欄 | 指定するもの |
|---|---|
| Target Lights | Sizeを 3 にして、Light1 から Light3 をドラッグ |
| Colors | Sizeを 3 にして、白・青・オレンジを設定 |
| Interaction Text | 色を変える |

Playして押してみます。
| 押した回数 | ライトの色 | Consoleの表示 |
|---|---|---|
| 1回目 | 青(1番目) | 1 番目の色 |
| 2回目 | オレンジ(2番目) | 2 番目の色 |
| 3回目 | 白に戻る(0番目) | 0 番目の色 |
| 4回目 | 青 | 1 番目の色 |
3回で最初に戻ります。 ifが効いている証拠です。
Light3 の割り当てをわざと外して押してみてください。エラーにならず、残りの2つだけ色が変わります。 continue の if が働いています。
よくある間違い
未経験者が最初に踏むものを、まとめておきます。どれも全員が通る道です。
=と==を取り違える → 入れるときは1つ、比べるときは2つfloatにfを付け忘れる →0.5ではなく0.5fと書きます;を忘れる → 行の終わりには;が要ります。エラーの行番号が1つ下を指すことがあります{ }の対応が合わない → 開いたら必ず閉じます。エディタが自動で字下げしてくれるので、ずれていたら疑います- 配列の範囲を超える → 3個の配列に
[3]はありません。0から2までです - 変数の名前を間違える → 大文字と小文字は区別されます。
pressCountとpresscountは別物です
エラーが出るのは良いことです。 何も言わずに動かないほうが、よほど厄介です。エラーメッセージの行番号を見て、その周辺を疑ってください。