【ゲーム開発のためのC#入門講座・基礎学習編】変数と型を覚えよう【#4】

1.0_C#基礎学習編

今回学習するのはプログラミングの基礎において最も重要な項目となります。

相変わらず表現が堅苦しいので少しとっつきづらいですが、内容はそこまで難しいものではないです。あまり気負わずに学習していきましょう!

ということでついに変数の登場です。

変数とは?

変数とは何らかのデータを格納しておける記録装置のことです。

また、変数には任意の名前をつけることができます

早速具体例を見てみましょう。

int result = 5 + 10;

これは「5 + 10」の計算結果を「result」という名前の変数に格納するコードです。

実際に計算結果がきちんと格納されているか、コンピュータに出力させてみましょう。

public class Hello{
    public static void Main(){
        int result = 5 + 10;
        System.Console.WriteLine(result);
    }
}
出力エリア

15

このように、変数はデータを格納したり、格納したデータを参照したりできます

注意して欲しいのは、格納したデータを取り出している訳ではないということです。

取り出してしまうと空っぽになってしまいますが、変数の場合は違います。CDに入れた音楽は何度でも再生できるように、一度格納したデータは何度でも参照することができます。

public class Hello{
    public static void Main(){
        int result = 5 + 10;
        System.Console.WriteLine(result); // 1回目
        System.Console.WriteLine(result); // 2回目
    }
}
出力エリア

15
15

また、変数はデータを上書きすることもできます

public class Hello{
    public static void Main(){
        int result = 5 + 10;
        // ↓この時点のresultの値(15) + 5の結果を上書きしてます
        result = result + 5;
        System.Console.WriteLine(result);
    }
}
出力エリア

20

何度でもデータの読み書きができる名前つき記憶装置、それが変数なのです。

ちなみに変数にデータを入れることを代入といいます。

数学にも代入と呼ばれるものがありましたよね。何らかの数値をxやyにあてはめて計算するやつです。

数学の代入

x=2のとき、2x+5の値を求めよ

数学ではxやyに数値をあてはめるだけでした。が、プログラミングでは文章や独自に定義した情報など、あらゆるデータを変数に代入することができます

変数の便利ポイント

例えば、通常攻撃を行った場合とスキルを使った場合で、それぞれダメージ量がいくらになるか算出したいとします。

算出したいこと

主人公の攻撃力10から敵の防御力5を引いた値が通常攻撃のダメージ。
スキルを使った場合は通常攻撃の2倍のダメージとなる。
①通常攻撃のダメージはいくつ?
②スキルのダメージはいくつ?

これを変数を使わずに計算した場合、下記のようなプログラムになります。

public class Hello{
    public static void Main(){
        System.Console.WriteLine(10 - 5); //①通常攻撃ダメージ
        System.Console.WriteLine((10 - 5) * 2); //スキルダメージ
    }
}

同じことをやっている箇所がありますよね?

攻撃力10から防御力5を引いて通常攻撃のダメージを算出している箇所です。

スキルが通常攻撃の2倍のダメージなら、一度だけ通常攻撃のダメージ量を計算して、それに掛ける2した方が効率いいですよね。

ただ、コンピュータはこれまでもお伝えしてきた通り、与えられた命令を上から順番に実行していくことしかできません。だから「これ一度だけ計算すればええやん」なんて気を利かせてくれることはありません。

そこで変数の出番です。

public class Hello{
    public static void Main(){
        int normalDamage = 10 - 5;
        System.Console.WriteLine(normalDamage); //①通常攻撃ダメージ
        System.Console.WriteLine(normalDamage * 2); //②スキルダメージ
    }
}

あらかじめ計算した通常攻撃のダメージ量を変数に格納し、その変数に格納された値を2倍にしてスキルのダメージ量を計算するようにしました。

この方が一回計算するだけでいいから効率がいいし、名前がついたことでやりたいこともわかりやすくなっていいですよね。

このように、変数には、

  • 何らかのデータを一時的に保存しておくことができる
  • 保存したデータを使って計算や処理を実行することができる
  • 人間にもわかりやすい意味のある名前をつけることができる

というメリットがあります。

とても便利な機能なのですが、ひとつだけ注意しなければいけないことがあります。

