blockun dialy

同人ゲーム制作サークル「SaNa」のメンバーが書くゆるーいブログです。

Unityさわってみた(3D編)

こんにちは。
なんだか久しぶりに書いている気がます。soraです。

さて、超導入しかやってませんが、web編も一旦おしまいにして次は何をしようかーということで、渚さんに習いながらUnityを触ってみることしました。第一回は3Dということで、Unity手始めには恒例らしい、迷路ゲーム(のようなもの)をつくったので簡単にまとめておきたいと思います。

プロジェクト作成

Unityを起動してプロジェクトを作成します。今回は3Dゲームなので、下のタブを「3D」にして任意の名前で作成します。

f:id:moshisora:20160910114033p:plain

ステージをつくる

ではさっそくステージをつくります。ゲームを作るというと「あープログラミングかーー」とか「3D扱うのなんかやばそうだな」みたいな直感が働くんですが、GUIでぽちぽちと作ることもできるご時世になりました。さっそく迷路の壁や床を設置していきます。

床をつくる

新しい3Dオブジェクトをつくるときは、メニューから [GameObject] > [3D Objcet] の中にあるつくりたい形のオブジェクトを選択します。今回は床をつくりたいので Plane がよさそうです。

f:id:moshisora:20160910114535p:plain

選択すると、このようにSceneに追加されます。

f:id:moshisora:20160910114852p:plain

これからあとの工程で、壁やプレイヤーを設置するため、わかりやすい場所に置いておくのがよいので、画面右側の [Inspector] で場所と大きさを整えておきます。

f:id:moshisora:20160910115020p:plain

壁をつくる

では次に壁をつくります。床と同じように、メニューの [GameObject] > [3D Object] から、今度は [Cube] を選択します。(白の上に白で少し見にくいですが…)白色の箱がSceneに追加されます。これを迷路の壁にしたいので、[Inspector] で場所と大きさを調整していきます。

f:id:moshisora:20160910115657p:plain

こんな感じになりました。これを繰り返して迷路の壁をつくっていきます。地味な作業でした…。

f:id:moshisora:20160910115931p:plain

壁に色をつける

さて、壁は作成しましたが、白色ばかりでは見にくいので、壁に色をつけていきます。色をつけるには、まずマテリアルを作成します。メニューから、[Asset] > [Create] > [Material] を選択します。[Project] ビューに新しいマテリアルが追加されるので、ここでは名前を red としておきます。

f:id:moshisora:20160910120604p:plain

次に、このマテリアルの色を設定します。 red マテリアルを選択した状態で、[Inspector] の [Albedo] の項目をクリックすると、色選択ができるので、ここで好きな色を設定します。 red なので赤に設定しました。
マテリアルを作成したら、色を変更したいオブジェクトに作成した red マテリアルをドラッグ&ドロップで設定します。

f:id:moshisora:20160910120755p:plain

いい感じに赤くなったはず!

f:id:moshisora:20160910121522p:plain

プレイヤーをつくる

次に、キーボードで操作できるプレイヤーになるオブジェクトを作成します。壁の場合と同様に、メニューの[Game Object] > [3D Object] から、[Sphere]を選択します。わかりやすいように、前節と同じ手順で新しいマテリアル green を設定して、設置したSphereにドラッグ&ドロップして反映しておきましょう。あとは、[Inspector] で場所をスタート位置に設定して完了です。

プレイヤーが床にめり込まないように、高さには注意しましょう。

f:id:moshisora:20160910122202p:plain

物理演算を適用する

このままではプレイヤーが床や壁をすり抜けてしまうので、Unityに搭載されている物理演算機能をプレイヤーに反映します。

プレイヤーを選択した状態で、[Inspector] の一番下にある[Add Component] から、[Physics] > [RidigBody] を選択します。

f:id:moshisora:20160910123258p:plain

キーボード入力で操作する

次に、プレイヤーをキーボード入力で動かせるようにします。ここでようやくプログラムを書きます。

まず、メニューの[Assets] > [Create] > [C# script] を選択して、スクリプトを作成します。また、プレイヤーのオブジェクト(sphere)に作成したこのスクリプトをドラッグ&ドロップしてアタッチしておきます。このスクリプトにプレイヤーの動作をプログラムしていきます。ファイル名は Player にしておきます。↓をコピペすれば動くはず!

using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed;
    public Rigidbody rb;

    public GameObject Goal;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float translation = Input.GetAxis("Vertical");
        float rotation    = Input.GetAxis("Horizontal");

        rb.AddForce(rotation * speed, 0, translation * speed);
    }
}

public float speed のように、 public で変数を定義しておくと、UnityのInspectorから数値を代入できる上、デバッグ中でも変更が反映されるので、とても便利です。スクリプトの動作は単純なもので、 Input.GetAxis() で取得した水平方向・垂直方向の入力に対して、設定した speed をかけた分だけプレイヤーオブジェクトに AddForce() で力を加えて動かしています。

Start FixedUpdate 関数はUnityが呼び出す関数で、 Start は初期化時、 FixedUpdate は指定した特定の時間が経過する度に呼ばれる関数です。一定のインターバルで AddForce し続けることによってキーボード入力での移動をしています。

ゴールをつくる

では最後にゴールを作ります。オブジェクトの作成方法はこれまでと同じく、メニューから [Game Object] > [3D Object] > [Cube] で作成します。また、白では見づらいのでプレイヤーを作成した時に作った green マテリアルを反映します。自分はこのあたりに作りました。

f:id:moshisora:20160910132153p:plain

ゴールしたことを判定する

プレイヤーがゴールに到達したことを検知します。ゴール側の準備として、ゴールのオブジェクトを選択した状態で、[Inspector]の[Box Collider] にある [isTrigger] のチェックを有効にしておきます。

f:id:moshisora:20160910132418p:plain

次に、プレイヤーのスクリプトOnTriggerEnter() を追加します。このメソッドは、Triggerに設定された他のオブジェクトと当たった時に実行されるメソッドです。ここでは当たったことをログに出力しています。実際にゲームを作るときはこの部分にクリアしたときの処理を記述していくといいですね!
(設計としてはゴール側に判定処理をもたせたほうがスマートな気もしますが面倒なのでここではプレイヤーに…)

プログラムは全文を載せておきます。

using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed;
    public Rigidbody rb;

    public GameObject Goal;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float translation = Input.GetAxis("Vertical");
        float rotation    = Input.GetAxis("Horizontal");

        rb.AddForce(rotation * speed, 0, translation * speed);
    }

    void OnTriggerEnter(Collider other)
    {
        Debug.Log(other.gameObject.name);
    }
}

おわり

簡単にですが、Unity初心者がいろいろと教わりながらさわってみました。
つくったものが簡単というのもありますがC++/DirectXで書こうと思うと共通処理書くだけで結構げんなりするので、なかなか便利な時代になったものだなあと…。

個人的にはもっとプログラムでもりもりかきたい気持ちですが、どうやらそういう作り方もできそうとのこと。
(自分はプログラムしかかけないので)テキストと画像をいれればノベルゲーム作れる、みたいなテンプレート的なのを作れると面白いなーとちょっと妄想しています。(似たやつありそうですが!)

ということで次回は2Dゲームのほうにいってみます。では!