コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

UnityでUFOゲームつくったよの巻 ~前編

UnityでUFOゲームをつくろう

ここで言うUFOとは一般に言われている未確認飛行物体という直接の意味でなく、他人との干渉を避け続けた結果、地球の引力を離れ空中へと飛び立っていった自意識の様のことを指し、それをゲームと言う閉鎖的な空間に持ち込むことによって逃げ場を失った自意識は……。


えぇ……、ちょっと何を言っているのかわかりませんね。

そうしたわけでこれをやります

こちらのやつやります
2D UFO tutorial - Unity

どういった内容のものかあまり把握していないですが、多分2D版ボール転がしゲームなのではと信じてる。今回はアセットを取ってこいと最初に指示されるので最初にアセット入れます。

まずは何はともあれこの無限大な夢のあとの何もない空間にゲームオブジェクトを配置していきます。
f:id:andron:20180524065232p:plain

アセット利用のため、スプライトが標準でついて楽ちん。Fキーで全体を俯瞰できたんですね。とりあえず2Dスプライトはレイヤーで管理されるので "Sorting Layer" でレイヤー順を管理することになるらしい。
f:id:andron:20180524070651p:plain


基本オブジェクトの配置が終えましたので、プレイヤーを動かすスクリプトをゴリゴリ書いていきます。
プレイヤー

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {
    public float speed;             //プレイヤーの移動スピードを格納する Float 変数
    private Rigidbody2D rb2d;       // 2D Physics に必要な Rigidbody2D コンポーネントへの参照を格納します。

    // イニシャライライゼーションにこれを使います。
    void Start()
    {
        //Rigidbody2D コンポーネントへの参照を取得、格納して、 Rigidbody2D コンポーネントへアクセスできるようにします。
        rb2d = GetComponent<Rigidbody2D> ();
    }
    //FixedUpdate は決められた間隔で呼び出され、フレームレートとは関係ありません。物理演算のコードをここに置きます。
    void FixedUpdate()
    {
        //現在の水平入力を float moveHorizontal に格納します。
        float moveHorizontal = Input.GetAxis ("Horizontal");
        //現在の垂直入力を float moveVertical に格納します。
        float moveVertical = Input.GetAxis ("Vertical");
        //2 つの格納 floats を使って新しい Vector2 変数の動きを作成します。
        Vector2 movement = new Vector2 (moveHorizontal, moveVertical);
        // movement に speed を乗じたものを伴う Rigidbody2D rb2d の AddForce 関数を呼び出します。
        rb2d.AddForce (movement * speed);
    }
}

これでこうなるらしい。

f:id:andron:20180524074928g:plain
動いたー。 ※プレイヤーがぐるぐる回ってるのは、僕のほうで勝手に混入させたコードの影響です。


このままだと衝突の判定ができていないので、背景の四隅に衝突判定を追加します。なんというか…地味な作業だ……。
f:id:andron:20180524080438p:plain


ついでにカメラの設定をします。プレイヤーとカメラに親子関係をつけて横着すると下のような感じになります。回転する謎機能を追加したのもあいまって操作する人間の三半規管にダイレクトアタックするゲームができました。僕的にはこれはこれで悪くないと思うのですが*1、一応練習なのでカメラのスクリプトをいじっていきます。


f:id:andron:20180524082441g:plainf:id:andron:20180524083555g:plain
左:親子関係、右:コード

カメラ

using UnityEngine;
using System.Collections;

public class CompleteCameraController : MonoBehaviour {
    public GameObject player;       //プレイヤーゲームオブジェクトへの参照を格納する Public 変数
    private Vector3 offset;         //プレイヤーとカメラ間のオフセット距離を格納する Public 変数

    // イニシャライゼーションに使用ます。
    void Start () 
    {
        //プレイヤーとカメラ間の距離を取得してそのオフセット値を計算し、格納します。
        offset = transform.position - player.transform.position;
    }  
    // 各フレームで、Update の後に LateUpdate が呼び出されます。
    void LateUpdate () 
    {
        //カメラの transform 位置をプレイヤーのものと等しく設定します。ただし、計算されたオフセット距離によるずれも加えます。
        transform.position = player.transform.position + offset;
    }
}


そういった感じでカメラの制御をすることができました。

次回は収集オブジェクトの設定をやっていきます。本当は前後編に分けるつもりはなかったんですが、思っていたよりも画像を多用しすぎたので急遽分けることにしました。それでは次回またお会いしましょう。



後編へつづく

*1:悪意しかない