【VRChat】プログラムの4つの部品:変数・if・for・関数

作成: 2026-09-09

プログラミング未経験者向けに、変数・if・for・関数の4つを1つの作例で使います。押した回数を数えて、3つのライトの色を順に変えるボタンを作ります。

Udonのスクリプトを作って、Cubeを動かすところまでは進みました。ただ、サンプルのコードを写しているだけで、何を書いているのかは分かっていません。

覚えることは、それほど多くありません。ワールドの仕掛けの大半は、たった4つの部品でできています。

この記事では、その4つを 1つの作例の中で順に使います。 押すたびに3つのライトの色が変わり、3回で最初に戻るボタンを作ります。

変数・if・for・関数の4つの部品

この記事でわかること

  • 変数:値をしまっておく箱
  • if:はいかいいえで道が分かれる
  • for:同じことを繰り返す
  • 関数:処理に名前を付けてまとめる

UdonSharpをはじめる でスクリプトを作れる状態から始めます。

Sponsored


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 == baとbは同じか
a != baとbは違うか
a > b / a < baは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 と書いてあれば、中を読まなくても「色を反映するんだな」と分かります。コードは自分が半年後に読み返すものです。 名前を付けておくと、そのときの自分が助かります。

Sponsored

実践:押した回数で色が変わるボタン

押すたびに3つのライトの色が変わり、3回で最初に戻るボタンを作ります。4つの部品が全部出てきます。

1. ライトとボタンを置く

床のあるシーンに、次を置きます。

名前作り方と設定
Light1 Light2 Light3Point Light。(-2, 2.5, 3) (0, 2.5, 3) (2, 2.5, 3)。Range 6、Mode「Realtime」
ColorButtonCube。(0, 1, 1)、Scale (0.4, 0.4, 0.4)
3つのライトとボタンの配置

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 にしまう
if3以上なら0に戻す。空のライトは飛ばす
forライトの数だけ繰り返して、全部に色を入れる
関数色を反映する手順に ApplyColor という名前を付けた

continue は「この回は飛ばして次へ」という意味です。ライトの欄が空のままでもエラーにならないようにしています。

colors.Length を使っているので、色を4つに増やしてもコードは直りません。 >= 3 と書いていたら、直す必要がありました。これが Length を使う理由です。

3. 割り当てて確かめる

ColorButton に Udon Behaviour を追加して、ColorCycleButton を指定します。

指定するもの
Target LightsSizeを 3 にして、Light1 から Light3 をドラッグ
ColorsSizeを 3 にして、白・青・オレンジを設定
Interaction Text色を変える
配列の欄に3つずつ割り当てる

Playして押してみます。

押した回数ライトの色Consoleの表示
1回目青(1番目)1 番目の色
2回目オレンジ(2番目)2 番目の色
3回目白に戻る(0番目)0 番目の色
4回目1 番目の色

3回で最初に戻ります。 ifが効いている証拠です。

Light3 の割り当てをわざと外して押してみてください。エラーにならず、残りの2つだけ色が変わります。 continue の if が働いています。

Sponsored

よくある間違い

未経験者が最初に踏むものを、まとめておきます。どれも全員が通る道です。

  • === を取り違える → 入れるときは1つ、比べるときは2つ
  • floatf を付け忘れる0.5 ではなく 0.5f と書きます
  • ; を忘れる → 行の終わりには ; が要ります。エラーの行番号が1つ下を指すことがあります
  • { } の対応が合わない → 開いたら必ず閉じます。エディタが自動で字下げしてくれるので、ずれていたら疑います
  • 配列の範囲を超える → 3個の配列に [3] はありません。0 から 2 までです
  • 変数の名前を間違える → 大文字と小文字は区別されます。pressCountpresscount は別物です

エラーが出るのは良いことです。 何も言わずに動かないほうが、よほど厄介です。エラーメッセージの行番号を見て、その周辺を疑ってください。

おまけ:先に知っておくと良いこと

  • 暗記しなくてよい: 書き方は忘れても、この記事や過去に書いたコードを見返せば済みます。覚えるのは「4つの部品がある」という枠組みだけです
  • 名前は長くてよい: pc より pressCount のほうが、あとで読んだときに分かります。打つ手間より、読む手間を減らしてください
  • コメントを書く: // から後ろは実行されません。何をしているかを日本語で書いておくと、半年後の自分が助かります
  • 小さく試す: 一度に全部書かず、Debug.Log を1つ書いて動かす、から始めます。動くものを少しずつ育てるほうが速いです
  • 次に覚えるのは配列: この記事でも使いましたが、変数とデータ型 で詳しく扱います

まとめ

プログラムは、4つの部品でできています。

  • 変数:値をしまう箱。種類がある
  • if:条件で道が分かれる。比べるときは ==
  • for:同じことを繰り返す。配列と組むと強い
  • 関数:処理に名前を付ける。名前が説明になる

新しい仕掛けを作るときの問いかけは、「何をしまって、どこで分かれて、何を繰り返すか」 です。これに答えられれば、コードの形はもう見えています。

値の種類を詳しく知るなら 変数とデータ型、処理を呼び分けるなら メソッドとカスタムイベント へ進んでください。

VRChat このセクションのノート63