Energy Needs Heat

PR

×

プロフィール

Suden

Suden

カレンダー

コメント新着

コメントに書き込みはありません。

キーワードサーチ

▼キーワード検索

2026.05.09
XML
カテゴリ: 工学
【はじめに】

この記事の所要時間 : およそ03分00秒

この記事の想定読者層は以下の通りです。




1.
Unityを知っている
2.
Unityをダウンロード出来る
3.
Core i5/i7以上を搭載した20万円台のパソコン以上の諸元が必要なのを知っている

4.


5.
プログラミング言語における論理、システムの使用の宣言→プログラムの名前の宣言→変数値の宣言→変数値の初期値の定義→システムの変更の宣言→変数値のビヘイビアの定義→システムの使用の終了の宣言、を理解している人




6.
レースゲームを作ってみたい




7.
時間や周回数、順位の計測をしないで、ただ車で走るだけのゲームを作りたい
8.
カメラをオブジェクトのディレクトリに収めることを知っている
9.
モデリングで中身まで再現した方がいいか、子供用の木のおもちゃみたいに塊を作って車輪をつけるだけにした方がいいのか、悩んでいる




10.
マニュアルシフトでパソコンのキーボードの上下矢印キーでシフト操作をするか、パッドコントローラを使うか、コマンド入力でHパターンシフトまで再現するか、悩んでいる

チューニングで変数をシリンダ一つあたりで10個以上設定するか、車体を基準に変数を9個以内に収めたいか、悩んでいる
12.
点火時期の変数を設定してアイドリングを定義して、変速機とバルブスプリングの定数を設定して最高出力を定義して、動弁開閉時期を設定して最大トルクを定義して、路面と天候を設定して定義して、空力とタイヤ空気圧を設定して定義するか、それをしないか悩んでいる




13.
一日24時間で30分から300分(0.5時間から5.0時間)パソコンの作業をする時間を【作ることが出来ない人】
14.





15.
多相睡眠のように300分を30分*10回に分けた方が効率が良いとはわかっているけど、一気に作ろうとして作れない人




この記事はあくまで参考であり、実際の作業では機能しない恐れがあります。

この記事の内容を実行する時は、自己責任のもとでお願いします。

この記事の内容は一般公開された情報を元に書かれていますが、著作権等の権利には細心の注意を払っているつもりです。

【本文】




1.フィールドの生成

Hierarchyウィンドウで右クリック
↓
3D Object>Terrainを選択
↓
画面上にTerrainが配置、Projectウィンドウに「New Terrain」アセットが生成される




2.コースの設計

・ストレート
・コーナー
・バンク角
・曲率(アール)
・傾斜と勾配




生成されたTerrainオブジェクトを選択
↓
Inspectorウィンドウを開く
↓
Terrain Settings(歯車)のアイコンを選択
↓
Mesh ResolutionのTerrain Width,Terrain Lengthを作りたいゲームの寸法に調整
(例えば、オーバルコースで「土台」を作る時に直線6,400m、コーナーを800mと1,600mの二つに設定するなら、Terrain Lengthを6,400m、Terrain Widthを1,600mにする)
↓
必要に応じてHeightも調整
(高低差を160mにしたいなら、160mにしたい場所をしていしてそこを160mにする)
↓
InspectorでPaint Terrain(ブラシアイコン)を選択
↓
プルダウン(垂れ下がった場所)からRaise or Lower Terrainを選択
↓
ブラシの仕様(太さ、大きさ、幅など)を決めて、画面上でクリック・ドラッグして、山や谷を作る
(ここなら0→160の坂道を作る)
↓
Smooth Heightツールで地形を滑らかにする
↓
Paint TerrainのプルダウンからPaint Textureを選択
↓
LayersのEdit Terrain Layers > Create Layerをクリック
↓
使いたいテクスチャ(模様)を選択

レースコースの場合は、専用ツールの「Spline」を使う




3.植込みの配置

・アセットの読み込み
・アセットの中のオブジェクトの配置

1.
UnityのProjectウィンドウにファイルを直接ドラッグアンドドロップ

2.
アセットストアを開く
↓
Add To My Assets
↓
Open in Unity
↓
Download
↓
Import




プレハブ

Hierarchy上のオブジェクト
↓
Projectウィンドウのフォルダ
↓
ドラッグアンドドロップ
↓
Scene or Hierarchy
↓
ドラッグアンドドロップ
↓
プレハブ(インスタンス)
↓
インスペクタで操作
↓
Inspector上部の「OverRides」
↓
「Apply All」で全て反映




4.車のモデリング

・
タイヤの設定
・
ドライブシャフトの設定
・
ボディの設定

