#3 自機を動かせるようにする

2Dシューティング
このブログは、趣味でプログラミングを勉強中の筆者が、実験を繰り返しながら、WordPressの使い方の練習も兼ねて、備忘録のように記事を残していくものです。Unityのバージョンは6000.0.32f1です。

画面に三角形を表示できたのですが、これをずっと眺めていても面白くありません。ユーザーの入力によってキャラクターが動き回らなければ、ゲームとは言えません。今回は、この三角形を動かせるようにしましょう。

今回はちょっと手順が多くなります。

今回のゴール

三角形(自機)を動かせるようにする

ゲームオブジェクトの名前を変える

まずは、三角形の物体の名前をTriangleからPlayerに変えましょう。これが自機です。地味ですって?見かけは後でどうとでもなりますので、このまま進めます。

左側のヒエラルキーのTriangleを右クリックして、名前を変更をクリックして、Playerに変えましょう。これで、ゲームオブジェクトの名前を変えることができました。この作業はこれから頻繁に行うので、覚えましょう。何回もやっていれば自然に覚えるとは思いますが・・・。

今は気にしなくて構いませんが、この画面には、他にもMain CameraGlobal Light 2Dのゲームオブジェクトも最初から配置されています。どちらも消すと困ることになる(画面に表示されなくなる)ので、削除しないようにしましょう。

スクリプト用のフォルダを作る

今回のゴールを達成するためには、コードを書いていかなければいけません。まずは、コード(スクリプト)をまとめて管理するためのフォルダを作成しましょう。

画面下のAssetsの空いているところで右クリックして、作成フォルダと進みます。できたフォルダの名前を変更しました。名前はお好みでいいと思います。今回はScriptsとしました。

基になるスクリプトを生成する

できたフォルダをダブルクリップして開きます。今度は、そのフォルダの中で右クリックして、出てきたコンテキストメニューで、作成MonoBehaviourスクリプトをクリックします。できたスクリプトのファイルの名前をPlayerControlに変更します。すると、このファイルはPlayerControl.csという名前になります。このファイルをダブルクリックして開くと次のようなコードがあらかじめ生成されます。

PlayerControl.cs

これはC#というプログラム言語のファイルです。一つずつ意味を理解していきましょう。と言っても、基本的なC#の構文の意味から説明するとなると、このページではとても足りません。ここでは、ざっくりとした解説をするので、それで分からないところが出てきた場合は、別のサイトか書籍で学ぶ必要があります。

これはPlayerControlというクラスに関するファイルです。クラス名とファイル名が一致していることに注目してください。これが一致していないとまずいようです。公式マニュアルにはこう書いてあります。

クラス名とファイル名が一致しないとゲームオブジェクトにアタッチされたスクリプトコンポーネントは無効となります。

スクリプトの作成と使用 - Unity マニュアル
ゲームオブジェクトの動作はアタッチされた Component (コンポーネント) により制御されます。Unity ビルトインのコンポーネントは多目的に使用できますが、独自のゲーム機能を実装するにはそれ以上が要求される場合があります。Unit...

特に意図がない限り、クラス名とファイル名は一致させるようにしましょう。

スクリプトの構造

基本的には、これから作るスクリプトのひな形は上記のような構造になっています。詳しく見ていきましょう。

これは、おまじないだと思ってください。この一文を書くことによってUnityのスクリプトで必要な、いろいろなことをやってくれます。

PlayerControlはクラスの名前です。: MonoBehaviourを付けることによって、ゲームオブジェクトにアタッチできるようになります。省いてもエラーにはなりませんが、アタッチできなくなります。ゲームオブジェクトへのアタッチについては、この後説明します。{から}までの間に、クラスでの処理を書きます。クラスとは処理をまとめるものというぐらいで理解しておいて下さい。詳しいことを知りたい方は、ネットで調べれば多くの情報が手に入るでしょう。とにかく、クラス=学級のことだと考えると後々混乱しますので、そのイメージは捨てましょう。

//以降はコメントとして扱われるので、Start is ・・・は、処理に影響しません。純粋に人間が読むための文です。大体こんな意味です。