それは変数のを明示しなければいけないということ。

変数の型って?

変数の型とは、その変数で扱えるデータ種類のことです。

前回の記事で、C#では文章を扱う時に「"」で囲まなければならないということを学習したかと思います。理由は下記の通りでしたね。

例えば「1 + 1」と命令した時に、「1 + 1」をコンピュータに計算させたいのか、「1 + 1」という文章を表示させたいのか、判断がつかないですよね。
コンピュータは機械なので、そういう曖昧な命令には対応できません。
そのため、厳密に「文章なのかどうか」判別できるようにしてあげなければいけないことから、このルールが定められています。

同じ理由で、その変数で扱うデータがどんな特徴や性質をもっているのか教えてあげないと、コンピュータはそれをきちんと処理することができないんです。

だから、この変数はこういう特徴や性質のデータを入れるものだよーっていう情報をコンピュータに教えてあげる必要があります。

その情報こそがと呼ばれるものです。

今回作ったプログラムでいうと、intという部分が型になります。これは整数を扱うデータ種類です。

// ↓このコードは、int型のnormalDamageという名前の変数に
//  指定の計算結果を格納してね、という意味の命令になります
int normalDamage = 10 - 5;

この型を間違えると、コンピュータは正しく処理が出来なくなり、エラーを吐きます。

試してみましょう。

public class Hello{
    public static void Main(){
        // ↓型を「int」じゃなくて「string」にしてます
        string normalDamage = 10 - 5;
        System.Console.WriteLine(normalDamage); //①通常攻撃ダメージ
        System.Console.WriteLine(normalDamage * 2); //②スキルダメージ
    }
}
出力エリア

Compilation failed: 2 error(s), 0 warnings
Main.cs(3,31): error CS0029: Cannot implicitly convert type int' tostring’
Main.cs(5,34): error CS0019: Operator *' cannot be applied to operands of typestring’ and `int’

「int」という型を指定していた部分を「string」に変更したところ、エラーが出てしまいました。

このように、C#というプログラミング言語では変数を扱う際、そのデータ種類に応じて明示的に型を指定する必要があります。こういうプログラミング言語のことを静的型付け言語といいます。

反対に明示的に型を指定しなくても、コンピュータの方で何とかしてくれるプログラミング言語もあって、そちらは動的型付け言語と呼ばれています。

え、じゃあ動的型付け言語のがよくない?

と思うかもしれませんが、静的型付け言語にはそれはそれで意味や価値があります。それはいずれ解説する予定なので、今は「C#では変数を使う時に、明示的に型を指定する必要があるんだな」というところだけ理解してもらえればOKです。

string型って何?

先程intの代わりに使ったstringという型は文章を扱うデータ型です。

つまりさっきのコードは、文章を入れるための変数に計算結果を格納しようとしたり、文章に対して掛け算を行おうとしたりしていたんですね。そりゃエラーが出る訳だ……。

なお、未経験者・初心者のためにこれまでずっと「文章」という風に表現してきましたが、プログラミングの世界では「文字列」といいます。

1文字がいくつも組み合わさって列をなしている、というニュアンスで「文字列」です。

今後はプログラミングらしく、文字列という表記で統一していきますね。

前回の記事で学習した通り、コンピュータにとっては「"」で囲んだものが文字列です。なので、string型に格納するデータは「"」で囲んだものって覚えてもらえればOKです。

string text = "Unityでゲーム作りたい!";

その他のルール

他にも変数にはいくつかルールがあるのでご紹介します。

入れ物だけ作ることも可

public class Hello{
    public static void Main(){
        // ↓最初に変数という入れ物だけ作っておいて、
        int result;
        // ↓後からデータを設定することもできるよ!
        result = 5 + 5;
        System.Console.WriteLine(result);
    }
}

型を指定するのは最初だけでOK

public class Hello{
    public static void Main(){
        // ↓ここで型をコンピュータに教えてあげているので、
        int result = 5 + 10;
        // ↓以降は型を指定する必要はないよ!
        result = result + 5;
        System.Console.WriteLine(result);
    }
}

名前が重複する変数はNG

