UnityのC#の変数について【クラスと型】

前回はUnityでのスクリプトの実行順について解説しました。

この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。

<Youtubeでも解説始めました!>

この記事の内容は↓の動画でも解説しています。文章でわかりづらい場合は、是非こちらをご覧ください。

ゲームの作り方!#7【Unity入門講座】 変数について

<変数とは>

さて、プログラムを学んでいくにあたって様々なデータを取り扱うことになると思います。

一時的に保存しておきたい場合や色んなところにデータを渡したいなどなど、データを取り扱うにあたって、やりたい事、やらなくちゃいけない事がたくさんあります。

そんな時便利な物が変数になります。

とてもよく使う(というか基本中の基本になる)ので変数について詳しく見ていきましょう。

変数は箱のような物

さて、様々なデータを取り扱うのに便利な変数ですが、実際はどのような感じの物かというと、箱のようなものと覚えておいてください。

といってもよくわからないと思うので実際にみてみましょう。

int

↑なんかクラスの中に
int a = 1;
と書いてあります。このaが変数になります。

intというのは箱の形です。

aというのは名前です。今回は適当に名前をつけました。

これは「intの形をしている箱を作り、aという名前をつけました。そしてその箱に1を入れました」という意味になります。

型について

さて、変数はものを入れる箱と考えるといいよと言いましたが、箱には形があります。

この箱の形を「」と言います。

データは箱の形にあったものしか入りません。

↑の int a = 1;で「int」が箱の形と言いました。

このように型は変数の名前の前につけて宣言します。宣言することによって箱の形を決めているのです。

ではintはどのような形なのかというと、これは「整数型の箱」という意味になります。この箱には整数しか入りません。

なので↑は「整数が入る箱aを作り1を入れました」ということになります。

このように変数は○○が入る箱で、名前は自分で決めることができます。

この○○というのは箱の形だと思ってください。決められた形の物を入れることができるのです。

箱と例えましたが、実際はメモリ領域の事をさします。↑の宣言では「整数が入るだけのメモリ領域を確保しaと名付けました、その中に1を入れました。」ということになります。

変数は何に使うのか

じゃあ、この箱何に使うの?って話になるのですが、この箱があるととても便利です。

単純に状態を記録しておくことにも使えますし、↓のようにも使えます。

debug log int

classの中で、メソッドの外に書いてある変数全部のメソッドで使用することができます

なんかこれだとあまり意味がないのでこう変えてみましょう。

Convenience of variables

stringというのは文字列の箱です。文字の箱ではなく文字列の箱なので注意しましょう。
さて、やたら長い文章ですが、こんな長い文章Debug.Logの中にいちいち書くのはめんどくさいです。そこで変数に突っ込んでしまえば何回でも使い回すことができます。

Point

・変数は箱みたいな物だよ!
・箱には形があるよ!
・箱の形の事を型と言うよ!
・データを使い回したりできて便利だよ!

<変数の範囲>

メソッドの外に変数を書くと全部のメソッドで使う事ができると解説しましたが、メソッドの中で使う事もできます。

scorp

↑のようにメソッドの中に書く事もできます。メソッドの中に書いた場合は、そのメソッドの中でしか使う事ができません。

このように変数には有効範囲があります

変数名は基本同じ名前の物を使うことはできないのですが、変数の有効範囲が違えば同じ名前を使う事もできます。

この変数の有効範囲をスコープと言います。

また、このスコープは{ }で囲まれた範囲になるので、{ }の中に書いてある変数は{ }の中でしか使えません。

{ }内を有効範囲と書くと{ }の中ならどこでも使えそうですが、変数を書いた位置から下じゃないと使えないので注意してください。

メソッドの外に書いた変数はその限りではないのでこれも注意してください。

Point

・変数には有効範囲があるよ!
・有効範囲の事をスコープと言うよ!
・スコープは変数を書いた位置から } が書いてある位置までだよ!
・メソッド外に書いた変数は書いた位置に関係なくclass内で使う事ができるよ!

<基本的な型>

さて、ここで覚えておきたい基本的な型について紹介します。

型名入る形
int型整数
float型有効桁数7桁の浮動小数
double型有効桁数16桁の浮動小数
char型1文字
string型文字列
bool型真か偽か

