画面に三角形を表示できたのですが、これをずっと眺めていても面白くありません。ユーザーの入力によってキャラクターが動き回らなければ、ゲームとは言えません。今回は、この三角形を動かせるようにしましょう。
今回はちょっと手順が多くなります。
三角形(自機)を動かせるようにする
ゲームオブジェクトの名前を変える
まずは、三角形の物体の名前をTriangleからPlayerに変えましょう。これが自機です。地味ですって?見かけは後でどうとでもなりますので、このまま進めます。

左側のヒエラルキーのTriangleを右クリックして、 をクリックして、Playerに変えましょう。これで、ゲームオブジェクトの名前を変えることができました。この作業はこれから頻繁に行うので、覚えましょう。何回もやっていれば自然に覚えるとは思いますが・・・。
今は気にしなくて構いませんが、この画面には、他にも
や のゲームオブジェクトも最初から配置されています。どちらも消すと困ることになる(画面に表示されなくなる)ので、削除しないようにしましょう。スクリプト用のフォルダを作る
今回のゴールを達成するためには、コードを書いていかなければいけません。まずは、コード(スクリプト)をまとめて管理するためのフォルダを作成しましょう。


画面下のScriptsとしました。
の空いているところで右クリックして、 → と進みます。できたフォルダの名前を変更しました。名前はお好みでいいと思います。今回は基になるスクリプトを生成する
できたフォルダをダブルクリップして開きます。今度は、そのフォルダの中で右クリックして、出てきたコンテキストメニューで、PlayerControlに変更します。すると、このファイルはPlayerControl.csという名前になります。このファイルをダブルクリックして開くと次のようなコードがあらかじめ生成されます。
→ をクリックします。できたスクリプトのファイルの名前を
using UnityEngine;
public class PlayerControl : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
これはC#というプログラム言語のファイルです。一つずつ意味を理解していきましょう。と言っても、基本的なC#の構文の意味から説明するとなると、このページではとても足りません。ここでは、ざっくりとした解説をするので、それで分からないところが出てきた場合は、別のサイトか書籍で学ぶ必要があります。
これはクラス名とファイル名が一致していることに注目してください。これが一致していないとまずいようです。公式マニュアルにはこう書いてあります。
というクラスに関するファイルです。クラス名とファイル名が一致しないとゲームオブジェクトにアタッチされたスクリプトコンポーネントは無効となります。

スクリプトの構造
基本的には、これから作るスクリプトのひな形は上記のような構造になっています。詳しく見ていきましょう。
using UnityEngine;
これは、おまじないだと思ってください。この一文を書くことによってUnityのスクリプトで必要な、いろいろなことをやってくれます。
public class PlayerControl : MonoBehaviour
{
}
PlayerControlはクラスの名前です。: MonoBehaviourを付けることによって、ゲームオブジェクトにアタッチできるようになります。省いてもエラーにはなりませんが、アタッチできなくなります。ゲームオブジェクトへのアタッチについては、この後説明します。{から}までの間に、クラスでの処理を書きます。クラスとは処理をまとめるものというぐらいで理解しておいて下さい。詳しいことを知りたい方は、ネットで調べれば多くの情報が手に入るでしょう。とにかく、クラス=学級のことだと考えると後々混乱しますので、そのイメージは捨てましょう。
// Start is called once before the first execution of Update after the MonoBehaviour is created
//以降はコメントとして扱われるので、Start is ・・・は、処理に影響しません。純粋に人間が読むための文です。大体こんな意味です。
Start関数は、MonoBehaviourが生成された後、Update関数の初回実行前に、1回だけ呼ばれます。
MonoBehaviourとは、今の段階では、およそゲームオブジェクトに取り付けられたスクリプトのことだと思ってていいと思います。ゲームを実行するとPlayerのようなゲームオブジェクトやスクリプトが次々と生成されていき、全部作り終わったら各スクリプトそれぞれのStart関数を実行します。全部のStart関数を実行し終わったら、毎フレームそれぞれのUpdate関数を実行していきます。そんなイメージです。

void Start()
{
}
void Update()
{
}
前述しましたが、Start関数とUpdate関数というものがあり、使い分ける必要があります。最初に一回だけ実行すればよいこと(初期化とか)はStart関数に、毎フレーム実行したいこと(移動処理とか)はUpdate関数に入れます。関数名の前のvoidは戻り値の型で、この場合、この関数から返ってくる値はないという意味です。ということは、関数から値が戻ってくる場合があるということですが、今は深く気にしなくてよいと思います。
スクリプトに処理を書く
長々と前置きをしてきましたが、いよいよ移動処理を書いていきます。次のように、赤枠のコードを書き加えます。
using UnityEngine;
public class PlayerControl : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
//左矢印が入力されたら、自機を左に動かす
//右矢印が入力されたら、自機を右に動かす
}
}
Input.GetKey(KeyCode.LeftArrow)は、 が押されたらフラグを立てる命令です。if ( )は、( )の中の式がフラグが立った状態であれば、それ以降の命令を実行するし、そうでなければ実行せずに次の行に制御を移す命令です。フラグが立った状態というのを、式が真(true)であるという言い方をしますので、今後は のように書きます。
- 1+1=2 ・・・ ○
- 1+1=3 ・・・ ×
左辺と右辺で、式が成立していることを真(true)、成立していないことを偽(false)と言います。
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だけ減らしなさいという意味になります。この命令により、 が押されると、transformが0.05だけ左に動くことになります。

その下にはRightArrowが押された場合の処理が書いてあります。 が押されたならば、transformのx座標が0.05増えることになり、右に0.05だけ動きます。
の時と同じようにtransformは位置や回転などを管理するコンポーネントですが、一体何の位置や回転などを表すのでしょうか。実は、transformの前にgameObjectが省略されており、これは、このスクリプトがアタッチされたゲームオブジェクトのことを指します。
ゲームオブジェクトにスクリプトをアタッチする
いよいよ、このスクリプトをゲームオブジェクトにアタッチする(取り付ける)時が来ました。ここまでの道のり、長かったです。このスクリプトは、
にアタッチします。操作は簡単です。左側のヒエラルキーで、
オブジェクトをクリックして選択し、右側のインスペクタのコンポーネントを追加の下の空欄辺りに、PlayerControl.csをドラッグ&ドロップするだけです。
無事にアタッチできたら、おもむろに実行してみます。

今回のスクリプトは以下の通りです。エラーが出る場合は、何かが間違っています。
using UnityEngine;
public class PlayerControl : MonoBehaviour
{
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
}
// Update is called once per frame
void Update()
{
//左矢印が入力されたら、自機を左に動かす
if (Input.GetKey(KeyCode.LeftArrow)) transform.Translate(-0.05f, 0, 0);
//右矢印が入力されたら、自機を右に動かす
if (Input.GetKey(KeyCode.RightArrow)) transform.Translate(0.05f, 0, 0);
}
}
今回はここまでです。大変、お疲れ様でした。
コメント