public class Hello{
    public static void Main(){
        // ↓ここでresultという変数を作っているので、
        int result = 5 + 10;
        // ↓以降、同じ名前の変数を作ろうとするとエラーになるよ!
        int result = 25 + 30;
        System.Console.WriteLine(result);
    }
}
出力エリア

Compilation failed: 1 error(s), 0 warnings
Main.cs(6,13): error CS0128: A local variable named `result’ is already defined in this scope

Unityでの活躍ポイント

変数や型は、Unityに限らず、プログラミング言語自体の核となる要素のひとつです。そのため、Unity自体が大量の変数を扱っていることから、あらゆるところで活躍しますというのが正直なところなのですが、それがわかるコード例をご紹介します。

transform.position = new Vector2(Screen.width / 2, Screen.height / 2);

まだ説明していない要素があるので、一部単語の意味だけ説明します。

transform.positionというのはオブジェクト(キャラクターやイラストなど)の位置を扱うデータ型の変数です。Screen.widthは画面の横サイズが格納された変数で、Screen.heightは画面の縦サイズが格納された変数。

つまりこれは特定のオブジェクトの位置を画面中央に移動させるコードという訳です。

このように、自分で定義した変数だけでなくUnity自体が持つ色んな変数も利用しながら、それらを組み合わせた処理でゲームを動かしていく、というのがUnityでのゲーム開発となります。

実践演習

それでは学習した変数と型を使ってみましょう。

演習①int型の変数を使ってみよう!

仕様通り動作するよう、皆さんの手でプログラムを完成させてください。

仕様

下記の計算結果を変数「result」に格納し、出力エリアに格納された値を表示させてください。

5 * 10 / 2

テンプレート
public class Hello{
    public static void Main(){
        // ↓変数「result」に計算結果を格納しよう!
        
        // ↑ここまで
        System.Console.WriteLine(result);
    }
}

演習②string型の変数を使ってみよう!

実は文字列に対して+演算子を用いると文字列同士を結合してくれる命令に変化します。

// 結合されて"あいうえおかきくけこ"というひとつの文字列になる
"あいうえお" + "かきくけこ";

これを使って二つの文字列を結合し、出力エリアに表示させてみましょう。

仕様

下記の文字列をそれぞれの変数に格納してください。
①ひとつ目の変数「text1」:"Unityで"
②ふたつ目の変数「text2」:"ゲーム作りたい!"
その上で、①と②を結合した文字列を出力エリアに表示させてください。

テンプレート
public class Hello{
    public static void Main(){
        // ↓変数「text1」に文字列を格納しよう!
        
        // ↑ここまで
        // ↓変数「text2」に文字列を格納しよう!
        
        // ↑ここまで
        // ↓二つの変数を結合した文字列を表示させよう!
        System.Console.WriteLine();
    }
}

答え合わせ

演習①の答え

public class Hello{
    public static void Main(){
        // ↓変数「result」に計算結果を格納しよう!
        int result = 5 * 10 / 2;
        // ↑ここまで
        System.Console.WriteLine(result);
    }
}
出力エリア

25

演習②の答え

public class Hello{
    public static void Main(){
        // ↓変数「text1」に文字列を格納しよう!
        string text1 = "Unityで";
        // ↑ここまで
        // ↓変数「text2」に文字列を格納しよう!
        string text2 = "ゲーム作りたい!";
        // ↑ここまで
        // ↓二つの変数を結合した文字列を表示させよう!
        System.Console.WriteLine(text1 + text2);
    }
}
出力エリア

Unityでゲーム作りたい!

まとめ

  • 変数とは何度でもデータの読み書きができる名前つき記憶装置のこと
  • 変数に何らかのデータを格納することを代入という
  • 変数の型というのは、その変数に格納できるデータ種類を表すもの
  • 代表的な型として整数を扱う「int」や文字列を扱う「string」がある
  • 文字列に対して+演算子を用いると文字列同士を結合してくれる

それでは、今回もお疲れ様でした!

また次の記事でお会いしましょう!

お借りした素材一覧

記事内の画像は下記サイト様の素材をお借りしています。

ありがとうございました!

かわいいフリー素材集 いらすとや (irasutoya.com)

Posted by 夕目紅