変数でデータを保存しよう【Unityスタートガイド6-4】

ゲームを作っていると、スコアやHP、移動の速さなど、いろいろな「数値」や「文字」を覚えておく必要があります。それを入れておく箱が変数!今回は変数の書き方と、Inspectorから値を調整する方法をご紹介します。

目次

この記事で学べること

  • 変数とは何か
  • 変数の宣言と代入の書き方
  • 主なデータ型(int / float / string / bool)の使い分け
  • public・private・[SerializeField]の違い
  • Inspectorで変数の値を変更する方法

前提知識

変数とは?データを入れる箱

変数の役割

変数とは、データを保存しておくための箱のようなものです。計算した結果や、ゲームの中で変わっていく値を覚えておけます。

  • ゲームのスコア
  • キャラクターの移動速度
  • プレイヤーの名前
  • ゲームオーバーかどうか

変数の例え

  • 箱の名前:変数名(例:score)
  • 箱の中身:保存されたデータ(例:100)
  • 箱の種類:データ型(例:整数を入れる箱)

一度箱にデータを入れたら、後でそのデータを取り出して使ったり、別の値に入れ替えたりできます。

変数の宣言と代入

変数の書き方

C#で変数を作る(宣言する)には、次の形で書きます:

データ型 変数名 = 初期値;

具体例:

int score = 0;              // 整数を保存する変数
float speed = 5.0f;         // 小数を保存する変数
string playerName = "勇者";  // 文字列を保存する変数
bool isAlive = true;        // true(はい)かfalse(いいえ)を保存する変数

変数の代入

宣言した変数に、後から値を入れる(代入する)こともできます:

int score;          // 宣言だけ
score = 100;        // 代入
score = score + 10; // 今の値に10を足して、また入れる(110になる)
score += 10;        // 上と同じ意味の短い書き方(120になる)

「=」は「等しい」ではなく、右側の値を左側の箱に入れるという意味です。最初はここで混乱しやすいので注意しましょう。

主なデータ型

int:整数を扱う

int playerLevel = 1;
int enemyCount = 5;
  • 用途:レベル、スコア、個数など
  • 例:playerLevel = playerLevel + 1;

float:小数を扱う

float moveSpeed = 5.0f;
float jumpHeight = 2.5f;
  • 用途:速度、高さ、時間など
  • 注意:数字の最後にfをつける(つけ忘れるとエラーになります)

string:文字列を扱う

string playerName = "勇者";
string message = "ゲームスタート!";
  • 用途:名前、メッセージ、テキストなど
  • 文字列は「”」で囲む
  • 「+」でつなげられる:message = "スコア: " + score;

bool:はい・いいえを扱う

bool isGameOver = false;
bool canJump = true;
  • 用途:状態の管理(オン/オフ、出来る/出来ない)
  • 値:true(はい)かfalse(いいえ)の2つだけ
  • boolは、次の6-5の記事で説明するif文と組み合わせて「ゲームオーバーならこうする」のように使います

Vector3:3つの数字をまとめて扱う

Unityでよく使う、X・Y・Zの3つの数字をまとめた型です。

Vector3 startPosition = new Vector3(0f, 1f, 0f);
  • 用途:位置、移動する向き、大きさなど
  • TransformのpositionもVector3です(6-8の記事で詳しく使います)

public・private・[SerializeField]

public:Inspectorに表示され、ほかのスクリプトからも使える

public float moveSpeed = 5.0f;    // Inspectorに表示される

private:このスクリプトの中だけで使う

private int currentScore = 0;     // Inspectorに表示されない
  • 何も書かない場合も、privateと同じ扱いになります

[SerializeField]:privateのまま、Inspectorに表示する

[SerializeField] private float jumpPower = 10.0f;   // Inspectorに表示される
  • Inspectorで調整はしたいけど、ほかのスクリプトからは勝手に変えられたくない、というときに使います
  • この講座では、Inspectorで調整したい変数は基本的に[SerializeField] privateで書きます
書き方Inspectorに表示ほかのスクリプトから使える
publicされる使える
privateされない使えない
[SerializeField] privateされる使えない

Inspectorで変数を変更する

変数の表示

スクリプトをゲームオブジェクトにアタッチすると、publicや[SerializeField]の変数がInspectorに自動で表示されます。moveSpeedは「Move Speed」のように、読みやすい形で表示されます。

