【ゲーム開発のためのC#入門講座・基礎拡張編】代入演算子を使ってみよう【#2】

2.0_C#基礎拡張編

代入演算子って?

実は今までもずっと使ってきました。

変数に値を入れる時、「=」という記号を使っていますよね。直感的に理解できるため説明していませんでしたが、実はあれも演算子です。

// ↓「=」という記号は演算子
int result = 5 + 10;

「=」は右辺の値や処理結果を左辺の変数に代入する演算子となります。

変数を使うには欠かせない演算子ですね。

また、これ以外にも複合代入演算子と呼ばれる演算子があります。

今回はこの複合代入演算子を学習していきましょう。

複合代入演算子って?

漢字が並ぶと圧迫感がありますが、これもかなり単純です。

複合代入演算子とは、計算と代入を一回でやってくれる演算子のことです。

百聞は一見に如かず、早速一覧を見てみましょう。

演算子命令使用例
+=AにBを足した値をAに代入result += 2
-=AからBを引いた値をAに代入result -= 2
*=AにBを掛けた値をAに代入result *= 2
/=AをBで割った値を代入result /= 2
%=AをBで割った余りをAに代入result %= 2

これまで説明してきた算術演算子と代入演算子だけだと、変数のデータを上書きする際、少し冗長な書き方をする必要がありました。

public class Hello{
    public static void Main(){
        int result = 10;

        result = result + 2;
        System.Console.WriteLine(result);

        result = result - 2;
        System.Console.WriteLine(result);

        result = result * 2;
        System.Console.WriteLine(result);

        result = result / 2;
        System.Console.WriteLine(result);

        result = result % 2;
        System.Console.WriteLine(result);
    }
}
出力エリア

12
10
20
10
0

複合代入演算子を使うと、同じことをもっとシンプルに記述することができます。

public class Hello{
    public static void Main(){
        int result = 10;

        result += 2;
        System.Console.WriteLine(result);

        result -= 2;
        System.Console.WriteLine(result);

        result *= 2;
        System.Console.WriteLine(result);

        result /= 2;
        System.Console.WriteLine(result);

        result %= 2;
        System.Console.WriteLine(result);
    }
}
出力エリア

12
10
20
10
0

きちんと同じ結果になりました。すっきりしてて見やすいですね!

複合代入演算子を使わずとも、先程のように算術演算子と代入演算子を組み合わせれば同じことができます。なので複合代入演算子は絶対に使わなければいけないというものではないです。

ただ、規模の大きいゲームになればなるほど、そのために必要なコード量は指数関数的に増えていきます。そういう時、簡略的に書く書かないで、思っている以上に生産性に大きな影響が出ます。

人生は有限ですから、皆さんの貴重な時間を有意義に活用するためにも、楽して書けるテクニックはぜひ活用していきましょう!

さて、それではせっかく複合代入演算子を覚えたので、計算に関わり合いが非常に深い型もついでに学習しましょう。Unityで恐らく最もよく使うデータ種類、float型です。

float型って?

float型は小数点以下を含む数値を表すデータ種類です。

int型は整数を扱うデータ種類なので、小数点以下の数値は扱えません。

試しに下記のコードを実行してみてください。

public class Hello{
    public static void Main(){
        int result = 3 / 2;
        System.Console.WriteLine(result);
    }
}
出力エリア

1

小数点以下が切り捨てられ、整数になっていますね。

対してfloat型は小数点以下の数値を扱うことができます。

public class Hello{
    public static void Main(){
        float result = 3f / 2f;
        System.Console.WriteLine(result);
    }
}
出力エリア

1.5

きちんと小数点以下も含めた数値が結果に表示されました。

数値の末尾にfがついていますが、これはこの数値をfloat型として扱ってください、ということをコンピュータに知らせる目印になります。この目印がないと小数点以下の数値計算はできないのでご注意下さい(整数だけの計算であればつけなくてもよいです)。

実は他にも注意点があるのですが、それはもっと後の回で解説します。

float型があればint型いらなくない?

float型は整数も扱えるし小数点以下の数値も扱えます

え、だったらint型いらんくない? と思われるかもしれません。

ただ、実はint型もfloat型も有効最大桁数というものが決まっています。そしてint型は小数点以下の数値を扱えない分、整数部分の有効桁数がfloat型よりも大きいのです。

有効桁数
int-2,147,483,648 ~ 2,147,483,647(圧倒的桁数)
float全体で7桁まで(整数が3桁なら、小数点以下は4桁まで)

だから必ずしもfloat型一択という訳ではないのです。

ここら辺の使い分けは慣れないとわりと面倒です。どうせなら整数も小数点以下の数値も扱えて桁数も無限に設定できる型がひとつだけあればいいのに、と思われるかもしれません。

この理由はC#が静的型付け言語である理由に繋がってくるので、いずれ解説しますね。

Unityでの活躍ポイント

float型はUnityで頻繁に使います。例えばキャラクターの座標(画面上の位置のこと)や画像の拡大率など、小数点以下の細かい調整が求められる場面が多いからです。

全部float型の項目

そしてこれらの項目を扱った計算や移動処理などで複合代入演算子も活躍します。

以前ご紹介したジャンプアクションでも、扱っている変数はfloat型で、計算では複合代入演算子「-=」を使っています。

float gravity; // Unity上から設定できるので、ここでは値を設定しない
float jumpSpeed; // Unity上から設定できるので、ここでは値を設定しない
​
// ジャンプボタンが押された時の処理
moveDirection.y = jumpSpeed;
animator.SetTrigger("jump");
​
……色々間に処理……
​
// 重力で少しずつ落下していく処理
moveDirection.y -= gravity * Time.deltaTime;

Unityでもし、

  • 小数点以下の計算をしたいのに整数になってしまった
  • 整数でよかったのに小数点以下の値がいっぱいついてきてしまった

などの問題にぶつかった時は、この数値の型が原因である可能性が高いです。しっかり覚えておくと、すぐに解決できそうですね!

実践演習

それでは実際に複合代入演算子とfloat型を使ってみましょう。

演習①

仕様

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

1を4で割る(小数点以下の計算が必要になる点に注意!)

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

演習②

仕様

複合代入演算子を使って、変数「result」の値に円周率3.14を掛けた値を「result」に上書きしてください。

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

答え合わせ

演習①の答え

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

0.25

演習②の答え

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

78.5

まとめ

  • 代入演算子「=」は右辺の値や処理結果を左辺の変数に代入する演算子
  • 複合代入演算子を使うと、計算と代入をまとめてできる
  • float型は小数点以下を含む数値を表すデータ種類
  • 有効桁数などの違いがあるため、float型一択という訳にはいかない

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

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

Posted by yuumekou