Unity3dタンクチュヌトリアルシャヌシレッスン1.車䞡力孊の基瀎

画像



゚ントリヌ



したがっお、Unityの初心者ではなく、シヌンを䜜成したり、ステヌゞ䞊でオブゞェクトを配眮したり、地圢を䜜成したり、プレハブを䜜成したりできたす。 このレッスンではさらに詳しく説明するので、この知識はすべおあなたにずっお有甚です。



぀たり、このレッスンの最初の郚分では、ホむヌルコラむダヌずは䜕か、それを䜿甚しお車䞡を運転し、珟実的な車のサスペンション動䜜を䜜成する方法を孊びたす。 。



実際、䞊の画像に衚瀺されおいるものこのレッスンの結果ですをブラりザヌで 「ラむブ」で詊すこずができたす。 自分でやりたいですか それからキャットぞようこそ



Unityで自動車敎備士のモデリングの基本に぀いお話を始める前に、公匏りェブサむトのこのトピックに関するレッスンが既にあるこずに泚意するしかありたせん。 確かに、このすべおを通しお、どのスクリプトをどのオブゞェクトにアタッチするかに぀いおの指瀺のみが䞎えられおおり、たたに有甚な䜕かを説明し、レッスンの第3郚では最終的にメむンスクリプトがどのように機胜するかを説明したすが、それは最初の郚分で行わなければならず、ホむヌルコラむダヌがどのように動䜜し、リゞッドボディずどのように盞互䜜甚するかを説明したす。最終的に、このレッスンはUnityの初心者向けではなく、修正したいず思いたす。



しかし、Wheel Colliderが䜕であり、䜕ず䞀緒に食べられるかを既に知っおいる堎合は、このレッスンをスキップできたす。



1.「車」を䜜成する



開始するには、暙準的な手順に埓っお、シヌンを䜜成し、地圢を䜜成するか、既補のものを䜿甚しおから、空のゲヌムオブゞェクトGOを䜜成しGameObject-> Create Empty、Carなどのオリゞナルの名前を付けたしょう。



次に、キュヌブを䜜成しGameObject-> Create Other-> Cube、暙準マテリアルを適甚しお、芋やすくしたす。 これが車のボディであるず想像し、Scaleを䜿甚しお幅ず長さを拡倧しお、このボディの前面がZ軞青い軞、Unityの䞖界では正匏に前面ず芋なされたすに沿っお芋えるようにし、CubeをタブのCarオブゞェクトにドラッグしたす車の子になるように階局。 Carオブゞェクト自䜓に移動しお、Rigidbodyを远加したすComponent-> Physics-> Rigidbody。 箄1500 kgの適切な䜓重を圌に割り圓おたす。車䜓の準備ができたした。

画像



車䜓に加えお、車にはホむヌルがあり、シリンダヌを䜜成しGameObject-> Create Other-> Cylinder、同じScaleを䜿甚しおホむヌルの倖芳を䞎え、Z軞に沿っお90床回転したす重芁Z軞にのみ 

画像

Wheel Forward Leftで新しく䜜成したシリンダヌの名前を倉曎し、ホむヌルをその堎所、぀たりキュヌブの前面ず巊偎に蚭定したす繰り返したすが、Z軞の正の郚分はUnityの前面ず芋なされたす。

画像

ホむヌルを巊に向かっおCarオブゞェクトにドラッグしたす。 ホむヌルの回転を芋やすくするために、ホむヌルにテクスチャをより詳现に割り圓おたす。 次に、ホむヌルをコピヌしWheel Forward LeftずDuplicateを右クリック、Wheel Back Leftを呌び出しお、他の2぀のホむヌルず同様に適切な堎所に配眮したす。

画像



画像



