質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

585閲覧

unityでまともな挙動で車が動作するようにしたい

muri_piyo

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

0クリップ

投稿2024/10/15 14:20

編集2024/10/16 14:04

実現したいこと

unityでaddforceを使って車を操作できるようにしたい。
wheelcoliderは実現が難しそうであったので確実に解決できそうな場合を除いてaddforce
(またはその他のもの)で実現したい。
実現したいことは

  • スリップしないようにしたい
  • 曲がるときにしっかりグリップしてほしい
  • 曲がり方をよりリアルにしたい

です。

発生している問題・分からないこと

現在発生している問題は以下のとおりです。

  • 摩擦が足りないのが原因なのか不明だがかなりの頻度でスリップする
    現在、地面と車のタイヤ部分に動摩擦1、静止摩擦0に設定しています。
    特に坂道の部分ではスリップが激しくなる。
  • 曲がるときに車の進行方向ではなく慣性に従って進んでしまう。

イメージ説明

  • 不自然な曲がり方をする。
    曲がらせ方は現在は車本体を入力に対して回転させているだけです。
  • ※追記 車が斜めの状態で地面に落ちた場合不自然な角度で静止したまま動作する。

解決済:Rigidbodyの設定でX軸の回転が固定されていた。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5 6public class adf_car : MonoBehaviour 7{ 8 private Rigidbody rb; 9 public float speed; //速度 10 public float Rrot; //右回転角 11 public float Rfric; //右グリップ力 12 public float Lrot; //左回転角 13 public float Lfric; //左グリップ力 14 public float brake; //ブレーキ 15 16 17 18 //Vector3 force = new Vector3 (0.0f,0.0f,1.0f); 19 20 // Start is called before the first frame update 21 void Start() 22 { 23 rb = GetComponent<Rigidbody>(); //rigidbodyのコンポーネント取得 24 } 25 26 // Update is called once per frame 27 void FixedUpdate() 28 { 29 //前進 30 if(Input.GetKey(KeyCode.UpArrow)) 31 { 32 rb.AddRelativeForce(Vector3.forward * speed,ForceMode.Acceleration); 33 } 34 35 //右回転 36 if (Input.GetKey(KeyCode.RightArrow)) 37 { 38 transform.Rotate(0f,Rrot*0.1f, 0f); 39 //rb.AddRelativeForce(Vector3.right * Rfric, ForceMode.Acceleration); 40 } 41 42 //左回転 43 if (Input.GetKey(KeyCode.LeftArrow)) 44 { 45 transform.Rotate(0f,-Lrot*0.1f, 0f); 46 //rb.AddRelativeForce(Vector3.left * Lfric, ForceMode.Acceleration); 47 } 48 49 //ブレーキ 50 if (Input.GetKey(KeyCode.DownArrow)) 51 { 52 float Vel = rb.velocity.magnitude; 53 if (Vel>=0f) 54 { 55 rb.AddRelativeForce(Vector3.back *brake , ForceMode.Acceleration); 56 //Debug.Log("反応してっぞ"); 57 } 58 } 59 60 } 61} 62

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

動摩擦を1.5にすると車が動かなくなってしまう。
wheel coliderではスピードを出すと曲がることができない。

目標レベルと現在の到達度

基本的に不自然すぎる動きでなければ問題はないです。実現したい目標レベルは以下のとおりです。(上から優先順位が高い)

  • 前進する
    急発進のような不自然な加速ではない。レースゲームにするので最高速度は速めに。
    現在実現している処理はaddforceで動作させる方法と

  • 左右に曲がることができる
    通常の車のように徐々に曲がる。
    現在実現している処理はrotateで角度を変化させて曲がっている。

  • スリップせずにタイヤが地面にグリップできる。
    高速時にスリップしない。現在は車のmass:1500,最高速度:20.5fの時走行中に回転するようなスリップは起きない。

###補足
特になし

TakaiY👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tamoto

2024/10/16 06:29

質問の文章を読んだだけで回答ではないですが、 一度、実際の車が走ったり曲がったりするときに、どこにどういう力が加わっているのかを考えてみた方が良いかもしれません? > 面と車のタイヤ部分に動摩擦1、静止摩擦0に設定しています。 > addforceを使って車を操作できるようにしたい。 これってつまり、例えると、消しゴムでできた車の形をした物体を後ろから手で押して動かしてるような状況ということですよね? であれば、質問文や再現画像のような動きになるのはごく自然だと思います。 考え方から直さないといけない気がします。
muri_piyo

2024/10/16 06:47

確かに実際の車の動きではタイヤは回転するので進行方向に比べて、横向きの摩擦の方が大きくなるので現在の動かし方では不自然になるのかもしれません。 コメントありがとうございました。
fana

2024/10/16 09:16

(Unityとか全然知らん素人ですけど) 困り事が「「摩擦」での減速がどうにもうまくいかない」みたいな話なのであれば,「摩擦」ではない手段で好き勝手に減速させてしまえばどうなのか? とか思うのですが,そういうのはダメなのでしょうか? 例えば,横向きの速度を殺すような方向の力を毎度適当に加えてやれば,スリップ具合を低減させることができないのか? とか. (速度そのものを勝手にいじくってしまってもよいのであれば,速度の横方向成分に1未満の係数でも毎度乗じてやるとか)
muri_piyo

2024/10/16 09:31

その通りです。 unityでは重力と摩擦と弾性力くらいしか設定できないのでその他の力は自分でかける必要があります。 車関係の物理にはあまり詳しくないのでどんなふうに力をかければマシになるかが、わからないって感じですね。 コメントありがとうございました。
fana

2024/10/16 10:00 編集

> 車関係の物理 に相応に基づいた方法論とせねばならない,という話なのでしょうか? (しかし現状,加速や旋回はかなり好き勝手にやってるっぽいですし…?) その辺の求めている匙加減?みたいなの(物理的な理屈に基づく方法にしたい ←vs→ 動きが見た目それっぽければ方法はどうでもOK)が明確でないと,そのあたりが丁度いい回答というのが得られ難いのではないだろうか…? とか想像します.
muri_piyo

2024/10/16 10:07

見た目と動きがそれっぽければOKです。 最低ラインは進む、曲がる、スリップしないです。 補足に目標のレベルを追記しておきます。
YT0014

2024/10/16 23:26

>静止摩擦0 静止摩擦を少し設定してみたほうが良いかと。 この値がスリップを引き起こしている可能性がありますので。
muri_piyo

2024/10/17 01:20

スピードをある程度下げて静止摩擦を1にするとかなり操作に安定感がでてきました。 コメントありがとうございます。
guest

回答1

0

公式のチュートリアルにソースコードつきでカートレースがあるので動かし方については参考になると思います。
https://learn.unity.com/project/karting-template

このチュートリアルのコードではAddforceを使わない方針で実装されています。
具体的にはドリフトの挙動やステアリングなどから速度を計算して、それをRigidbody.velocityに適用している感じですね。

投稿2024/10/18 20:46

UnchFullburst

総合スコア669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問