Start関数は、MonoBehaviourが生成された後、Update関数の初回実行前に、1回だけ呼ばれます。

MonoBehaviourとは、今の段階では、およそゲームオブジェクトに取り付けられたスクリプトのことだと思ってていいと思います。ゲームを実行するとPlayerのようなゲームオブジェクトやスクリプトが次々と生成されていき、全部作り終わったら各スクリプトそれぞれのStart関数を実行します。全部のStart関数を実行し終わったら、毎フレームそれぞれのUpdate関数を実行していきます。そんなイメージです。

ちなみに、オブジェクトに取り付けられたスクリプトはコンポーネントとも呼ばれます。コンポーネントはゲームオブジェクトに機能を追加することができるものです。Unityに元からあるコンポーネントの他に、スクリプトで独自のコンポーネントを追加することもできます。

前述しましたが、Start関数Update関数というものがあり、使い分ける必要があります。最初に一回だけ実行すればよいこと(初期化とか)はStart関数に、毎フレーム実行したいこと(移動処理とか)はUpdate関数に入れます。関数名の前のvoid戻り値の型で、この場合、この関数から返ってくる値はないという意味です。ということは、関数から値が戻ってくる場合があるということですが、今は深く気にしなくてよいと思います。

スクリプトに処理を書く

長々と前置きをしてきましたが、いよいよ移動処理を書いていきます。次のように、赤枠のコードを書き加えます。

Input.GetKey(KeyCode.LeftArrow)は、LeftArrowが押されたらフラグを立てる命令です。if ( )は、( )の中の式がフラグが立った状態であれば、それ以降の命令を実行するし、そうでなければ実行せずに次の行に制御を移す命令です。フラグが立った状態というのを、式が真(true)であるという言い方をしますので、今後はif (真ならば)~のように書きます。

式が真であるとは
  • 1+1=2 ・・・ ○
  • 1+1=3 ・・・ ×

左辺と右辺で、式が成立していることを真(true)、成立していないことを偽(false)と言います。

LeftArrowが押された状態ならば、transform.Translate(-0.05f, 0, 0)を実行することになりますが、transformはオブジェクトの位置や回転、大きさなどを司るコンポーネントです。それに対してTranslate(-0.05f, 0, 0)を実行する命令です。ピリオドでつなぐことで、~の中の~の中の~に対して処理をしていくことになります。

Translateは位置を変更する命令で、(x座標の変更値,y座標の変更値,z座標の変更値)を記述します。Translate(-0.05f, 0, 0)は、y座標とz座標はそのままで、x座標だけ現在の位置より0.05だけ減らしなさいという意味になります。この命令により、LeftArrowが押されると、transformが0.05だけ左に動くことになります。

詳しく書くと長くなるのですが、通常、小数の値には末尾にfをつけることになっています。

その下にはRightArrowが押された場合の処理が書いてあります。LeftArrowの時と同じようにRightArrowが押されたならば、transformのx座標が0.05増えることになり、右に0.05だけ動きます。

transformは位置や回転などを管理するコンポーネントですが、一体何の位置や回転などを表すのでしょうか。実は、transformの前にgameObjectが省略されており、これは、このスクリプトがアタッチされたゲームオブジェクトのことを指します。

ですので、このスクリプトはまだ何にもアタッチされていないので、ゲームを実行しても動きません。

ゲームオブジェクトにスクリプトをアタッチする

いよいよ、このスクリプトをゲームオブジェクトにアタッチする(取り付ける)時が来ました。ここまでの道のり、長かったです。このスクリプトは、Playerにアタッチします。

操作は簡単です。左側のヒエラルキーで、Playerオブジェクトをクリックして選択し、右側のインスペクタのコンポーネントを追加の下の空欄辺りに、PlayerControl.csをドラッグ&ドロップするだけです。

無事にアタッチできたら、おもむろに実行してみます。

今回のスクリプトは以下の通りです。エラーが出る場合は、何かが間違っています。

よくあるミスが、全角スペースを使ってしまったり、括弧や行末のセミコロンを付け忘れてしまったりというものです。

今回はここまでです。大変、お疲れ様でした。

コメント

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