【Unity】覚えておくと便利なプログラム
今回の記事では、Unityでゲーム作りをしていく中で、これを覚えておけばかなり実践的になるだろうと思うスキルについて、一部説明していこうと思います。
ゲーム作りを始めたい方などにわかりやすく解説していきますので、とりあえず流し見してみてください。
その前に、まずは、変数というものについて基礎知識を身に着けてもらいますので、ご了承ください。
それでは解説していきます。
変数について
プログラミングでは、変数という概念をたくさん使います。
変数とは、簡単に言えば、ひとつのデータを持っておく箱のようなものです。
そして、その箱の中に入れるデータは自由に変えられます。
・変数の宣言
変数を用いるためにはまずは変数を”宣言する”必要があります。
コンピュータに対して、こういう変数を使いますよーと宣言しなければ、使うことはできません。
宣言の仕方としては、以下のようになります。
変数の型 変数名 = データ;
専門用語の羅列を見せられても意味が分からないと思いますので、一つ一つ説明していきます。
まず、変数を宣言するときは、使う変数の型というものを決める必要があります。
どういうことかといいますと、例えば、扱いたいデータが1や2,-2などの整数の場合、int型を用いります。
そのほか、実数を扱うのならfloat型などを用いります。
変数名は、最初は決まっていませんので、自分で決めて使うことができます。
ただし、変数名には、予約語と呼ばれる、ifやwhileなどのすでに定義されている意味のある文字列は名前にすることができませんので、気を付けてください。
データについてですが、データは、設定した変数の型に合わせたデータである必要があります。
例えば、int型を設定したのにも関わらず、0.1や5.23といった少数を変数に格納することはできないということです。
これらを踏まえて具体例を紹介します。
int a = 5;
上のように書くと、aという変数に5が格納されているという意味になります。
そのほか、
float b = 10.5f;
string c = "ハロー";
といった宣言の仕方があります。
※実は、変数を宣言するとき、必ずしもデータを決める必要はありません。変数名だけの宣言も可能なのです。
※変数名については、自分の好きな任意の文字列で構いません。
・様々な変数の型
では、ここで、変数を宣言する際のよく使う型を軽く紹介しておきます。
・整数型
まずは整数型です。
変数の中には、整数を入れて使うことができます。
宣言には、intを書く必要があります。
int a = 5;
・実数型
次に浮動小数点型と呼ばれる型についてです。
宣言には、主にfloatを使います。
これで実数を扱うことができるようになります。
実数を扱う場合は、データの後ろに f をつけておく決まりになっていますので、忘れずにつけておきましょう。
float a = 5.00f;
実数を扱う型はもう一つあります。
それはdouble(ダブル)です。
floatの倍の精度を持っているという代物ですが、場合によって使い分けるとよいでしょう。(ほとんどの場合がfloatで済ませますが。笑)
double a = 5.00f;
・文字型
文字を扱う変数の型に、char型と呼ばれるものがあります。
この型では、1つの変数当たり1バイト(8個スペースがあると思ってください)分格納できるのですが、1バイトに格納できる文字は1文字だけになります。
ですので、char型を単体で使う場合は、1文字だけの簡単なデータしか扱えないということになっています。
しかし、char型の変数でも、配列という機能を使えば、複数の文字をまとめて扱うこともできるようになります。
配列についてはいつか解説していこうと思います。
このように宣言しましょう。↓
この時、一文字だけを格納する場合は、' (シングルコーテーション)で囲んであげましょう。
char a = 'a';
もしくは、このように書くと、複数の文字を格納できます
この時は、“(ダブルコーテーション)で囲みます。
char a[] = "あいうえお";
なお、「あ」や「い」などの、いわゆる全角文字は、2バイト文字といい、単体のchar型変数では格納できません。(char単体は1バイト)
ですので、上記のa[]のように、配列という機能を使って、1バイト分のスペースを2こ集めることで全角文字の格納を可能にしています。
・ゲームオブジェクト型
急にUnityのことをぶっこんでいきます笑。
unityでは、普段のプログラミングで使用する型の変数よりも、圧倒的にこのゲームオブジェクト型という型の変数を使います。
ゲームを作っていく中で、ステージやキャラクターを設置していくこととなるのですが、その時ゲームオブジェクト型にキャラクターを代入(少し違和感ありますが)しますと、プログラムからそのキャラクターを動かしたり、当たり判定をつけたりすることができるようになるのです。
とりあえず、今は流していいですが、いずれUnityをやるのなら必ず知ることなので、今のうちに一応書いておきます。
まず、宣言についてです。
GameObject a;
一応、宣言した変数にオブジェクト(キャラクターとかステージの壁とかのこと)を当てはめる方法についても説明しておきます。
この↓の文は、たいていStart関数の中に書いておきます。
a=GameObject.Find("オブジェクトの名前");
少し変わった書き方だと思うでしょうが、こういうものだと思ってください。
・変数の使い方
ここからは、変数をどのように使っていけばいいのかを説明します。
・変数に値を代入する
まず、変数に別の値を代入するときの方法です。
下のように書きます。(aという変数が宣言されているという設定で)
a = 10;
代入については簡単で、そのままデータと変数を=でつなげばいいのです。
ただし、変数に代入するデータについては、変数の型と同じデータである必要があります。
・変数に1を加算していく
次に、変数に1を加算する方法についてです。
なぜわざわざ1を加算する必要があるのかという点について少し疑問を持った方もいるでしょうが、後々この1だけ加算するという考え方が大切なのだとわかってくると思いますので、今はとりあえず見ておきましょう。
この方法には主に2つありますが、後者の方法をできれば使ってほしいと思います。
a = a + 1;
まずこの方法についてですが、左側のaという変数に入れる値として、右側にa+1があります。
この場合、右から順に計算されていることがわかると思います。
まずaという値に1を足して(式の右側)、それらの値をaに入れることで(式の左側)、aに1を加算しているのです。
ここでやってはいけないパターンがあるのですが、それは、そのままa+1と書いてしまうパターンです。
一見正しいように見えるのですが、これは、数学の世界だけの話であり、プログラミングの世界では通用しません。
変数の中身を変えるときは、必ず「 = 」で左と右をつなぐ必要があります。
次の方法についてです。
a++;
先ほどのものと比べてかなりスタイリッシュになりました。
こちらのコードでも1を加算することができます。
「ついさっき、変数の中身を変えるときは=がいるっていったじゃないか!」
と思った方、申し訳ないです。
しかしこの方法は例外的に=なしが認められているので目を瞑ってください。
結局はどちらの方法がいいのか人によるのかもしれませんが、僕のおすすめは後者の方法です。
・変数に別の変数の値を代入
次です。
まずは、以下のコードを見てください。
int a;
int b=10;
a=b;
この時、aの値はいくつになるでしょうか、
実は、10になります。
=を使うとき、左の変数に右の変数の値が入ることを意味します。
そして、値が変わるのは左の変数のみで、右の変数は変化しません。
ちなみに、5=aのように、左側を普通の数字(定数)とすることはできません。
考えたら当たり前のことなのですが、左側の値としては、中身を変えることができる”変数”を置く必要があるためです。
・変数に加算する
変数の値にいくらか値を加算したいと思ったときは、決まった方法をする必要があります。
主に2つありますので、それぞれ紹介します。
まず、下のやり方についてですが、この方法ですと、aという変数に5を加算することができます。
a = a + 5;
先ほど1を加算する方法について説明しましたが、そのうちの前者の方法と同じになりますね。
次の方法です。
a += 5;
この方法も同じく5を加算することができますが、なかなかコンパクトに見えると思います。
どちらの方法を使用しても結果は同じですので、どちらか好きなほうをお使いください。
ちなみに僕のおすすめは後者の方法です。
Unity初心者がまず覚えておく関数
関数と項目名に書きましたが、そんなに難しく考えなくてもいいです。
関数とは、何かしらの機能を提供してくれるものという風に考えてください。
とにかく、見ていくうちにつかめてきますので、さっそく行きましょう。
・Translate関数
まず一番初めに、ゲームオブジェクトを動かすための関数を説明していこうと思います。
では、Unityを起動してください。
そして、ヒエラルキーウィンドウにCubeオブジェクトを追加し、Assetsフォルダの中にスクリプトを作成しましょう。
Cubeの座標はわかりやすいようにインスペクターからpositionの項目はすべて0にしておいてください。
スクリプト名はmoveとしておいてください(正直言うと名前はなんでもいいです笑)。
ここまでの工程についてまだあまり知らないという人は、軽くでいいので僕の講座記事をとりあえず2回目から読みましょう。↓
それではまずスクリプトを開いてください。
そして、ためしに Update() と書かれている部分(Update関数)の中に、次のようなコードを書いてみましょう。
transform.Translate(0.1f,0,0);
書けましたら、ヒエラルキーのcubeオブジェクトのところまでスクリプトをドラッグして持っていき、アタッチさせます。
ここでいったん、ゲームを実行させてみましょう。
するとどうでしょうか、キューブがスルーっと移動していったのが確認できると思います。
もし、そもそも画面にキューブが映らない場合は、キューブを選択し、画面右のインスペクターからpositionの項がすべて0になっていることを確認してください。
このように、主にキャラクターを移動させるときにとても便利な関数がtranslate関数というわけです。
ちなみに、”transform.”と書かれた部分がありますが、これについては初心者の場合必要な前提知識が多くなるため、今のうちは飾りとおもって書くようにしましょう。
関数について軽く説明しますと、
まず、Translateの後ろについている()の中に、数字が3つ入っていたと思いますが、これらのことを引数(ひきすう)と呼びます。
そして、先頭の1番目から順に、それぞれpositionのX,Y,Zに対応しており、引数に指定した数値分、座標を毎フレーム移動するようになっています。
ですから、例えば上に書いたコードでいくと、Translate(0.1f , 0 , 0);と書きましたので、毎フレーム0.1ずつXの方向に移動していったというわけです。
・Input.GetKey関数
次の関数についてですが、何やら難しそうなことが書かれていますね。
しかし、とても簡単で便利なので、あまり深刻に考える必要はありません。
一言でいうと、ゲームの中でも最も基本的な入力の方法になります。
といっても、文字を入力するわけではありません。
例えば、ゲーム機の十字キーを押すと、プレイヤーが動くと思いますが、あれと同じ感じのものとなります。
とりあえず、こういう風に書くということを知っておきましょう。↓
if(Input.GetKey(KeyCode.RightArrow))
{
//実行したい処理
}
まずは、
Input.GetKey(KeyCode.RightArrow)
と書かれた部分がありますが、この一文について一つ一つ分解しながら説明します。
まず、Input.GetKey()についてですが、これは、()の中で指定されているキーが押されているとき(Inputされているとき)に真の値を返します。
真の値という言葉が出てきましたが、分からなければとりあえず飛ばしてください。
次に、その()の中には、KeyCode.RightArrowと書かれていますね。
これは何となくわかると思いますが、KeyCodeという部分で、今からとあるキーを指定しますよ、という風に宣言し、そして次にRightArrow(右矢印キー)を指定しているのです。
つまり、まとめて言いますと、
Input.GetKey(KeyCode.RightArrow)
とは、「右矢印キーを押されたと判定したときに、真の値を返す」という意味になります。
先ほども出てきましたが、真の値を返すとは、何かを判定したときに、その結果が正しいものだったということを言っていると思ってください。
テストなどで、回答があっているかどうかを丸付けするのと同じです。
例えば、1+5=6は、正解ですので、真の値が返されます。(いまは覚えなくてもいいですが、不正解の場合は偽の値が返されます。)
その次に進みますと、if(){}と書かれた部分がでてきますが、これについて説明します。
これは、()の中に書かれている内容が真の時、つまり、正しいときに、{}で囲まれた中に書かれた処理が実行されるというものになります。
これはif文と呼ばれるもので、()の中に入れられたいわばテストの「判定結果」(真とか偽とかのこと)に応じて、中に通すか通さないか仕分けしてくれているものといえます。
これを踏まえたうえで一番初めのコードをみますと、
if(Input.GetKey(KeyCode.RightArrow))
{
//実行したい処理
}
このif文の()のなかは、右矢印キーが押されたときに「正解」となりますので、その時に{}の中の、”実行したい処理”を実行することができるようになります。
ここで、中の「//実行したい処理」の部分を、
transform.Translate(0.1f,0,0);
に置き変えてみるとどうでしょうか、
なんと、右矢印を押されたら、Xの方向に0.1ずつ進むというコードに変わりました!
プログラムを書きましたら、実際に実行してみましょう。
そして、実行中に右矢印キーを押してみてください。
右矢印キーが押されたときのみスーッとキューブが移動していくと思います。
この関数を応用すれば、ほかにも様々な機能を、押されたキーに応じて呼び出せるようになります。
一応、キーを指定する際のそれぞれのキーの名称を載せておきます。
なお、下の表の「書き方」についてですが、この列に書いてあるキー名を書くときは、”KeyCode.”を書いた後につなげて書くようにしてください。(KeyCode.Aのように)
指定したいキー | 書き方 |
スペースキー | Space |
上矢印キー | UpArrow |
下矢印キー | DownArrow |
左矢印キー | LeftArrow |
右矢印キー | RightArrow |
エンターキー | Enter |
右シフトキー | RightShift |
左シフトキー | LeftShift |
Aキー | A |
・オブジェクトをプログラムから回転させる方法
この項目では、オブジェクトを回転させる方法について説明します。
回転については、関数を使った簡単なものもありますが、そのほかやり方を知っていないとできない特殊なやり方もあるので、一応そちらのほうも説明します。
まずは、関数のほうからです。
・Rotate関数
この方法が一番簡単で、早速ですが、コードの書き方としては以下のようになります。Update関数の中に書いておきましょう。
transform.Rotate(0,0.1f,0);
少し前に見たtranslate関数の書き方に似ていますね。
これは同じコンポーネント(部品という意味ですが、ここではtransformのことを言っています)の中の機能となっています。
この回転についても、座標軸に沿って回転することになるので、座標移動と同じように座標に関する機能ということで同じ系統といえます。
同じコンポ―ネントの中に含まれる機能については兄弟のような関係だと思っておきましょう。
では、このコードが書けましたら、実行してみてください。
すると、ゆっくりですが、回転しているのがわかると思います。
割と使う機会が多く、便利な関数なので、覚えておきましょう。
・値を直接代入して角度を変更する方法
この方法は、少し面倒な手順を踏む必要があり、ただ回転させるだけなら使うことをお勧めできないものです。
じゃあわざわざ紹介するなよと言われそうですが、面倒な一方で、実は、この方法でしか実現できないことがあるのです。
それは、ある特定の角度にセットするということです。
先ほどの関数では、オブジェクトを回転させることはできました。
しかし、よく考えると、「Xを軸に145度に設定」といったことはできません。
特定の角度にセットするというのは、たとえばゲームオーバーになったときに、ぐちゃついたステージを元に戻す際に使う機会がないこともないでしょう。
たとえばぐるぐる回る棒をステージにおいていたのなら、ゲームオーバーと同時に所定の角度までその棒を持ってくる必要があります。
そうした場合に用いる技術がこの項で紹介するものとなります。
方法としては、オブジェクトの角度を直接指定するというイメージです。
では、その角度を直接指定する方法ですが、以下のようなコードになります。
transform.rotation=Quaternion.Euler(0,5.0f,0);
rotationは、transformコンポーネントの要素の一部でもあります。
変数の節でも同じような形を説明したと思いますが、角度に値を直接”代入”しているかのような書き方になっっていることがわかると思います。
しかし、rotationというのは、変数と同じ扱いができるわけではありませんので、Quaternion.Eulerという特殊な機能を使って代入しているというわけなのです。
それでは実際にこの方法を使って回転するところを見ていこうと思います。
まずは、”public class “と書かれている部分が上のほうにあると思いますので、その下の { のすぐ下のところに以下のコードを書いてください。
float t=0;
書けましたら、今度はUpdate館数の中に以下のコードを書きましょう。
t+=Time.deltaTime;if(t>=1){ transform.rotation=Quaternion.Euler(0f,30f,0f);}
本来は、tという変数を宣言する必要や、Time.deltaTimeという奇妙な機能を使わずとも、角度の値を直接変えることは可能なのですが、今回に限り、角度が変わったのがわかりやすいように時間差を出すという意味でいろいろ準備しているわけです。
一応説明しておくと、
Time.deltaTimeは、経過した時間を求めてくれる機能となり、それをtという変数に加算することで、tが1を超えた時に、1秒が経過したと判定することができるようになっています。
難しいと思った方は飛ばしても問題ありませんので、とりあえず書きましょう。
ここで大事なところはQuaternion.Euler()のところだけです。
では、書けましたら、実行ボタンを押してみてください。
しばらく待ち構えますと、ちょうど1秒後くらいに少し右のほうに向きが変わったと思います。
これを応用して、変数をQuaternion.Euleでそのまま代入していけば、その変数を毎フレーム少しずつ加算するだけで回転を実装することができます。
a += 0.1f;
transform.rotation=Quaternion.Euler(0f , a , 0f);
めんどくさいですけどね笑。できないこともないということです。
最後に
ここまで非常に長い文章お疲れさまでした。
今回紹介したプログラムはほんの一部にすぎません。
もっとお教えしたい機能がたくさんありますが、さすがにこれ以上記事を長くしてしまいますとかえって迷惑になりますので、これで終わりにしようと思います。
今回学んだことを自由に生かしながら、独創的なゲームを皆さんが作ってくださることを期待しています。