明日の自分へ

主にUnityのゲーム開発に関することを呟いていく予定

【Unityゲーム制作】自作ゲームを教材に制作講座風にリメイクする#2 (Unity1week202102)

自作ゲームを教材に、ゲーム制作の流れを眺める企画。
今回から具体的な制作に入っていきます。
こんにちは、M橋です。

2回目となる今回は、次の「1」と「2」に取り組む内容です。
 

  1. ステージを作成する
  2. ステージを回転させる処理を実装する
  3. プレイヤーの操作を受け付ける処理を実装する
  4. プレイヤーの操作と、ステージの回転を紐づける
  5. 球体を作成する
  6. 球体が落下する処理を実装する
  7. ステージとの衝突処理を実装する
  8. ゴールを作成する
  9. 球体がゴールに到達したことを判定する処理を実装する
  10. 障害物を作成する
  11. 球体との衝突処理を実装する
  12. 時間を計測するタイマーを作成する
  13. 時間を表示するUIを作成する

目標

前回の記事で、「重力の向きを変えることがプレイヤーの操作である」としました。
具体的にはステージを回転させる処理で実現します。
そのため、今回はステージを回転させる処理を実装することが目標となります。

と言いたいところですが、現時点では「ステージ」の具体例が良く分かっていません。
なので、最初は簡単な例として単純なオブジェクトを回転させることを目標とします。

手順

ざっくりと以下のようになります。

  1. オブジェクトをゲームシーンに配置する
  2. オブジェクトをインスペクタから回転させる
  3. オブジェクトをスクリプトから回転させる

順番に見ていきましょう。

オブジェクトをゲームシーンに配置する

Unityの基本操作に関しては、既に多くの方が記事にされているので、
この企画と関連の薄い部分は参考リンクを張っていくスタイルで行きます。*1

早速ですが、オブジェクトの配置操作を含めて
Unityの基本操作に関して解説をされている動画があるので、
基本操作から興味のある方はこちらをどうぞ。

www.youtube.com

この制作では「Cube」を4つ追加し、ステージの原型とします。
上下左右の長ーい板状にして、それっぽく配置した図が次の画面です。

f:id:e684-creaim:20210314130556p:plain
オブジェクトの作成

この図の赤枠部分が追加したオブジェクトです。
形状を変えるための「拡大・縮小」の操作や、「位置を変える」操作などは、
先ほどの基本操作の解説動画を参照ください。*2

オブジェクトをインスペクタから回転させる

今回の目的は回転操作ですね。
まず、オブジェクトが回転するとはどういうことか、
具体的な実装に移る前に確認しましょう。

オブジェクトには「位置」「回転」「拡縮」*3の情報があります。
上の解説動画では「位置」について触れていましたが、今回触る箇所は
「位置」の下にある「回転」の部分です。
「回転」の値を変更する方法は2通りあります。

こちらは直接値を指定する方法です。
オブジェクト同士で値を揃える等、数値を気にしたい場合に便利です。
一方、値を変化させたときのオブジェクトの挙動を見たい場合、
「位置」や「拡縮」と比べて、「回転」では難しい部分があります。
例えば、

  • 値が増えた時の方向は時計回りなのか、半時計回りなのか
  • Xの値を変化させるとどこに向けて傾くのか

など、変化している様子を見たい時に、この方法では分かりにくい時があります。

では、もう一つの方法はどうでしょうか。

こちらは、Unityエディタ上でマウスドラッグにより値を変化させる方法です。
インスペクタの「X」「Y」「Z」の文字の上で左クリックして
そのままドラッグすると値を変化させることができます。*4
画面端に行っても反対側につながってくれるので
マウスポインタの位置は気にしなくても大丈夫です。

画像では最初から「Z」の値を変化させていますが、
実際には思い描く回転がどんなものかを想定し、
それに対応するパラメータが「X」なのか「Y」なのか「Z」なのかを
確認することが重要です。

今回は画面に対して平行な回転になるように、
「Z」を変化させれば良いことが分かりました。

オブジェクトをスクリプトから回転させる

最初に、スクリプトに関しても同じ方が解説されているので
リンクを張っておきます。

www.youtube.com


さて、今回のスクリプトは次のように実装します。

【StageController.cs】

using UnityEngine;

namespace chapter1
{
    /// <summary>
    /// ステージの動きを制御するクラス
    /// </summary>
    public class StageController : MonoBehaviour
    {
        private float rotationSpeed = 5f; // 回転速度

        // Update is called once per frame
        void Update()
        {
            transform.Rotate(new Vector3(0f, 0f, rotationSpeed) * Time.deltaTime);
        }
    }
}

これをオブジェクトに適用するのですが、一旦その前に準備があります。
先に配置しておいたオブジェクト(ステージの原型)は4つで1組ですね。
そこで、それら4つのオブジェクトを1つのグループにまとめます。
空のオブジェクトを作成し、その子オブジェクトとすることでまとめられます。
こうすると、一纏めにしたオブジェクトが同じ原点を基準として
「移動」や「回転」が可能になります。*5

f:id:e684-creaim:20210314150730p:plain
Stageオブジェクトに集約

このようにしておいて、いよいよスクリプトを適用します。

f:id:e684-creaim:20210314141938p:plain
Stageオブジェクトにスクリプトをアタッチ
f:id:e684-creaim:20210314143633g:plain
ステージ全体が回転

一纏めにした親オブジェクトにスクリプトを適用することで、
子オブジェクトの4つが一緒に回転出来ました。

まとめ

今回は、ゲームシーンにオブジェクトを配置して、
オブジェクトを回転させる部分について見ていきました。
実質的に制作の初回なので、内容はまだ非常に単純ですね。

次回はプレイヤーの操作を受け付ける処理について実装を進めます。
実は、もうこの辺りから当時はつまづき始めていました。
それについても次回触れたいと思います。
ポイントは、下の個所がなぜこのような実装になっているのか、です。

            transform.Rotate(new Vector3(0f, 0f, rotationSpeed) * Time.deltaTime);


それでは、ここまでお付き合いありがとうございました。

*1:どこまで書くべきかは悩ましいですね

*2:「6:52​ オブジェクトの移動」あたりが参考になります

*3:Unityエディタでは、それぞれ「Position」「Rotation」「Scale」と表記されています

*4:回転に限らず、多くのパラメータでこのようなドラッグによる操作が出来ます

*5:非常に大雑把な説明です。オブジェクトの親子関係の詳細は公式のリファレンスなどを参照ください。