これで、スヌパヌカヌの準備がほが完了したした 地圢の衚面より少し䞊に持ち䞊げおPlayを抌すず、車は地面に萜ちお杭の付いた車茪の䞊に立ちたす。゜フトサスペンションを倢芋るこずができ、Playモヌドを終了したす。 ご芧のずおり、ホむヌルにはCapsule Colliderず呌ばれるコンポヌネントずBox Colliderボディがありたす。このレッスンでは、衝突ずは䜕か、それらに基づいお空間内のオブゞェクトの䜍眮を蚈算する方法に぀いおは説明したせん。単玔なコラむダヌボックス、カプセル、メッシュ、...の堎合、このオブゞェクトは、リゞッドボディず1぀以䞊のコラむダヌを含む他のオブゞェクトず察話できたす。次に、リゞッドボディを含むオブゞェクトは、䞋䜍のすべおのコラむダの衝突に基づいお䜍眮を蚈算したすそしお圌らの物理的なm aterials。



䞊蚘から䜕も理解しおいない堎合、気にしないでください、理解は緎習に䌎いたす。



それたでの間、各ホむヌルを遞択しお、Capsule Colliderを削陀したす右クリックしおコンポヌネントを削陀したす。 [再生]をクリックしたす。車は車茪に乗らず、地圢を通過し、身䜓だけが衚面ず盞互䜜甚したす。



2.ホむヌルコラむダヌの远加



それで、この神秘的なホむヌルコラむダヌは䜕ですか 正しくしたしょう。 空のGameObjectずいう名前をWCollider Forward Leftずしお䜜成し、Wheel ColliderコンポヌネントComponent-> Physics-> Wheel Colliderを远加したす。セグメントが内郚にある円のように芋えたす。ホむヌルに比べお倧きすぎたり小さすぎたりしたす。スケヌルの䜿甚量に䟝存したす。 幞いなこずに、圌はこのパラメヌタヌを倉曎し、ホむヌルの半埄に合わせお半埄パラメヌタヌを倉曎し、WColliderずいう名前の新しいプレハブを䜜成し資産->䜜成->プレハブ、WCollider Forward Leftをプレハブにドラッグしたす。 ホむヌルず同数のコラむダヌがあり、それぞれのパラメヌタヌを倉曎しないように、プレハブパラメヌタヌを倉曎し、残りのコラむダヌはそのプロパティを継承するため、䟿宜䞊、プレハブを䜜成したした。 次に、暙準の手順を実行し、WCollider Forward LeftをCarオブゞェクトにドラッグし、巊前のホむヌルの䞭倮に配眮し、3回耇補し、名前を倉曎しお、他のホむヌルに埓っお移動したす。

画像



画像



Playを抌すず、車は転倒しお再び車茪の䞊に立ちたすずころで、車茪がただ地圢を通過しおいる堎合、それは車が非垞に高速で地面に萜ちるこずを意味し、地面たでの距離を短くするか、RigidbodyのDragパラメヌタヌを倧きくする必芁がありたす。 ご芧のように、ホむヌルコラむダヌのパラメヌタヌを蚭定しなかったため、カプセルコラむダヌが車茪の䞊に立っおいた堎所ず結果はそれほど倉わりたせん。すべお正しいです。



したがっお、ゲヌムモヌドを終了し、WColliderプレハブを遞択し、Wheel Colliderコンポヌネントのプロパティを倉曎したしょう。

  1. サスペンションの距離-実際、これはサスペンションのスプリングの長さで、0.15に蚭定されおいたす
  2. サスペンションスプリング->スプリング-サスペンションの剛性、Rigidbodyの重量が倧きいほど、剛性を倧きくする必芁がありたす。9000に蚭定したす。
  3. サスペンションスプリング->ダンパヌ-サスペンション゜フトナヌ、倀を倧きくするずスプリングの動きが遅くなり、100に蚭定
  4. 質量-ホむヌルの質量、1を残す
  5. 前方摩擊-「フロント」ホむヌルの摩擊力、そのたたにしおおきたす
  6. 暪方向の摩擊-「暪方向」の車茪の摩擊力は、車のドリフトを実装する堎合に䟿利で、そのたたにしおおきたす
合蚈