「WheelCollider」で親オブジェクトの車に「RigidBody」(Massで大体1400と入力)
↓
子オブジェクトで4つのタイヤの位置に空のゲームオブジェクトを作成、Wheel Colliderコンポーネントをアタッチ(バリカンなどのアタッチと同じ解釈です)
↓
各Wheel Colliderのタイヤ半径(Radius)をタイヤのモデルに合わせる
(ホイールハウスがΦ800mmならタイヤ半径はΦ600mm付近)
↓
Suspension Distanceを調整
(タイヤがΦ600mmなら480mmくらいが良いかもしれません)




【構文】

Using UnityEngine;

Public Class CarControl : MonoBehaviour

Public WheelCollider
//右前(1),右後(2),左後(3),左前(4)

Public Float MaxMotorTorque = xxxxf;
〃〃MaxSteeringAngle = xxxxf;
〃〃BrakeTorque = xxxxf;

Public Float m_HorizontalInput;
〃〃 m_VerticalInput;
〃bool m_isBraking;

Private Void FixedUpdate()
{
GetInput();
HandleMotor();
HandleSteering();
ApplyBrake();
}

Private Void GetInput()
{
m_HorizontalInput = Input.GetAxis(“水平”)
m_VerticalInput = Input.GetAxis(“垂直”)
m_isBraking = Input.GetKey(キーコード)
}

Private Void HandleMotor();
{
Float Motor = MaxMotorTorque * (インプット)

BackLeft.MotorTorque =Motor;
BackRight.〃〃〃;

Private void HandleSteering()
{
Float Steering = 角度*入力

Frontleft.SteerAngle = Steering;
FrontRight.〃=〃;
}

Private Void ApplyBrake();
{
Float Brake = m_isBraking ? BrakeTorque : 0f;

FrontLeft.BrakeTorque = Brake ;
FrontRight〜
BackLeft〜
BackRight〜




【構文】(マニュアルシフト)

Unityで新規Canvasを作成
↓
Canvas配下に「Panel」を作成して、Shifter UIスクリプトをアタッチ
↓
Panelの配下にカーソル画像となる「Image」を作成して、スクリプトのCursolImageに設定
↓

Using UnityEngine;
Using UnityEngine.UI;
Using System.Collection.Generic;

Public Class ShifterUI : MonoBehaviour
{
(System.Serializable);
Public enum ShiftType (I_Pattern,H_Pattern);
(Header(“Settings”));
Public ShiftType CurrentShiftType = Hパターン
Public int MaxGears = 7;

(Header (UI Components));
Public RectTransform PatternPanel;
Public RectTransform Cursor;

Private Dictionary <int.Vector2>
Gear Positions = New Dictionary
<int.Vector2>;
Private CurrentGear = 0;

Void Start();
{
Generate Pattern();
UpdateCursorPosition();

Void Update();
{
Handle.Input();
}

Void GeneratePattern()

GearPositions.Clear();
GearPositions(0) = Vector2.zero;

if(CurrentShiftType == ShiftType.H.Pattern)
{
GearPosition(x) = new Vector2(〜,〜);
}
else
{
for (int  i = 1; i<= MaxGears; i++)
{
GearPositions(i) = new Vector2(〜,〜);

Void HandleInput()
{
if (CurrentShiftType == ShiftType.I_Pattern)
{
if(Input.GetKeyDown(〜)) ShiftUp;
if(〃)) ShiftDown;
}
else
{
if(GetkeyDown(Keycode.〜)) SetGear (x);
}
}
Void ShiftUp(){ if(CurrentGear <MaxGear) SetGear (CurrentGear +1);}
Void ShiftDown(){ if(CurrentGear < -1) SetGear (CurrentGear -1);}

Void SetGear(int Gear)
{
if(GearPositions.ContainsKey(Gear))
{
CurrentGear =Gear;
UpdateCursorPosition();
Debug.Log(“CurrentGear: ”  + CurrentGear));
}
}
Void UpdateCursorPosition()
{
if(Cursor ! = null && GearPositions.ContainsKey(CurrentGear))

Cursol.AnchoredPosition = GearPositions(CurrentGear));
}
}
}




・
一面を作ってそれを引き伸ばして箱にする方法
・
ボンネットやボディ表面を操作する方法
・
ボディ表面を操作して灯火類等を設定する方法
・
ボディ表面に線を入れて扉や窓を再現する方法
・
後写鏡を設定する方法
・
リム(ホイール)の意匠を設定する方法
・
ブレンダーで作ったモデルをUnityにインポートする方法




Blender(ソフト)で、
「Mesh」>「Plane」(平面)を追加
↓
編集モード(Tabキー)
↓
「Eキー」(押し出し)を使い、型を完成
↓
「Aキー」(平面を全て選択)
↓
正面or上面に視点を変更
↓
「Eキー」(押し出し)を押し、そのままドラッグして立体化
↓
ミラーは個別に作り「Ctrl + Jキー」で取り付け
↓
面選択>Iキー(インセット)>Eキー(押し込み)
↓
Blender
↓
「File」>「Export」>「FBX(.fbx)」を選択
↓
「Select Object」にチェック(✓)を入れて、選択した状態で書き出す。
↓
書き出したFBXファイルをUnityのProjectウィンドウにドラッグアンドドロップ




・
排気音のプログラミングとそのためのスピーカーとマイクの設定

アセットストアでダウンロード
↓
アセットの指示に従って設定
↓
用意した排気音をProjectウィンドウにドラッグアンドドロップ
↓
排気管の近くに空のオブジェクトを生成
↓
オブジェクトにコンポーネントを追加
↓
インスペクタ上で項目を設定




・
パッドコントローラの適用

「Input Systen Package」を導入
↓
Unityエディタ>Window
↓
Window>Package Manager
↓
PackageをUnity Registryに変更
↓
検索窓「Input System」と入力
↓
パッケージを選択してInstall
↓
再起動?>Yes
↓
Projectウィンドウ
↓
Create>Input Actions>名前をつける
↓
作成したファイルをダブルクリック
↓
設定画面>Action Mapを追加
↓
Actionsにアクションを追加
↓
Each>Action TypeをValue
↓
Control Type>Vector2,Axis
↓
Add Bindingから欲しいキーをバインド
↓
「Save Asset」をクリック




【構文】

Using UnityEngine;
Using UnityEngine.InputSystem;

Public Class x : MonoBehaviour
{
Private PlayerInputActions.InputActions;
Private Vector2 MoveInput;
Private float AccelInput;
Private float BrakeInput;

Void Awake()
{
InputActions = new PlayerInputActions;
}
Void OnEnable()
{
InputActions.Enable;
}
Void OnDisable()
{
InputActions.Disable;
}
Void Update()
{
MoveInput = Controls.Player.Move.ReadValue<Vector2>().x;
BrakeInput =
Controls.Player.Brake.ReadValue<float>();
}
}
}