まぁ、見ても覚えられないと思うので、こんな感じの型があるよってことを頭の片隅に置いておいて使いながら覚えるといいかなと思います。

浮動小数というのは、まぁ、今は普通に少数という認識でいいかなと思います。普通に使用する分には少数として使えます。

ここで注目していただきたいのは、「有効桁数」とか「1文字」「文字列」など、入るものは同じような物に見えるのに違うやつがいることです。

これは箱には大きさがあるという事でこういう風に分けています。

箱が大きければ大きいほどメモリを食います。

そのため、使用目的に合わせて箱の形を変える必要が出てきます。メモリ的な観点から言うとなるべく小さな箱を使いたいところですが、箱が大きければ使えるデータ量が増えるのでどのように使うのかと言う点を考える必要があります。

まぁ、今はなんとなく大きさがあると言うことを覚えておいてもらえれば大丈夫です。




<配列とは>

時に変数をたくさん用意したい時という場面があると思います。そういった場合、たくさん箱を用意してあげないといけないのですが、いちいち

int a = 1;
int b = 2;
int c = 3;
//・・・(以下略)

と書いていては大変です。

そういった場合は配列というものを使うと便利です。

配列の便利さ

例えば3つの同じ種類の箱を用意したい場合は一々3つ宣言するのではなく

int[] a = new int[3];

↑のような感じで書くことができます。

これでint型の箱が3つあるという意味になります。

これの使い方は

型名[] 変数名 = new 型名[用意する数];

になります。

new新しく作成するという意味です。

↑の状態では箱を用意しただけですので中身を入れていきます。

int[] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;

と書きます。これで先ほどと同じように3つの箱に数字を入れることができました。

変数[何番目か] = 入れる値;

で箱の中に中身を入れる事ができます。ただし、この何番目かというのは1からではなく0から始まります

↑の例では3つの箱を用意していますが、0,1,2で3つの箱になっています。そのため

a[3];

と書くと、3つしか箱用意してないのに4つ目やんけという事でエラーになります。

またいっぺんに入れることもできて、

int[] a =  {1,2,3};

と入れても箱の中に値が入ります。

箱の箱・配列

この

int[] a = new int[3];

のaは値ではなく箱の箱として扱われます。

なんかややこしいですが、「a[番号]」が箱であって、「a」は[番号]が入る箱なわけです。

このようなに配列とは箱の箱の事をいいます。

そのため

int a = new int[3];
a = 1;

みたいなのはエラーになります。aは値ではないので。

ちょっと発展系になるのですが、箱をたくさん並べることもできます。

int[,,] a = new int[3,4,2];

↑のように書くと箱が3つの箱の中にさらに4つの箱があり、さらに2つの箱があるという意味になります。

Array

たくさんあったので書ききれなかったですが、○が値入れる事ができる箱とすると↑のような形になります。

一番上の箱がaでその中に3つ箱があって、さらにその中に4つ箱があって、さらにその中に2つ箱があって、その中に値を入れる事ができるよう感じです。

なんだかよくわからないという人はいづれ使うときになったら実戦で解説しますのでこんなものがあるよって事だけ覚えておいてください。

<クラスと変数>

「クラス(設計図)」を変数として使う

さて、前々回

transform.position += Vector3.right;

これを使ってCubeを右へ移動させてたと思うのですが

move

transformもpositionもrightも変数です。

これを理解するために、ちょっとここで今までのおさらいをしてみましょう。

今までのおさらい

・オブジェクト指向は「設計図」と「実体」と例えていました。

・class ○○○というのは、「これは○○○という名前の設計図ですよ」と言っていました。

・変数は箱のようなものだと例えていました。

・変数という箱には形があり、それを型と言います。

ここでポイントなのですが、「型」は設計図の形にする事ができます。

オブジェクト指向は設計図型の変数を使う事ができると言う事です。

これは↑で紹介した基本的な型とはちょっと扱いが違うので注意してください。基本的なデータを扱う型とクラスを元にした型があります。

Transform型とVector3型

さて、では先ほどの命令をじっくりみてみましょう。

transform.position += Vector3.right;

transformも変数、positionも変数、rightも変数になります。

これはどう言う事かと言うと

transform variable

という形になります。

+=が何かと言うのは次回解説します。

