UnityUnityメモ

【Unity C#】移動中のみ実行する処理を作ろう!色が変わるスクリプト解説

Unity

1. はじめに

ゲームを作っていると、「オブジェクトが動いているときだけ特定の処理を実行したい!」と思うことはありませんか? 例えば、キャラクターが移動している間だけ足音を鳴らしたり、車が走っているときだけエンジン音を鳴らしたりすることが考えられます。

そこで、この記事では 「オブジェクトが移動している間だけ色を変えるスクリプト」 を作成しながら、この仕組みを学んでいきます!具体的には、Cubeが動いている間は赤、止まっていると青になる処理 をC#スクリプトで実装します。

初心者でも理解しやすいように、Rigidbody を活用してスクリプトを書き、物理的な動きを考慮した実装 で進めていきます。

Unityの基本操作やC#スクリプトに少しでも触れたことがあれば大丈夫!一緒に作ってみましょう!




2. 環境準備

まずは、Unityでオブジェクトを作成し、スクリプトを適用する準備をしましょう。以下の手順に沿って環境を整えていきます。


① 新しいUnityプロジェクトを作成

まず、Unityを開き、新しい 3Dプロジェクト を作成します。プロジェクト名は自由ですが、例えば「MoveColorChange」など分かりやすい名前をつけると良いでしょう。


② Plane(平面)を配置

次に、Cubeを移動させるための地面として Plane を作成します。

  1. Hierarchy(ヒエラルキー)ウィンドウで右クリック
  2. 「3D Object」→「Plane」 を選択
  3. Inspector(インスペクター)ウィンドウ でスケールを変更
    • Scale(スケール)を X=5, Z=5 に設定(大きめの床を作る)

③ Cube(キューブ)を配置

移動するオブジェクトとして Cube を追加します。

  1. Hierarchyウィンドウで右クリック
  2. 「3D Object」→「Cube」 を選択
  3. Position(位置)を調整
    • Position(ポジション):X=0, Y=0.5, Z=0(床の上に配置)



④ Rigidbody(リジッドボディ)の追加

Cubeを移動させるために、 Rigidbody を追加します。

  1. HierarchyウィンドウでCubeを選択
  2. Inspectorウィンドウの「Add Component」をクリック
  3. 「Rigidbody」を検索し、追加
  4. Rigidbodyの設定を調整
    • Use Gravity(重力を使う) → チェックを外す(床に落ちないようにする)
    • Constraints(制約)タブを開く
      • Freeze Rotation(回転を固定)X、Y、Z にチェック(Cubeが回転しないようにする)

⑤ カメラの調整(オプション)

デフォルトのカメラではCubeが見づらい場合、カメラの位置を調整しましょう。

  1. Hierarchyウィンドウで「Main Camera」を選択
  2. 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. スクリプトの作成

  1. プロジェクトウィンドウを開く
  2. 右クリック →「Create」→「C# Script」 を選択
  3. スクリプトの名前を 「CubeScript」 に変更
  4. 作成したスクリプトを 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つの準備を行います。

  1. cubeMaterial にRendererを取得
    • GetComponent<Renderer>() を使って、Cubeの Renderer(見た目を管理するコンポーネント)を取得
    • この Renderer を通じて、マテリアルの色を変更できる
  2. rb にRigidbodyを取得
    • GetComponent<Rigidbody>() を使って、Cubeに設定した Rigidbody を取得
    • rb を通じてCubeの動きを制御できる



2. Update() メソッド:移動処理

input = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector3(input * 5.0f, 0, 0);

Update() メソッドでは、毎フレーム以下の処理を行います。

  1. Input.GetAxisRaw("Horizontal") で移動の入力を取得
    • "Horizontal"左(Aキー)または右(Dキー) の入力を取得
    • Input.GetAxisRaw はキーを押した瞬間に1か-1の値を取得できる
  2. 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. 動作確認

それでは、実際にゲームをプレイして動作を確認してみましょう!

  1. シーンを再生する
     Unityエディタの 「▶(再生)」ボタン をクリックして、シーンを実行します。
  2. Cubeを左右に動かす
     キーボードの「←(左矢印キー)」と「→(右矢印キー)」 を押して、Cubeを左右に動かしてみましょう。
  3. 色が変化するかチェック!
     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)

Q
Cubeが動かない!
A
  • Rigidbodyがアタッチされているか確認
  • Update() 内で rb.velocity を設定しているか確認
Q
Cubeの色が変わらない?
A

Renderer の取得が正しく行われているか確認 if (movement > 0) の条件を見直し、入力値が取れているかチェック

Q
移動速度を調整したい
A

rb.velocity = new Vector3(input * 5.0f, 0, 0); の「5.0f」の値を変更して調整

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