↓
車オブジェクトにアタッチ
↓
「Input Debugger」でパッドの動きが伝わっているか、確かめられます。




・チューニングの導入

C#でスクリプトを開く
↓
変数を定義(インスペクタ上でpublic または(SerializeField)
↓
必ず上の二つの英単語(Public,SerializeField)を入れる
↓
変数の初期値を設定(トルクが270Nm,回転数が4,800rpm,最高速度が180.000km/h)
↓
コードへ組み込む
↓
インスペクタで調整




【構文】

Using UnityEngine;

public class CarController : MonoBehaviour
{
(Header (“Engine Tunings”))
(SerializeField) Private float MotorTorque = x...
(SerializeField) Private float MotorRev = x...

(Header (“Engine Tunings”))
(SerializeField) Private float SteeringTorque = x...

Private RigidBody rb;

Void Start()
{
rb = GetComponent<RigidBody>();
}

Void FixedUpdate()
{
float MoveInput = Input.GetAxis(“Vertical”);
Vector3 force = //チューニングの変数;
rb.AddForce(Force);

if(rb.Velocity.Magnitude > maxspeed)
{
rb.Velocity = rb.Velocity.Normalized * maxspeed;
}
}
}




(SerializeField)で変数を定義
↓
更新(Update)に関わる構文の内側に新しい変数を組み込む
↓
インスペクタで新しい値を調整




・新しい式を入れ替える

using UnityEngine;

public class Change : MonoBehaviour
//宣言はclassの直下
public string Mode = “new” ;
float result;
//void Updateは「1秒間に毎フレーム実行」
//void FixedUpdateは物理演算に使用
//void OnEnable/OnDisableはオブジェクトが有効/無効になった時に一度だけ実行
void Update()
{
switch(mode)
{
case “old” ;
result = 10 + 10 ;
break ;

case = “new” ;
result = 100*100 ;
break;
}
}
}




・
変数の値の範囲の制限

(Range)を変数値(int,float,long,double...)の上に書くと適用

(Range(0.8f,1.5f))
public float ventilation = 1.0f;




・
ハンドブレーキの設定

using UnityEngine;

public class handbrakes : MonoBehaviour
{
(Header(“Wheels”))
public WheelCollider RearRightWheel;
public WheelCollider RearLeftWheel;

(Header(“HandBrake Adjustments”))
(SerializeField) private float //ハンドブレーキ最大トルク;
private float currentHandBrakeTorque = 0f;
private bool isHandBrakesActive = false;

void Update()
{
if(Input.GetKeydown()) = true;
if(〃) = false;
}

void FixedUpdate();
{
HandBrake();
}

void HandBrake()
{
currentHandBrakeTorque = is Active Torque = 0f;

RearRightWheel.BrakeTorque = current;
RearLeftWheel.BrakeTorque = current;
}
}







お気に入りの記事を「いいね!」で応援しよう

最終更新日  2026.05.09 17:55:38


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: