前回はUnityでのスクリプトの実行順について解説しました。今回はプログラムでデータを取り扱う方法について解説していきます。
この解説は↑の動画でも解説しています。文章ではわかりづらいという人は是非ご活用ください。
この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。
<変数とは>
さて、プログラムを学んでいくにあたって様々なデータを取り扱うことになると思います。
一時的に保存しておきたい場合や色んなところにデータを渡したいなどなど、データを取り扱うにあたって、やりたい事、やらなくちゃいけない事がたくさんあります。
そんな時便利な物が変数になります。
とてもよく使う(というか基本中の基本になる)ので変数について詳しく見ていきましょう。
変数は箱のような物
さて、様々なデータを取り扱うのに便利な変数ですが、実際はどのような感じの物かというと、箱のようなものと覚えておいてください。
といってもよくわからないと思うので実際にみてみましょう。
↑なんかクラスの中に
int a = 1;
と書いてあります。このaが変数になります。
intというのは箱の形です。
aというのは名前です。今回は適当に名前をつけました。
これは「intの形をしている箱を作り、aという名前をつけました。そしてその箱に1を入れました」という意味になります。
型について
さて、変数はものを入れる箱と考えるといいよと言いましたが、箱には形があります。
この箱の形を「型」と言います。
データは箱の形にあったものしか入りません。
↑の int a = 1;で「int」が箱の形と言いました。
このように型は変数の名前の前につけて宣言します。宣言することによって箱の形を決めているのです。
ではintはどのような形なのかというと、これは「整数型の箱」という意味になります。この箱には整数しか入りません。
なので↑は「整数が入る箱aを作り、1を入れました」ということになります。
このように変数は○○が入る箱で、名前は自分で決めることができます。
この○○というのは箱の形だと思ってください。決められた形の物を入れることができるのです。
箱と例えましたが、実際はメモリ領域の事をさします。↑の宣言では「整数が入るだけのメモリ領域を確保しaと名付けました、その中に1を入れました。」ということになります。
変数は何に使うのか
じゃあ、この箱何に使うの?って話になるのですが、この箱があるととても便利です。
単純に状態を記録しておくことにも使えますし、↓のようにも使えます。
classの中で、メソッドの外に書いてある変数は全部のメソッドで使用することができます。
なんかこれだとあまり意味がないのでこう変えてみましょう。
stringというのは文字列の箱です。文字の箱ではなく、文字列の箱なので注意しましょう。
さて、やたら長い文章ですが、こんな長い文章Debug.Logの中にいちいち書くのはめんどくさいです。そこで変数に突っ込んでしまえば何回でも使い回すことができます。
<変数の範囲>
メソッドの外に変数を書くと全部のメソッドで使う事ができると解説しましたが、メソッドの中で使う事もできます。
↑のようにメソッドの中に書く事もできます。メソッドの中に書いた場合は、そのメソッドの中でしか使う事ができません。
このように変数には有効範囲があります。
変数名は基本同じ名前の物を使うことはできないのですが、変数の有効範囲が違えば同じ名前を使う事もできます。
この変数の有効範囲をスコープと言います。
また、このスコープは{ }で囲まれた範囲になるので、{ }の中に書いてある変数は{ }の中でしか使えません。
{ }内を有効範囲と書くと{ }の中ならどこでも使えそうですが、変数を書いた位置から下じゃないと使えないので注意してください。
メソッドの外に書いた変数はその限りではないのでこれも注意してください。
<基本的な型>
さて、ここで覚えておきたい基本的な型について紹介します。
型名 | 入る形 |
int型 | 整数 |
float型 | 有効桁数7桁の浮動小数 |
double型 | 有効桁数16桁の浮動小数 |
char型 | 1文字 |
string型 | 文字列 |
bool型 | 真か偽か |
まぁ、見ても覚えられないと思うので、こんな感じの型があるよってことを頭の片隅に置いておいて使いながら覚えるといいかなと思います。
浮動小数というのは、まぁ、今は普通に少数という認識でいいかなと思います。普通に使用する分には少数として使えます。
ここで注目していただきたいのは、「有効桁数」とか「1文字」「文字列」など、入るものは同じような物に見えるのに違うやつがいることです。
これは箱には大きさがあるという事でこういう風に分けています。
箱が大きければ大きいほどメモリを食います。
そのため、使用目的に合わせて箱の形を変える必要が出てきます。メモリ的な観点から言うとなるべく小さな箱を使いたいところですが、箱が大きければ使えるデータ量が増えるのでどのように使うのかと言う点を考える必要があります。
まぁ、今はなんとなく大きさがあると言うことを覚えておいてもらえれば大丈夫です。
<クラスと変数>
「クラス(設計図)」を変数として使う
さて、前々回
transform.position += Vector3.right;
これを使ってCubeを右へ移動させてたと思うのですが
transformもpositionもrightも変数です。
これを理解するために、ちょっとここで今までのおさらいをしてみましょう。
・オブジェクト指向は「設計図」と「実体」と例えていました。
・class ○○○というのは、「これは○○○という名前の設計図ですよ」と言っていました。
・変数は箱のようなものだと例えていました。
・変数という箱には形があり、それを型と言います。
ここでポイントなのですが、「型」は設計図の形にする事ができます。
オブジェクト指向は設計図型の変数を使う事ができると言う事です。
これは↑で紹介した基本的な型とはちょっと扱いが違うので注意してください。基本的なデータを扱う型とクラスを元にした型があります。
Transform型とVector3型
さて、では先ほどの命令をじっくりみてみましょう。
transform.position += Vector3.right;
transformも変数、positionも変数、rightも変数になります。
これはどう言う事かと言うと
という形になります。
+=が何かと言うのは次回解説します。
・Transformは位置、回転、大きさの情報を保持するclass(設計図)です。(コンポーネントでもあります。というかコンポーネントは全てclassです。)
・Vector3は3つの数字の情報を保持する構造体(クラスと似たようなものでこちらも設計図の一種だと思ってください)です。(x,y,zなどを表すのに使います)
これらの形の箱を用意して、その中に値を入れているわけです。
このようにTransformもVector3も設計図(設計図としての種類が違いますが)なのですが、その設計図を元にした形の箱を作ることができます。
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」が入っています。マトリョーシカみたいですね。
↑のように箱の中に箱が入っている感じです。
プログラムはこのように設計図を作って、その設計図を利用した箱を用意して、その中に実体を入れて使うといった行いを頻繁にするので覚えておくといいでしょう。
クラス内の変数にアクセスするには
さて、transform.positionとしている事からわかると思いますが、クラス内の変数にアクセスするには「. 」を使用します。
本来は変数(箱)にインスタンス(実体)を入れなければいけないのですが、今回はMonoBehaviourが自動でやってくれています。
ちなみに、Vector3.rightというのはUnityがあらかじめ中に(1,0,0)という実体を入れてくれているので何もしなくても最初から使えます。Vector3と言う変数は無いのでこれについては後々必要があれば解説していきたいと思います。
こんな感じで設計図で定義した変数にアクセスする事によって様々な計算やデータの取り扱いができるようになります。
ただし、変数が前々回紹介した「公開している変数」である必要があります。publicですね。この「公開」については後々解説していこうと思います。
<まとめ>
さて、ここまで色々解説してきましたが、なんだかよくわからないよという人は「設計図」「箱」「実体」っていう3つのワードをなんとなーく頭に入れながら、人のやっている事を真似していけばなんとなーくわかってくると思うので今はなんとなーくの理解で大丈夫です。
苦手な意識がある人もわからない人も、あーわからんと投げ出さずにとりあえずなんとなく真似てみましょう。
最後に今回出てきた覚えておいて欲しい型について書いておきます。
次回もプログラムの解説は続きますのでよろしくお願いします。