半埄を芋ないでください、あなたは別のものを持っおいるかもしれたせん、䞻なこずは円があなたのホむヌルず䞀臎するこずです

画像



だから、今すぐ再生をクリックしおください、私たちの車はたったく異なる方法で動䜜するようになりたした、今では地圢の衚面から跳ね䞊がり、䞘の斜面に眮くず、それから転がりたす、これがホむヌルコラむダヌが私たちのために働く方法です。



しかし、これが圌らの胜力のすべおではありたせん。それらを䜿甚しお車を運転し、車茪を回転させお地圢のバンプに反応させる方法を芋぀けたしょう。 スクリプトを開始したす



3.ホむヌルコラむダヌの管理



このチュヌトリアルでは、Cでスクリプトを蚘述し、JavaScriptを䜿甚する人を蚱しおくれたす。私はそれをよく知っおいるず思いたす。



新しいCスクリプトを䜜成しAssets-> Create-> C Sharp Script、CarControllerを呌び出しお開き、以䞋を蚘述したす。



using UnityEngine; using System.Collections; public class CarController : MonoBehaviour { //1 public WheelCollider[] WColForward; //2 public WheelCollider[] WColBack; //3 // Use this for initialization void Start () { //4 } void FixedUpdate () { //5 } }
      
      





  1. スクリプトのメむンクラスは、スクリプトファむルず同じ方法で呌び出す必芁がありたす。そうしないず、コンパむラぱラヌをスロヌしたす。
  2. フロントコラむダヌの配列。
  3. リアコラむダヌの配列。
  4. Start関数を䜿甚しお初期化したす。
  5. Unity3dスクリプトの基本チュヌトリアルで述べたように、オブゞェクトずの物理的な盞互䜜甚には、Update関数よりもFixedUpdate関数を䜿甚する方が適切です。
次に、スクリプトをCarオブゞェクトにドラッグしたす。むンスペクタヌで確認できるように、スクリプトには2぀のフィヌルドがありたす。実際、これらは宣蚀した配列です。コラむダヌを次のようにドラッグする必芁がありたす。

画像



次に、コラむダヌで䜜業し、スクリプトを補足したす。



 using UnityEngine; using System.Collections; public class CarController : MonoBehaviour { public WheelCollider[] WColForward; public WheelCollider[] WColBack; public float maxSteer = 30; //1 public float maxAccel = 25; //2 public float maxBrake = 50; //3 // Use this for initialization void Start () { } void FixedUpdate () { float accel = 0; float steer = 0; accel = Input.GetAxis("Vertical"); //4 steer = Input.GetAxis("Horizontal"); //4 CarMove(accel,steer); //5 } private void CarMove(float accel,float steer){ //5 foreach(WheelCollider col in WColForward){ //6 col.steerAngle = steer*maxSteer; //6 } if(accel == 0){ //7 foreach(WheelCollider col in WColBack){ //7 col.brakeTorque = maxBrake; //7 } }else{ //8 foreach(WheelCollider col in WColBack){ //8 col.brakeTorque = 0; //8 col.motorTorque = accel*maxAccel; //8 } } } }
      
      





Playを抌し、W、Sボタンたたは前埌矢印を䜿甚しお「匏1」を移動し、A、Dボタンたたは巊矢印を䜿甚しお右に曲がりたす。



このスクリプトの機胜を芋おみたしょう。

  1. ホむヌルの最倧回転角。
  2. ホむヌルに䌝達される最倧トルク。
  3. 最倧制動トルク。
  4. InputクラスのGetAxis関数は、コントロヌラヌの移動キヌを抌すか、ゞョむスティックのスティックを移動するずきに発生するむベントを埅機したす。関数は仮想軞の方向を取りたすたずえば、「垂盎」はW、Sキヌ、たたはゞョむスティックが前埌に移動したす。 -1から1たでの数倀を返したす。-1は巊ぞの埌退、Sキヌは「垂盎」軞、Dは「氎平」0-軞はアクティブではなく、1は前進、たたは右W垂盎の「軞」、Aから「氎平」、たたはゞョむスティックのスティックを巊右に動かしたす。
  5. 仮想軞から取埗した結果をCarMove関数に枡したす。
  6. WColForward配列に配眮されおいる各Wheel Colliderに぀いお、steerAngle倉数ホむヌルの回転角床に、氎平軞から取埗した倀を乗算しお倉曎したす。
  7. 垂盎軞が静止しおいる堎合぀たり、WキヌたたはSキヌを抌さない堎合、ブレヌキ力の原因であるbrakeTorqueコラむダヌ倉数を倉曎したす。これは、移動キヌを抌さない堎合に慣性で車が移動しないようにするために必芁です。
  8. それ以倖の堎合WキヌたたはSキヌを抌した堎合、ブレヌキ力はれロになりたす。次に、垂盎軞から取埗した倀を掛けるこずでmotorTorque倉数ホむヌルトルクを倉曎し、その結果、車が加速し始めたす。


それだけですよね マむナヌな欠陥を修正するために残っおいたす、たず、高速で回転しようずするず、車は暪に倒れたす。これは、リゞッドボディがそれに接続されおいるすべおのコラむダヌに基づいお私たちの車の重心を蚈算するずいう事実によるものであり、次に、私たちの車茪はただありたせんスピンしお、䞍均䞀な地圢に反応したせん。



順番にすべおに぀いお話したしょう。



4.重心



それは玠晎らしくシンプルに蚭定されおいたす。最初に空のGOを䜜成し、それを重心ず呌び、それをCarオブゞェクトにドラッグし、たずえば、高速で曲がるずきに私の車が暪転しないように、おおよその䜍眮に配眮する必芁がありたす私はこのようにしなければなりたせんでした



画像



画像



別の方法でそれを䜜るこずができたす、それはすべお私たちの䜓のBox Colliderの幟䜕孊的な寞法に䟝存するので、重心を詊しおください、しかし、最初にスクリプトを远加しおください

  1. 倉数を宣蚀したすpublic Transform COM。
  2. GOの重心をスクリプトのCOMフィヌルドにドラッグしたす。
  3. Start関数内で、次の行を蚘述したすrigidbody.centerOfMass = COM.localPosition


これで、[再生]をクリックしお結果を確認できたす。



5.ホむヌルを「埩掻」させる



さお、私はこのレッスンで最も興味深いトピックであるず同時に、やや耇雑なトピックである私の意芋では最埌に到達したした。



ホむヌルを埩掻させるために、各固定フレヌムの回転の䜍眮ず角床を蚈算する必芁がありたす。すばらしいWheelCollider、そのGetGroundHitメ゜ッドは、コラむダヌず地圢の接觊点を含むWheelHit構造を返すこずができたす。可倉ポむント。 GetGroundHitメ゜ッドのおかげで、サスペンションスプリングの動きに基づいおホむヌルの䜍眮を蚈算できたす。 さお、回転角床に぀いおは非垞に簡単です。WheelColliderにはfloat倉数rpmがあり 、これは1分あたりの回転の省略圢です。これに基づいお、ホむヌルの回転角床を決定できたす。



スクリプト自䜓に枡したす。スクリプトは倧きくなり、厚くなっお、次のようになりたす。

 using UnityEngine; using System.Collections; public class CarController : MonoBehaviour { public WheelCollider[] WColForward; public WheelCollider[] WColBack; public Transform[] wheelsF; //1 public Transform[] wheelsB; //1 public float wheelOffset = 0.1f; //2 public float wheelRadius = 0.13f; //2 public float maxSteer = 30; public float maxAccel = 25; public float maxBrake = 50; public Transform COM; public class WheelData{ //3 public Transform wheelTransform; //4 public WheelCollider col; //5 public Vector3 wheelStartPos; //6 public float rotation = 0.0f; //7 } protected WheelData[] wheels; //8 // Use this for initialization void Start () { rigidbody.centerOfMass = COM.localPosition; wheels = new WheelData[WColForward.Length+WColBack.Length]; //8 for (int i = 0; i<WColForward.Length; i++){ //9 wheels[i] = SetupWheels(wheelsF[i],WColForward[i]); //9 } for (int i = 0; i<WColBack.Length; i++){ //9 wheels[i+WColForward.Length] = SetupWheels(wheelsB[i],WColBack[i]); //9 } } private WheelData SetupWheels(Transform wheel, WheelCollider col){ //10 WheelData result = new WheelData(); result.wheelTransform = wheel; //10 result.col = col; //10 result.wheelStartPos = wheel.transform.localPosition; //10 return result; //10 } void FixedUpdate () { float accel = 0; float steer = 0; accel = Input.GetAxis("Vertical"); steer = Input.GetAxis("Horizontal"); CarMove(accel,steer); UpdateWheels(); //11 } private void UpdateWheels(){ //11 float delta = Time.fixedDeltaTime; //12 foreach (WheelData w in wheels){ //13 WheelHit hit; //14 Vector3 lp = w.wheelTransform.localPosition; //15 if(w.col.GetGroundHit(out hit)){ //16 lp.y -= Vector3.Dot(w.wheelTransform.position - hit.point, transform.up) - wheelRadius; //17 }else{ //18 lp.y = w.wheelStartPos.y - wheelOffset; //18 } w.wheelTransform.localPosition = lp; //19 w.rotation = Mathf.Repeat(w.rotation + delta * w.col.rpm * 360.0f / 60.0f, 360.0f); //20 w.wheelTransform.localRotation = Quaternion.Euler(w.rotation, w.col.steerAngle, 90.0f); //21 } } private void CarMove(float accel,float steer){ foreach(WheelCollider col in WColForward){ col.steerAngle = steer*maxSteer; } if(accel == 0){ foreach(WheelCollider col in WColBack){ col.brakeTorque = maxBrake; } }else{ foreach(WheelCollider col in WColBack){ col.brakeTorque = 0; col.motorTorque = accel*maxAccel; } } } }
      
      







それをコピヌし、スクリプトに貌り付けおから、階局タブでCarオブゞェクトを遞択したす。むンスペクタヌでわかるように、スクリプトに新しい倉数ず配列がありたす。前茪ず埌茪をそれぞれwheelsFずwheelsB配列に転送する必芁がありたすwheelsずnot Wheel Collier's[再生]をクリックする方法。 ホむヌルが地圢の䞋にある堎合、倉数wheelRadiusの倀を倉曎するず、コラむダヌの半埄ずほが䞀臎するはずです。



そのため、奇跡が起こるはずです。車茪は実際の車茪ず同じように回転し、地圢の隆起に反応したす。



画像



それらが間違った方向たたは他の方向に回転しおいる堎合は、車を䜜成したステップ1をもう䞀床お読みください。Z軞に沿っお車茪を正確に90床回転させるこずが重芁であるず述べたした。その理由を説明したす。 スクリプトを分析したしょう。

  1. 車茪の倉圢を保存する配列を䜜成したす。
  2. これらの倉数は私たちにずっお有甚です。その理由を以䞋で説明したす。
  3. 各ホむヌルに぀いお必芁な情報を含むクラスを䜜成したしょう。
  4. ホむヌルを倉圢したす。
  5. Wheel Collider Wheels;
  6. ホむヌルの開始䜍眮。
  7. ホむヌルの回転角床。
  8. WheelData型でホむヌルの配列を宣蚀したす。
  9. 必芁なデヌタをwheels配列に枡したす。このために、SetupWheels関数を䜜成したした。
  10. SetupWheels関数は、ホむヌルずそのWheelColliderの倉換を受け入れ、必芁なデヌタをWheelDataクラスに含たれる倉数に枡し、それを返したす。
  11. ホむヌルの回転の䜍眮ず角床を蚈算するUpdateWheels関数を䜜成したす。
  12. ホむヌルの回転が時間内に均等に匕き䌞ばされるように、必芁なTimeクラスの倉数fixedDeltaTimeを芚えおいたす。
  13. ホむヌル配列の各芁玠に察しお、次の操䜜を実行したす。
  14. クラス倉数WheelHitを䜜成したす䞊で説明したした。
  15. ホむヌルのロヌカル䜍眮を芚えおいたすロヌカル䜍眮は芪座暙に盞察的な䜍眮で、グロヌバルは䞖界に盞察的です。
  16. ホむヌルのWheelColliderが地圢たたは䜕かの衚面ず衝突した堎合。
  17. 次に、コラむダヌがテレむンサヌフェスず接觊するポむントの開始点hit.pointず珟圚のホむヌル䜍眮の終了点w.wheelTransform.positionの間、およびCarオブゞェクトに察しお䞊向きのベクトルの間のホむヌルのロヌカル䜍眮のY座暙からDotを枛算したすtransform.upそしお、これらすべおからwheelRadius倉数も枛算しお、ホむヌルが適切な堎所になるようにしたす。 䞊蚘から単語を理解しなかった堎合、ほずんどの人がこれを初めお理解しないので、萜胆しないでください。これは、 ドット補品が䜕であり、それが䞊蚘のベクトルにどのように関連するかを知る必芁があるか、ホむヌル䜍眮をそのように蚈算する必芁があるこずを知っおいるだけです;
  18. WheelColliderがテレむンサヌフェスに觊れない堎合。 次に、ホむヌルの初期ロヌカルポゞションのY座暙からwheelOffsetを取り陀きたす。これにより、車が高さから萜ちたり、「埌ろ」に暪たわっおいるずきに、ホむヌルが未知の方向に飛び去るこずがありたせん。
  19. ホむヌルの倉曎された䜍眮を珟圚の䜍眮に適甚したす。
  20. MathfクラスのRepeat関数を䜿甚しおホむヌルの「回転」角床を蚈算したす。この関数は、角床を0〜360床の範囲に保぀のに圹立ちたす。あたり掗緎されおいない匏w.rotation + delta * w.col.rpm * 360.0f / 60.0fここで、実際に珟圚の回転角床にコラむダヌに保存されおいる1分あたりの回転数を掛けた時間デルタに360/60を掛けたす。
  21. 結果を珟圚のロヌカル回転角床に適甚したす。 クォヌタニオンクラスのオむラヌ関数はこれに圹立ちたす。オむラヌ角床でクォヌタニオンを返したすただし、クォヌタニオンずいう単語が怖い堎合は、ロヌカル回転角床ずグロヌバル回転角床を栌玍する構造ずしお抜象化しお扱うこずをお勧めしたすそれはそれが完党に異なるこずを意味したす、ここでは正確に䜕を䌝えるのではなく、単に理解しやすいでしょう。 最初の匕数X軞の呚りの角床は蚈算されたホむヌルの「回転」角床を転送し、2番目の匕数Y軞の呚りの角床はコラむダヌの回転角床を送信し、3番目の匕数Z軞に沿った角床、これで段萜1で重芁だった理由がわかりたしたホむヌルをZ軞の呚りで正確に回転させたす定数90.0fを裏切りたす。




おわりに



さお、Unity3Dで通垞の車のメカニックを構築する方法に぀いおお話しできるのはこれだけです。䞊蚘のすべおを読んで理解した埌、すぐにレヌスシミュレヌタヌを䜜るこずができたす。



レッスンの次の郚分では、玄束したように、戊車トラックの仕組みを構築する方法に぀いお説明したす。たた、3D゚ディタヌでモデル化する方法ず、そこからモデルを゚クスポヌトしおUnityにむンポヌトする方法に぀いおも説明したす。圓然、匷制的にシミュレヌトするこずはありたせんこのデモで芋たものですが、既補のモデルを提䟛したす。 Unity3dの孊習にご関心をお寄せいただきありがずうございたす。



>>レッスン2



All Articles