LoginSignup
8
11

More than 3 years have passed since last update.

unity で簡単な車を作ってみた

Last updated at Posted at 2019-05-01

概要

現在,unity の勉強をしています.

勉強の目的は ET ロボコンのシミュレータを作ることですが,
まずは,『地面』を作って,簡単な『移動物』を動作させてみるところから
はじめることにしました.

unity を一度も触ったことがないので,できるところから少しずつ始めています.
※GWの休み(2019/04/27~5/1)を利用して,約5日かけて勉強した記録です・・.

勉強のステップ

当初は,簡単なモノを動かして,Unityでシミュレーションしているモノの
物理的な特性等を調べようとしていたのですが,気づいたら簡単な車が
出来てしまいました.

以下,今回の勉強のステップです.

  • ステップ1:Unity のイロハを知る
    • インストール,プロジェクト作成,チュートリアル実施
  • ステップ2:フィールドを作る方法を知る
    • 地面,道路
  • ステップ3:モノを移動させる方法を知る
    • 走る,曲がる,止まる
  • ステップ4:ホイールコライダを使ってみる
    • モータトルク,ブレーキトルク,ステアリング操作

参照した書籍/記事

デモ

今回の成果はなんといっても,ホイールコライダ―を使った車の作成です.
以下ぐらいの構成であれば,30分程度で作れます.

image.png

なお,チュートリアルに沿ってやるとビジュアル化できなかったですが,
色々とググって自己解決できました.

以下が,実際にシミュレーションした様子です.
宙に浮いたモノ(キューブ)が重力で車の上に落下しますが,
そのまま車の上で静止し,車を移動させている様子です.
※車輪も移動方向に応じたビジュアライズができています

image.png

C#スクリプト

今回作成したスクリプトは以下の通りです.
チュートリアルベースで作成し,必要な個所(ブレーキ等)を追加しました.

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

public class SimpleCarController : MonoBehaviour
{
    public List<AxleInfo> axleInfos; // 個々の車軸の情報
    public float maxMotorTorque; //ホイールに適用可能な最大トルク
    public float maxSteeringAngle; // 適用可能な最大ハンドル角度
    public float maxBrakeTorque;



    // 対応する視覚的なホイールを見つけます
    // Transform を正しく適用します
    public void ApplyLocalPositionToVisuals(WheelCollider collider)
    {
        if (collider.transform.childCount == 0)
        {
            return;
        }

        Transform visualWheel = collider.transform.GetChild(0);

        Vector3 position;
        Quaternion rotation;
        collider.GetWorldPose(out position, out rotation);

        visualWheel.transform.position = position;
        visualWheel.transform.rotation = rotation;
    }

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

    }

    // Update is called once per frame
    void FixedUpdate()
    {
        float motor = maxMotorTorque * Input.GetAxis("Vertical");
        float steering = maxSteeringAngle * Input.GetAxis("Horizontal");
        bool brake = Input.GetKey(KeyCode.Space);

        foreach (AxleInfo axleInfo in axleInfos)
        {
            if (axleInfo.steering)
            {
                axleInfo.leftWheel.steerAngle = steering;
                axleInfo.rightWheel.steerAngle = steering;
            }
            if (axleInfo.motor)
            {
                axleInfo.leftWheel.motorTorque = motor;
                axleInfo.rightWheel.motorTorque = motor;
            }
            if (brake)
            {
                axleInfo.leftWheel.brakeTorque = maxBrakeTorque;
                axleInfo.rightWheel.brakeTorque = maxBrakeTorque;
            }
            else
            {
                axleInfo.leftWheel.brakeTorque = 0;
                axleInfo.rightWheel.brakeTorque = 0;
            }
            ApplyLocalPositionToVisuals(axleInfo.leftWheel);
            ApplyLocalPositionToVisuals(axleInfo.rightWheel);
        }
    }
}

[System.Serializable]
public class AxleInfo
{
    public WheelCollider leftWheel;
    public WheelCollider rightWheel;
    public bool motor; //このホイールがエンジンにアタッチされているかどうか
    public bool steering; // このホイールがハンドルの角度を反映しているかどうか
    public bool brake;
}

課題

今回,色々と調べて簡単な車まで作成することができたのですが,
まだホイールコライダの物理的な運動方程式をどう組み立てれば
良いのかわかっていません..

せっかく簡単に作れることはわかったので,
もう少し理論的なところを詰めていきたいなと思っているところです.

8
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11