見出し画像

初のチーム制作でUnityでマリオカートを作った時の話&カートの挙動を再現

こんにちは。「ねるねる」と申します。ゲーム業界に入るため、現在ゲーム制作の専門学校に通う1年生です。

今回は、学校の授業でUnityで既存のゲームを再現してみよう!となったので自分は「マリオカート」を再現することになりました。

今回はそのときの反省や一番大変だったカートの挙動を書き留めていきたいと思います。

注意
※自分のやったことをメモ程度に残しているので説明を飛ばしてしまうこともあるかもしれません。ごめんね(._.)
※自分も初めて制作するので無駄なことをしているかもしれません。参考程度になればと思います。

今回参考にさせていただいた記事

また、今回の目次になります。

  1. オブジェクトの配置とコンポーネント

  2. 車を動かすスクリプト

  3. 制作の反省や感想

1.オブジェクトの配置とコンポーネント

〇オブジェクトの配置

まずは、今回使用するオブジェクトを配置していきましょう。
今回は学校の課題でアップロードなどを目的としていないので3Dモデルを"Sketchfab"からモデル借りていきましょう。(車のモデル)

モデルをダウンロードしたらUnityに配置していきます。

先ほどダウンロードした3Dモデルと足場となるTerrainを設置します。

足場と車を設置

〇コンポーネントをアタッチ

次にコンポーネントをアタッチしていきます。
まずは、車体に物理挙動をつけたいので"Rigidbody"をアタッチしていきましょう。

※親のオブジェクトにアタッチしてください。
※画像では"1"になっているが、Massの値を"1000"に変更

親の「marioCar」にアタッチ

次に、車輪の挙動を簡単に実装することができる"WheelCollider"をアタッチしていきます。
オブジェクトにそのままつけると、タイヤの回転処理が難しくなるそうなので、空のオブジェクトを4つ用意してそこにアタッチしていきます。
※位置や半径はモデルの車輪に合うようにしよう!

空のオブジェクトに
"WheelCollider"をアタッチ

アタッチが完了したら一度実行してみよう。
上手くいけばいい感じに地面の上に乗っかります。

※飛んでってしまう人は"Rigidbody"のMassを重くしてみてください。
※くるくる回ってしまう人は"Rigidbody"のFrezzeRotationのxとzにチェックしてみてください。

これでとりあえずモデルはOK!
次は車を動かすためにスクリプトを書いていきましょう(^_-)-☆

2.車を動かすスクリプト

では、ここからは車をキーボードで操作していきましょう。
以下が記述するコードです。

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

//  クラス内の変数をインスペクター上で操作できるようにする
[System.Serializable]
public class AxleInfo
{
    //  左のタイヤのWheelColliderコンポーネント
    public WheelCollider leftWheel;
    //  右のタイヤのWheelColliderコンポーネント
    public WheelCollider rightWheel;
    //  このホイールがエンジンを反映しているか
    public bool motor;
    // このホイールがハンドルの角度を反映しているかどうか
    public bool steering; 
}

public class CarScript : MonoBehaviour
{
    //  上で定義したクラスの可変長配列(今回は「前方」「後方」の二つをインスペクター上で入力する)
    public List<AxleInfo> axleInfos;
    //  ホイールに適用可能な最大エンジン
    [SerializeField] private float MAX_MOTER = 0;
    //  適用可能な最大ハンドル角度
    [SerializeField] private float MAX_STEERING_ANGLE = 0;

    //  実際に回転させたいタイヤオブジェクト(左前・右前・左後・右後)
    public GameObject tireFL;
    public GameObject tireFR;
    public GameObject tireBL;
    public GameObject tireBR;

    //  ハンドル角度
    float steering;
    //  エンジン(進む力)
    float motor;

    private void Start()
    {
        //  ハンドル角度
        steering = 0.0f;
        //  エンジン(進む力)
        motor = 0.0f;
    }

    // Update is called once per frame
    public void Update()
    {
        //wheelcolliderの回転速度に合わせてタイヤモデルを回転させる
        tireFL.transform.Rotate(axleInfos[0].leftWheel.rpm / 60 * 360 * Time.deltaTime, 0, 0);
        tireFR.transform.Rotate(axleInfos[0].rightWheel.rpm / 60 * 360 * Time.deltaTime, 0, 0);
        //後方のタイヤはインポートしたオブジェクトの回転軸が前方のタイヤと異なってしまっているので変更する
        tireBL.transform.Rotate(0, 0, axleInfos[1].leftWheel.rpm / 60 * 360 * Time.deltaTime);
        tireBR.transform.Rotate(0, 0, axleInfos[1].leftWheel.rpm / 60 * 360 * Time.deltaTime);

        //wheelcolliderの角度に合わせてタイヤオブジェクトを回転する(前方のみ)
        tireFL.transform.localEulerAngles = new Vector3(tireFL.transform.localEulerAngles.x, axleInfos[0].leftWheel.steerAngle * 2 - tireFL.transform.localEulerAngles.z, tireFL.transform.localEulerAngles.z);
        tireFR.transform.localEulerAngles = new Vector3(tireFR.transform.localEulerAngles.x, axleInfos[0].rightWheel.steerAngle * 2 + tireFR.transform.localEulerAngles.z, tireFR.transform.localEulerAngles.z);

        //  上下入力を受け取りmoterに格納
        motor = MAX_MOTER * Input.GetAxis("Vertical");

        //  左右入力を受け取りsteeringに格納
        steering = MAX_STEERING_ANGLE * Input.GetAxis("Horizontal");

        //  要素数の数だけ繰り返す
        foreach (AxleInfo axleInfo in axleInfos)
        {
            if (axleInfo.steering)
            {
                //  ハンドル角度をWheelに入れる(前方のみ)
                axleInfo.leftWheel.steerAngle = steering;
                axleInfo.rightWheel.steerAngle = steering;
            }
            if (axleInfo.motor)
            {
                //  エンジンをWheelに入れる(前方・後方)
                axleInfo.leftWheel.motorTorque = motor;
                axleInfo.rightWheel.motorTorque = motor;
            }
        }
    }
}

スクリプト記述したら、保存して親オブジェクトにアタッチします。
そしたらInspectorに下の画像のように数値やオブジェクト入れましょう。

Inspectorを設定

実行してカートを自由に動かしてみましょう。
…実行結果のgif画像が上手く入りませんでした。ごめんなさい。
m(__)m

3.制作の反省や感想

今回、自分は初めてチーム(二人)でゲームを開発しました。
といっても、相方はUnityを始めたばかりだったので、挙動のほとんどの部分は私がやってしまったのですが…。

初めてのチーム制作だったので反省点も多々あります。
報告・連絡・相談をしっかり行っていなかったことやタスクをしっかりと管理していなかったことなど、反省点を挙げればキリがありません( ;∀;)

しかし、とてもよい経験をすることができ、これからの本格的なチーム制作に活かせると思えました。

では、今回の記事はここまでです。

ここまで、ご愛読いただきありがとうございました。
Twitterで個人ゲーム開発の情報を発信しているので、よろしければフォローお願いします。
次回の記事もよろしくお願いします。
では!( 一一)


この記事が気に入ったらサポートをしてみませんか?