1. はじめに
ゲームを作っていると、「オブジェクトが動いているときだけ特定の処理を実行したい!」と思うことはありませんか? 例えば、キャラクターが移動している間だけ足音を鳴らしたり、車が走っているときだけエンジン音を鳴らしたりすることが考えられます。
そこで、この記事では 「オブジェクトが移動している間だけ色を変えるスクリプト」 を作成しながら、この仕組みを学んでいきます!具体的には、Cubeが動いている間は赤、止まっていると青になる処理 をC#スクリプトで実装します。
初心者でも理解しやすいように、Rigidbody を活用してスクリプトを書き、物理的な動きを考慮した実装 で進めていきます。
Unityの基本操作やC#スクリプトに少しでも触れたことがあれば大丈夫!一緒に作ってみましょう!
2. 環境準備
まずは、Unityでオブジェクトを作成し、スクリプトを適用する準備をしましょう。以下の手順に沿って環境を整えていきます。
① 新しいUnityプロジェクトを作成
まず、Unityを開き、新しい 3Dプロジェクト を作成します。プロジェクト名は自由ですが、例えば「MoveColorChange」など分かりやすい名前をつけると良いでしょう。
② Plane(平面)を配置
次に、Cubeを移動させるための地面として Plane を作成します。
- Hierarchy(ヒエラルキー)ウィンドウで右クリック
- 「3D Object」→「Plane」 を選択
- Inspector(インスペクター)ウィンドウ でスケールを変更
- Scale(スケール)を X=5, Z=5 に設定(大きめの床を作る)
③ Cube(キューブ)を配置
移動するオブジェクトとして Cube を追加します。
- Hierarchyウィンドウで右クリック
- 「3D Object」→「Cube」 を選択
- Position(位置)を調整
- Position(ポジション):X=0, Y=0.5, Z=0(床の上に配置)
④ Rigidbody(リジッドボディ)の追加
Cubeを移動させるために、 Rigidbody を追加します。
- HierarchyウィンドウでCubeを選択
- Inspectorウィンドウの「Add Component」をクリック
- 「Rigidbody」を検索し、追加
- Rigidbodyの設定を調整
- Use Gravity(重力を使う) → チェックを外す(床に落ちないようにする)
- Constraints(制約)タブを開く
- Freeze Rotation(回転を固定) の X、Y、Z にチェック(Cubeが回転しないようにする)
⑤ カメラの調整(オプション)
デフォルトのカメラではCubeが見づらい場合、カメラの位置を調整しましょう。
- Hierarchyウィンドウで「Main Camera」を選択
- InspectorでPositionを調整
- X=0, Y=3, Z=-5
- Rotation X=20, Y=0, Z=0(Cubeを見下ろす視点にする)

これで環境準備は完了です!次は、Cubeが移動中のみ色を変えるスクリプトを作成していきます。
3. スクリプトの作成
では、移動中だけオブジェクトの色を変更するスクリプトを作成していきましょう!
まずは 「CubeScript.cs」 というC#スクリプトを作成し、それをCubeにアタッチします。
💡「C#でコードを書くのはちょっとハードルが高い…」という方には、視覚的に処理を組み立てられる人気ツール【PlayMaker】もおすすめです!ノーコードで条件分岐や移動処理などが簡単に作れます。コードを書く前にぜひチェックしてみてください!
1. スクリプトの作成
- プロジェクトウィンドウを開く
- 右クリック →「Create」→「C# Script」 を選択
- スクリプトの名前を 「CubeScript」 に変更
- 作成したスクリプトを Cubeにドラッグ&ドロップ してアタッチ
2. スクリプトの編集
次に、作成した 「CubeScript.cs」 をダブルクリックして開き、以下のコードを入力してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeScript : MonoBehaviour
{
Renderer cubeMaterial;
private float input;
Rigidbody rb;
void Start()
{
// Cubeのマテリアルを取得
cubeMaterial = GetComponent<Renderer>();
// Rigidbodyを取得
rb = GetComponent<Rigidbody>();
}
void Update()
{
// キーボードの左右入力を取得
input = Input.GetAxisRaw("Horizontal");
// Rigidbodyを使ってCubeを移動させる
rb.velocity = new Vector3(input * 5.0f, 0, 0);
// 入力の絶対値を取得
float movement = Mathf.Abs(input);
// 移動中なら赤、停止中なら青に変更
if (movement > 0)
{
cubeMaterial.material.color = Color.red;
}
else
{
cubeMaterial.material.color = Color.blue;
}
}
}
このスクリプトでは、以下のような動作を実装しています。
✅ 左右キーでCubeを動かす(rb.velocity
を設定)
✅ Mathf.Abs() を使って移動中か判定
✅ 移動中は赤、停止中は青に色変更
4. スクリプトの解説
それでは、スクリプトの中身を詳しく見ていきましょう。まずは、今回作成したスクリプトをもう一度確認してみます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeScript : MonoBehaviour
{
Renderer cubeMaterial;
private float input;
Rigidbody rb;
void Start()
{
cubeMaterial = GetComponent<Renderer>();
rb = GetComponent<Rigidbody>();
}
void Update()
{
input = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector3(input * 5.0f, 0, 0);
float movement = Mathf.Abs(input);
if(movement > 0)
{
cubeMaterial.material.color = Color.red;
}
else
{
cubeMaterial.material.color = Color.blue;
}
}
}
このスクリプトでは、Cubeを左右に動かしながら、移動している間は赤、停止すると青に色を変える処理を行っています。それぞれの処理を詳しく解説します。
1. Start() メソッド:オブジェクトの準備
void Start()
{
cubeMaterial = GetComponent<Renderer>();
rb = GetComponent<Rigidbody>();
}
Start()
メソッドでは、以下の2つの準備を行います。
cubeMaterial
にRendererを取得GetComponent<Renderer>()
を使って、CubeのRenderer
(見た目を管理するコンポーネント)を取得- この
Renderer
を通じて、マテリアルの色を変更できる
rb
にRigidbodyを取得GetComponent<Rigidbody>()
を使って、Cubeに設定した Rigidbody を取得rb
を通じてCubeの動きを制御できる
2. Update() メソッド:移動処理
input = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector3(input * 5.0f, 0, 0);
Update()
メソッドでは、毎フレーム以下の処理を行います。
Input.GetAxisRaw("Horizontal")
で移動の入力を取得"Horizontal"
は 左(Aキー)または右(Dキー) の入力を取得Input.GetAxisRaw
はキーを押した瞬間に1か-1の値を取得できる
rb.velocity
でCubeを動かすrb.velocity = new Vector3(input * 5.0f, 0, 0);
を使って、左右移動を実装input * 5.0f
の部分で移動速度を設定5.0f
の値を変更すると、Cubeの移動速度を調整可能
3. Mathf.Abs() を使って移動を判定
float movement = Mathf.Abs(input);
Mathf.Abs()
を使って、入力値の絶対値を取得 しています。
input
の値は -1(左移動)または 1(右移動)または 0(停止)のいずれかMathf.Abs(input)
を使うことで、移動しているかどうかを数値で判断 できる- 移動中なら
1
- 停止中なら
0
- 移動中なら
4. Cubeの色を変える処理
if(movement > 0)
{
cubeMaterial.material.color = Color.red;
}
else
{
cubeMaterial.material.color = Color.blue;
}
movement > 0
のとき(Cubeが動いているとき)cubeMaterial.material.color = Color.red;
で赤色に変更
movement == 0
のとき(Cubeが止まっているとき)cubeMaterial.material.color = Color.blue;
で青色に変更
これによって、「移動中だけ実行される処理」を実装 できました!
スクリプトのポイントまとめ
✅ Input.GetAxisRaw("Horizontal")
で移動の入力を取得
✅ rb.velocity
を使ってオブジェクトを移動
✅ Mathf.Abs()
で移動しているかどうかを判定
✅ if
文を使って、移動中は赤、停止時は青に変更
5. 動作確認
それでは、実際にゲームをプレイして動作を確認してみましょう!
- シーンを再生する
Unityエディタの 「▶(再生)」ボタン をクリックして、シーンを実行します。 - Cubeを左右に動かす
キーボードの「←(左矢印キー)」と「→(右矢印キー)」 を押して、Cubeを左右に動かしてみましょう。 - 色が変化するかチェック!
Cubeが動いているときに赤色になり、キーを離してCubeが停止すると青色に戻ることを確認してください。
期待される動作 ✅ キーを押してCubeを移動すると、Cubeが 赤色 に変わる
✅ キーを離してCubeが止まると、Cubeが 青色 に戻る
もし、期待した動作にならない場合は、次の点をチェックしてみてください。
トラブルシューティング
🔹 Cubeが動かない場合
- Cubeに Rigidbody が正しく追加されているか確認する
rb.velocity = new Vector3(input * 5.0f, 0, 0);
のコードがUpdate()
メソッド内に記述されているか 確認する
🔹 色が変わらない場合
cubeMaterial.material.color = Color.red;
のコードがif(movement > 0)
の内側にあるか確認するRenderer
が取得できているか、cubeMaterial = GetComponent<Renderer>();
のコードをStart()
メソッドに書いているかチェックする- Unityの コンソール(Console)ウィンドウ にエラーが出ていないか確認する
🔹 移動しているのに色が変わらない場合
Mathf.Abs(input)
の値が 0 になっていないか確認するGetAxisRaw("Horizontal")
ではなくGetAxis("Horizontal")
に変更して試してみる(滑らかな動きになる)

これらのチェックを行い、問題がある場合はコードを見直して修正してみてください!
よくある質問(FAQ)
- QCubeが動かない!
- A
- Rigidbodyがアタッチされているか確認
Update()
内でrb.velocity
を設定しているか確認
- QCubeの色が変わらない?
- A
Renderer
の取得が正しく行われているか確認if (movement > 0)
の条件を見直し、入力値が取れているかチェック
- Q移動速度を調整したい
- A
rb.velocity = new Vector3(input * 5.0f, 0, 0);
の「5.0f」の値を変更して調整