top of page
  • 執筆者の写真menow

初心者のためのゲーム制作講座 #4


前回は物体の表示と、ついでに物理演算の重力加速度、当たり判定を使いました。

では今回は、前回表示した物体を動かしてみましょう。

前回の最後の状態で保存していれば、このような画面が開けたと思います。

それでは、物体に処理を書いて動かしてみましょう。

画面下部のAssetという欄で右クリックをすると、このようなものが表示されると思うので、その中の「Create→C# Script」を選択してください。

その際に名前はわかりやすいものにしておくと、後々編集するときに見つけやすく楽です。

私は今回「Object Move」という名前にしました。

では、今度は、デフォルトのテキストエディタの設定です。

Unityの「Edit→Preferences」を開き、

「External Tools」を開きます。

「External Tools」の欄の一番上の「External Script Editor」から、インストールしてあるVSを選択します。

設定後、ダブルクリックで作ったスクリプトを開くと、VSで開けるかと思います。

Unityはゲームエンジンであると最初に言ったとおり、ある程度プログラミングの雛形が書かれています。

それでは、所々説明を挿みながら内容を確認していきましょう。

プログラミングの中身

まずは一番上に書いてある、「using ... ;」というものですが、これは勉強のときに使う参考書のようなもので、「このスクリプトではこの本を見ながら作業するよ。だからそれに沿った文を書いてね」といった具合に、どのようなプログラミングを書くか宣言しているところです。

たとえば、Unityで「UI」をいじるときは「using UnityEngine.UI」という文を追加しなければいけません。

そしてその次の「public class ...」は、大きな箱だと思ってください。そして、「class」の後は、スクリプトと同じ名前でないとUnity側でエラーを吐かれます。

その下には英語で説明が付いている通り、実行部分が書いてあります。

上の「void Start ()」というほうは、スクリプトが読み込まれてから最初に一度だけ実行されます。

さらにその下の「void Update ()」というほうは、フレームに一度実行されます。60fpsでは1秒間に60回実行されます。

似ているものに「void FixedUpdate」というものがありますが、これは固定フレームに一度実行されます。

大抵のプログラミングは60fpsに固定してビルドしたりすることで色々な環境でも実行条件が同じになるように後々フレーム固定をするので、力を加えるなど以外では、あまり使いません。

ちなみに、「void ... ()」というのは小さい箱の目印で、自分でも勝手に作れますし、任意のタイミングで呼び出すことも可能ですが、それはまた後ほど。

オブジェクトを動かす

では、オブジェクトを動かすにあたって、前回オブジェクトに追加した「Rigibody」の値をスクリプトからいじる必要があります。

これは、「特定のキーが押されたとき」のようにタイミングを指定して変更を加えるために文を書いているだけです。変更自体は前回同様、Unityの「Inspector」から変更が可能です。

まず、「Rigidbody」をいじるわけですから、いじる本体を呼ばなくては始まりません。

「void Start ()」の上の空欄に「Rigidbody rb;」と書いてください。

意味としては、Rigibodyの状態を「rb」という文字に置き換えただけです。

次に、「void Start ()」に「rb = GetComponent<Rigidbody>();」と書いてください。

これで「rb」という文字に「Rigidbody」の状態を格納ました。

このように置き換える際は、短めの文字のほうが書くときに楽ですが、ある程度意味がわかるようにしないと、後々見直しながら変更しないといけなくなってかえって面倒です。

今回の「rb」は単に「Rigidbody」の略です。

これでこのスクリプトが貼り付けられたオブジェクトの「Rigidbody」を操作できます。

ここまでが状態の取得という下準備です。

次に、特定のキーが押されたときに力をその方向にかけるように書いてみましょう。

まずは、力の強さを表す「Force」を決めましょう。これはForceという名前でなくても良いですが、わかりやすい名前を付けることを心がけましょう。

「void Start ()」の上の空欄に、「public float Force;」を追加しましょう。

「public」は他のスクリプトで参照や変更できるような変数にしただけです。

反対に「private」も存在し、これは他のスクリプトで参照、変更ができません。

ただし、冒頭の「class」に限っては、Unityで参照できなくなってしまうので、「private」に変更してはいけません。

ここで新しく「Force」という入れ物を作りました。

「float」は文字通り「小数」のことを言います。

他には、「string」は「文字」を格納でき、「int」は「整数」を格納でき、「bool」は「真偽」を格納できます。

次に、「void Update ()」の下に、「void FixedUpdate ()」を作りましょう。

力を継続的に加えるときには固定フレームのほうが良いのです。

その「void FixedUpdate」の中に、「rb.AddForce(Vector3.forward*Force);」と書いてください。

「Rigidbody」を格納した「rb」の「AddForce」に「3次元ベクトルで前方方向の力を加える」という内容です。

では、Unityに戻ってこのスクリプトをオブジェクトにドラッグしてみましょう。

このようにスクリプトが右側の「Inspector」に追加されたのがわかると思います。

まだ実行しても力は加わっていません。正確には「0」加わっています。

スクリプトの「Force」とういところの数字を変更してみてください。

たとえば「10」にすると、物体が遥か前方に飛んでいくのが確認できると思います。

後はこれを応用して「キーの押された方向に移動する」というものが作れます。

再びスクリプトに戻り、スクリプトを書いていきます。

ただし、「If」を「void FixedUpdate ()」の中で使うことは避けたほうが良いです。

一定時間で呼び出すと、指定時間内で判定が繰り返し、動きがガタガタになってしまうことがあります。

そこで、新しく「void Start ()」の上の空欄に「private bool fmove」を作りましょう。

「fmove」は私が適当に考えた名前です。意味は「forwardmove」の略です。

同様に左右なども作ってみてください。

「private bool fmove」

「private bool bmove」

「private bool rmove」

「private bool lmove」

の4つを私は使います。

「void Start ()」の中で、全ての「bool」の初期値を「false」に設定して置いてください。

では「void Update()」の中に処理を書いていきます。

「If」については以前お話したので省きます。

「if (Input.GetKey("up"))

{

fmove = true;

}

if (Input.GetKeyUp("up"))

{

fmove = false;

}

これは、上の「If」で「↑」を押している間「fmove」を「true」にし、下の「If」で「↑」を離したときに「fmove」を「false」にしています。

これをそれぞれやると、

こうなります。

これを実行すると、キーボードのキーを押した方向に球が移動するものが完成しました。

今回はいよいよ骨格とも言えるオブジェクトの移動を行いました。

これにて初心者のためのゲーム制作講座は終了です。

読了ありがとうございました。お疲れ様でした。

ゲームの制作の基礎はこれにて終了ですが、ゲームを作るにはそのほか色々なものが必要になります。

次回はその導入から入りたいと思います。

ではまた次回。

閲覧数:39回0件のコメント

最新記事

すべて表示

夜光星

博士の助手を務める僕に、ある日博士から電話がかかってきた。聞き取りにくい電子音の向こう側でもそのしわくちゃの頬に切れ目が入るほどに笑っていることがわかるほど嬉々とした様相が容易に想像できる電話であった。博士の電話曰く空を、雲の向こう側を飛べる船ができたとのことであるがあくまで研究助手として手を貸している僕にはよくわからない話だったのでとりあえず研究所に足を運ぶこととなった。 研究所につき博士を呼ぶ

bottom of page