Inspectorの値が優先される

スクリプトに書いた= 5.0fは、アタッチした瞬間の最初の値です。一度Inspectorで値を変えると、Inspectorの値の方が使われます。スクリプトの数字を変えたのに反映されない!というときは、Inspectorの値を確認しましょう(コンポーネントの「⋮」>Resetで、スクリプトの値に戻せます)。

実行中の変更

Playモード中でも値を変更できます。動きを見ながら速さを調整できるので便利です!ただし、5-2の記事で説明したとおり、再生を止めると元の値に戻るので注意しましょう。

実践サンプル:移動速度を変数で管理

キューブを前に進ませて、その速さをInspectorから調整してみましょう。

  1. Hierarchyで右クリック>3D Object>Cubeを作る
  2. Projectウィンドウで右クリック>Create>MonoBehaviour Script、名前を「VariableExample」にする
  3. 下のコードに書き換えて保存し、Cubeにアタッチする
  4. 再生して、Consoleとシーンビューを確認する
using UnityEngine;

public class VariableExample : MonoBehaviour
{
    // Inspectorで調整出来る変数
    [SerializeField] private float moveSpeed = 1.0f;
    [SerializeField] private string objectName = "テストキューブ";

    // スクリプトの中だけで使う変数
    private Vector3 startPosition;
    private float elapsedTime = 0f;

    void Start()
    {
        startPosition = transform.position;
        Debug.Log(objectName + "の最初の位置: " + startPosition);
    }

    void Update()
    {
        // 経過時間を足していく
        elapsedTime += Time.deltaTime;

        // 前(Z軸のプラス方向)に、1秒あたりmoveSpeedずつ進む
        transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
    }
}

このサンプルのポイント:

  • moveSpeed:Inspectorで速さを調整出来る。再生中に変えると、すぐに速さが変わります
  • objectName:ログに表示する名前
  • startPosition:最初の位置を覚えておく
  • elapsedTime:再生してからの時間。Inspectorには出ないので、確認したいときはDebug.Log(elapsedTime);を足してみましょう

注意点やヒント

変数名は、何のデータか分かる名前にしましょう

  • playerSpeed(良い)
  • x(何の値か分からない)
  • theSpeedOfThePlayerCharacter(長すぎる)

変数名は小文字から始めて、2つ目の単語から大文字にする(moveSpeed)のがC#の習慣です。

スライム

数字にfを付け忘れて、赤い波線が出た・・・

フェアリー

floatには「f」!これは誰でも最初に通る道だよ。エラーメッセージに「use an ‘F’ suffix」って出ていたら、それが合図だね

よくあるエラーと対処法

エラー:The name ‘変数名’ does not exist in the current context

  • 原因:変数を宣言していない、名前のつづりが違う、または使える範囲(スコープ)の外で使っている
  • 対処法:つづり(大文字・小文字も)を確認する。Startの中で宣言した変数はUpdateでは使えないので、両方で使うならクラスの先頭(関数の外)で宣言する

エラー:Literal of type double cannot be implicitly converted to type ‘float’; use an ‘F’ suffix

  • 原因:floatの変数に、5.0のようにfを付けない小数を入れようとした
  • 対処法:5.0fのように、数字の最後にfを付ける

エラー:Cannot implicitly convert type ‘float’ to ‘int’

  • 原因:int(整数)の変数に、小数を入れようとした
  • 対処法:変数をfloatにする。どうしても整数にしたい場合は(int)1.5fのように書く(小数点以下は切り捨て)

エラー:Inspectorに変数が表示されない

  • 原因:変数がprivateで[SerializeField]がついていない、またはスクリプトにエラーがあって読み込めていない
  • 対処法:[SerializeField]を付ける。Consoleに赤いエラーが出ていないか確認する

まとめ

  • 変数:データを保存するための箱。「=」は右の値を左に入れる意味
  • データ型:int(整数)、float(小数、fを付ける)、string(文字列)、bool(はい・いいえ)、Vector3(3つの数字)
  • [SerializeField] private:Inspectorで調整出来て、ほかからは変えられない。この講座の基本の書き方
  • Inspectorで変えた値の方が、スクリプトに書いた初期値より優先される

次のステップ

変数でデータを管理できるようになったので、次は「〜なら〇〇する」「〇回くり返す」を書く方法を学びましょう:

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (6件)

コメントする

目次