Transformは位置、回転、大きさの情報を保持するclass(設計図)です。(コンポーネントでもあります。というかコンポーネントは全てclassです。)

Vector3は3つの数字の情報を保持するclassです。(x,y,zなどを表すのに使います)

これらの形の箱を用意して、その中に値を入れているわけです。

このようにTransformVector3もclassなので設計図なのですが、その設計図を元にした形の箱を作ることができます。

Unityが最初から用意してくれているクラス

Transform型とVector3型なんて自分で作ってないよ?と思うかもしれませんが、これは

using UnityEngine;

と書いて、Unityの便利な機能を使えるようにしているからです。

usingで使える便利な機能というのは、初めから設計図として完成しているクラスの事になるわけです。

さてここでもう一度書いてある内容をみてみると、Transform型なのにtransformは頭文字が小文字になっています。(Vector3は大文字ですが)

transform.position += Vector3.right;

transformというのはTransform型の変数名前がtransformです。

この名前誰が決めたんだよって話なんですが、MonoBehaviourを継承しているからです。MonoBehaviourがtransformという変数を持っていて、継承しているから使えるわけですね。

正確にはMonoBehaviourが持っているわけではなく、MonoBehaviourも継承によってtransformを元のスクリプトから得ていてます

さて、ではpositionという変数はどっからきたんだって話なんですが、これはTransformという設計図Vector3型の箱「positon」を持っているからです。

Transform型の設計図の中にVector3の変数を定義しているから使えるのです。(Unityが予め便利に使えるように定義してくれています)

あなたが書いたclass(設計図)にTransform型の変数(箱)があり、名前をtransformと言います。その箱の中に更にVector3型の箱「positon」が入っています。マトリョーシカみたいですね。

Contents of class

↑のように箱の中に箱が入っている感じです。

プログラムはこのように設計図を作って、その設計図を利用した箱を用意して、その中に実体を入れて使うといった行いを頻繁にするので覚えておくといいでしょう。

クラス内の変数にアクセスするには

さて、transform.positionとしている事からわかると思いますが、クラス内の変数にアクセスするには「. 」を使用します

本来は変数(箱)にインスタンス(実体)を入れなければいけないのですが、今回はMonoBehaviourが自動でやってくれています。

ちなみに、Vector3.rightというのはUnityがあらかじめ中に(1,0,0)という実体を入れてくれているので何もしなくても最初から使えます。Vector3と言う変数は無いのでこれについては後々必要があれば解説していきたいと思います。

こんな感じでクラスで定義した変数にアクセスする事によって様々な計算やデータの取り扱いができるようになります。

ただし、変数が前々回紹介した「公開している変数」である必要があります。publicですね。この「公開」については後々解説していこうと思います。

<まとめ>

さて、ここまで色々解説してきましたが、なんだかよくわからないよという人は「設計図」「箱」「実体」っていう3つのワードをなんとなーく頭に入れながら、人のやっている事を真似していけばなんとなーくわかってくると思うので今はなんとなーくの理解で大丈夫です。

苦手な意識がある人もわからない人も、あーわからんと投げ出さずにとりあえずなんとなく真似てみましょう。

最後に今回出てきた覚えておいて欲しい型について書いておきます。

覚えておいて欲しい型(値を入れるもの)

・int・・・整数型
・float・・・有効桁数7桁の浮動小数点型
・double・・・有効桁数16桁の浮動小数点型
・char・・・1文字を表す型
・string・・・文字列を表す型
・bool・・・真か偽かを表す型

覚えておいて欲しい型(class型)

Vector3・・・x,y,zの3つの数字を便利に取り扱える型
Transform・・・位置、回転、大きさの情報を取り扱う型

Check

型名[] で配列というたくさんの箱を用意する事ができるよ!

<わからない事、質問等があれば>

このサイトの説明ではよくわからなかったとか、もっと知りたい事などがあれば

自分の Youtubeの動画にコメントで質問していただければ動画でお答えしようと思います。

文章同士のやり取りだと伝わりづらいし、ラリーに時間がかかりそうなので動画で回答します。

↓の動画が回答の一例になります。どの動画でもいいのでご遠慮なくコメントしてください

できたらチャンネル登録よろしくお願いします!




次回もプログラムの解説は続きますのでよろしくお願いします。




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