マナビエンタただいまアップデート中!

【Unity】簡易的に車を走らせてみる

今回はUnityを使って車を走らせてみようと思います。

用いているAssetはこちら。POLYGON -Starter PackというAssetです。

参考 POLYGON -Starter Packunity Asset Store

無料のアセットですので、どなたでも使えると思います。(2020/12/11現在)

フィールドを作って車を設置

GameObject→3D ObjectからPlaneを選んで、適当に地面を作ります。

Asset StoreからPOLYGON -Starter Packをダウンロードして、Modelから、車のモデルをSceneにドラッグ&ドロップして車を設置します。

平面をただ走らせるだけではどのくらいの速さで動いているかわからないので、適当に木や家やサークルを置いて、速度や進んだ距離がわかりやすいようにします。

こんな感じにしたらセット完了です。

メインカメラを車の後方に設置

ちなみに、3人称で車を操作したいのでメインカメラを車の後方に設置します。

カメラをSceneビューと同じ画角にする方法
Command+Shift+F (Windowsの場合: Control+Shift+F)

カメラが車を追従するようにする

設置するだけだと、初期位置からカメラが動かなくなってしまうので、車の後方をカメラが追従するようにしたいですよね。

これについては、特にコード等必要なく、車のオブジェクトとメインカメラに親子関係を作ることで簡単に実装できます。

実際の作業はただメインカメラを車オブジェクトにドラッグ&ドロップするだけでオッケーです。

追従するカメラの設定方法
追従されるオブジェクトを親として、メインカメラに子の関係を持たせる。(車オブジェクトにメインカメラをドラッグ&ドロップする。)

コードを書いてみる

さあ、ではコードを書いてみます。

まだ筆者も初心者なので難しいコードは使わず、条件分岐のみで車の操作を実装してみます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CarMotion : MonoBehaviour
{
    public float speed = 0f; //速度の変数

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 mv = new Vector3(0f, 0f, 0f); //前後移動の初期化
        Vector3 rt = new Vector3(0f, 0f, 0f); //左右の回転の初期化

        float sign = -1f; //バック用の負の値

        if (Input.GetKey(KeyCode.A)) //Aでスピードアップ
        {
            speed += 0.1f;
        }
        if (Input.GetKey(KeyCode.S)) //Sでスピードダウン
        {
            speed -= 0.1f;
        }
        if (Input.GetKey(KeyCode.UpArrow)) //↑で前進
        {
            mv = new Vector3(0f, 0f, speed);
            transform.Translate(mv);
        }
        if (Input.GetKey(KeyCode.DownArrow)) //↓で後退      
        {
            mv = new Vector3(0f, 0f, 0.1f*sign);
            transform.Translate(mv);
        }
        if (Input.GetKey(KeyCode.RightArrow)) //右回転
        {
            rt = new Vector3(0f, 0.5f, 0f);
            transform.Rotate(rt);
        }
        if (Input.GetKey(KeyCode.LeftArrow)) //左回転
        {
            rt = new Vector3(0f, 0.5f*sign, 0f);
            transform.Rotate(rt);
        }
    }
}

かなり簡易的ではありますが、これで一応加速して走ります。

初期化の時点で、どの軸に対しても移動量を0としているので、”A”を押すまでは前進できないようになっています。(後退はできる。)これは、”A”を押すことでエンジンがかかるようにしたかったためです。後退ができるのは後退のスピードがアクセルに依存しないようにしているためです。(エンジンかかってないのに後退ができるのはおかしいとか言わないでね!)

GetKeyメソッドの注意点

GeyKeyはキーボードのキー入力を受け取るメソッドなのですが、実はこのコードだと問題があります。GetKeyの仕様を完全には理解していなかったために、“A”を押した時間だけスピードアップするようになってしまっていました。

なので、”A”を押した時の判定を、「押した瞬間から」ではなく「キーを離した瞬間」にするために、GetKeyの代わりにGetKeyUpを用います。

if (Input.GetKeyUp(KeyCode.A)) //Aでスピードアップ 
{ 
    speed += 0.1f; 
} 
if (Input.GetKeyUp(KeyCode.S)) //Sでスピードダウン 
{ 
    speed -= 0.1f; 
}

これで”A”を押している間ではなく、”A”を離した瞬間になったため、急加速をしないようになりました。はじめにGetKeyを使っていた時は、キーボードを普段通りに押せば1段階速くなると思っていたので、いきなり画面外に吹っ飛んでいった時は笑いました。

参考文献

今回参考にさせていただいた記事を載せています。

【Unity】カメラの位置をシーンビューと同じにする方法

【Unity】カメラでキャラクターを追従する方法
参考 カメラでキャラクターを追従する方法とは?Samurai Blog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA