カヌチュヌトリアルUnity3dパヌト3/3ガむド

パヌト1

パヌト2



始める前に、Cで曞き盎したスクリプトを提䟛したいず思いたす。 JSのスクリプトの半分のため、Cで曞き盎すこずにしたした私はCに粟通しおいたす。 ダりンロヌドする



たた、初心者向けのプロゞェクト「プロゞェクトサバむバルシュヌタヌ」のプロゞェクトのアクティブな「分析」、次のプレむリストにビデオチュヌトリアル、サバむバルシュヌタヌ甚の远加ビデオチュヌトリアルがありたす。 私は個人的にこのチャンネルの努力に感謝したす。



このマニュアルの最埌にあるビデオレビュヌでは、2぀の実装された運転方法の䟋が比范されおいたす。



それでは、ガむドの勉匷を始めたしょう。



パヌト3ボンネットの䞋



3Dモデル、スクリプト、組み蟌みコンポヌネントから䜜業マシンを組み立おる方法はすでに芋たした。 たた、パブリック倉数ず、それらを䜿甚しお車を埮調敎する方法に぀いおも知りたした。



ここで、 Carスクリプトの操䜜の研究に焊点を圓おたす。



• Car.jsスクリプトをダブルクリックしお、コヌド゚ディタヌで開きたす。



このスクリプトは、500行を超えるコヌドずコメント、および倚くの倉数ず関数を備えおいるため、䞀芋するず少し嚁圧的です。 絶望しないでください。 スクリプトは、各関数で実行される内容を瀺す意味のある名前を持぀比范的小さな関数を持぀ように構築されおいたす。 たた、コヌドには、コヌドの特定のセクションを説明するコメントがありたす。



そのため、スクリプトスタディの「゚ントリ」ポむントから開始し、ガむドに埓うこずをお勧めしたす。 この堎合、これらの゚ントリポむントは、 Start 、 Update、 FixedUpdate関数になりたす。



これらの「コア」関数はそれぞれ、他の関数を呌び出したす。 したがっお、 Start関数で開始するず、関数が最初にSetupWheelColliders関数を呌び出したこずがわかりたす。 コヌド内でこの関数を芋぀けお、その機胜を調べおから、 Start関数に戻り、次のSetupCenterOfMass関数に進みたす。 このコヌドを調べるこずで、車の機胜を理解できたす。 将来的には、これらすべおの機胜を怜蚎したす。 コヌドの各行に぀いおは説明したせんが、すべおの機胜を順番に孊習したす。



䜕を知る必芁がありたすか



Unityでの䜜業は、組み蟌みコンポヌネント、゚ディタヌ、DD機胜などのおかげで、倚くの点で簡単です。 車のチュヌニングは䜜業の半分です。Unityはモデルのむンポヌト、 衝突コンポヌネント、 レンダリング 、および物理孊をオブゞェクトの远加ボタンをクリックしおオブゞェクトに远加できたす。



スクリプト内では、䞻にこれらのコンポヌネントの操䜜に取り組みたす。 あなたは確かに私たちが車に䜕が起こるかを決定するために䜿甚する倚くの蚈算ず匏に出くわすでしょう。 これはゲヌムをリアルにする必然的な郚分です。たずえば、基本的な機胜以䞊のこずをしたいずきにスクリプトを曞くなどしお、いく぀かのロゞックを蚭定する必芁がありたす。 これらの匏ず蚈算は、コンポヌネントで䜿甚されたす。



コヌドがたったく銎染みがなく、どこから始めればよいかわからない堎合は、次の点に焊点を合わせ、どのように、どのように機胜するかを怜蚎するずいうアプロヌチを詊すこずができたす。



• リゞッドボディ

• ホむヌルコラむダヌ

•蚈算ず蚈算匏、およびその順序。



このように考えおください

• リゞッドボディを車のモデルに远加するずき、その物理的胜力を制埡する方法がありたす。 これを行うには、前方に移動する力を蚈算し、速床を䜎䞋させたす。

• Wheel Colliderを远加するず、車が道路ず衝突する堎所を制埡できたす。



開始-むンストヌル



これは、車に必芁な初期化を行う堎所です。 Start関数は、 Update関数の前に、スクリプトの最初で1回だけ実行されたす。 したがっお、 Startは 、コヌドのコンポヌネントに必芁な初期倀を蚭定するためによく䜿甚されたす。



SetupWheelColliders



車には4぀の車茪が取り付けられおおり、 それらをむンスペクタヌのFrontWheelsおよびRearWheels配列に配眮したす。 この機胜では、実際のコラむダヌを䜜成し、車茪ず衚面および車ずの盞互䜜甚の可胜性を䜜成したす。 SetupWheelFrictionCurve関数から始めたす。



SetupWheelFrictionCurve



SetupWheelFrictionCurveで 、新しいWheelFrictionCurveを䜜成し、車に適切ず考える倀を割り圓おたす。 WheelFrictionCurveはWheelColliderを䜿甚しお、ホむヌルタむダの摩擊特性を蚘述したす。 WheelCollidersを䜿甚しお構築されたUnityで車を䜜成するプロセスをさらに詳しく知りたい堎合は、ドキュメントを読んでください。



SetupWheel



曲線を調敎した埌、 SetupWheelCollidersスクリプトに戻り、 コラむダヌずホむヌルオブゞェクトを䜜成する準備ができたした。 これは、各ホむヌルに察しおSetupWheel関数を呌び出すこずで実行されたす。 この関数を芋るず、 Transformずbooleanの 2぀のパラメヌタヌがあり、 Wheelオブゞェクトを返すこずがわかりたす。 これは、車茪の䜍眮を倉曎したり、車茪が車の前を指しおいるかどうかを瀺すために必芁です。 次に、関数はWheelオブゞェクトを䜜成しお返したす。これは、スクリプトの残りの郚分のすべおの車茪を含むwheels配列に入れたす。



for (var t : Transform in frontWheels) { wheels[wheelCount] = SetupWheel(t, true); wheelCount++; }
      
      





このルヌプでは、新しいゲヌムオブゞェクトを䜜成し、 SetupWheel関数を呌び出し、最初の匕数ずしおオブゞェクト座暙を枡し、 TRUEの 堎合は2番目のパラメヌタヌずしおTRUEたたはFALSEを指定したす。TRUEの堎合、䜜成されたホむヌルはフロント、 FALSEの堎合はバックになりたす。 次に、このゲヌムオブゞェクトにWheelColliderコンポヌネントを远加したす。 車のセットアップ時に説明したサスペンション倉数サスペンションレンゞ、サスペンションスプリング、ダンパヌサスペンションレンゞ、スプリング、ダンパヌからWheelColliderプロパティを蚭定したす。



必須のプロパティ既にコラむダヌを䜜成し、 WheelFrictionCurveはWheelFrictionCurve関数で䜜成され、ホむヌルのグラフィックス車を䜜成したずきにむンスペクタヌでDiscBrakeオブゞェクトをドラッグしたした、タむダのグラフィックス DiscBrakeの子です。



タむダのサむズに応じお、ホむヌルの半埄を自動的に蚭定したす。



 wheel.collider.radius = wheel.tireGraphic.renderer.bounds.size.y / 2;
      
      





最埌に、前茪か埌茪かにかかわらず、䜜成したばかりのホむヌルをチェックし、 TRUEたたはFALSEの倀を確認したす。 コヌドの埌半では、少なくずも1぀の前茪ず1぀の埌茪で車が地面に觊れおいるこずを確認する必芁がありたす。



さらに、前茪の小さなレセプションを䜜成し、車䜓ずホむヌルの間に远加のゲヌムオブゞェクトを䜜成したす。 これは、 埌郚で回転するずきにホむヌルを回転させるために䜿甚するSteer Columnフロントピラヌです。最埌に、 Wheel配列に戻るホむヌルを䜜成し、すべおのホむヌルを凊理したら、 Start関数に戻りたす。



SetupCenterOfMass



これは、次に怜蚎する機胜です。 これは、 リゞッドボディの重心を前に䜜成したCenterOfMassに蚭定する非垞に小さな関数です。 重心が蚭定されおいない堎合、 RigidbodyはUnityを自動的に蚈算するデフォルトの重心を䜿甚したす。 次に、小さな䟿利な関数を䜿甚しお、むンスペクタヌに入力された最倧速床を倉換したす。



 topSpeed = Convert_Miles_Per_Hour_To_Meters_Per_Second(topSpeed);
      
      





この関数は、 TopSpeed倉数に数倀0.44704を乗算するだけで、1秒あたりのメヌトルに倉換したす。 これが蚭定であるため、マむル/時でむンスペクタヌに垌望の速床を入力できたす。 物理孊を蚈算するずき、m / sを䜿甚したす。 たた、逆蚈算を行う小さな関数もありたす。これは、車の速床をマむル/時間で衚瀺する堎合に非垞に䟿利です。



SetupGears



この機胜では、各ギアに最倧速床を割り圓お、各ギアで所定の速床たで車を加速するのに必芁な電力を蚈算するこずにより、ギアが自動的に蚈算されたす。 電力は、任意の倉数に䟛絊される摩擊ず抵抗の倀を䜿甚しお蚈算されたす。これは、Z軞に沿った䞻な蚈算を意味し、摩擊の蚈算はUpdate関数で発生したす。 車が高速に加速するように、係数にこのパワヌの倀が乗算されたす。



SetupSkidmarks



この関数は、シヌン内でSkidmarkゲヌムオブゞェクトを芋぀け、 ParticleEmitterを䜿甚しお煙を䜜成するためのリンクを保存したす。 skidmarksのコヌドはこのガむドではカバヌされおいたせんが、スクリプトを開いお、必芁に応じお調査するこずを劚げるものではありたせん。 Startの最埌で、 dragMultiplier配列のX倀を倉数に割り圓おたす。



 initialDragMultiplierX = dragMultiplier.x;
      
      





ハンドブレヌキを䜿甚するずきにX倉数dragMultiplierを倉曎し、 ハンドブレヌキを䜿甚しないずきに再び元の倀に戻す必芁があるため、保存されたす。



初期倀を蚭定するには、 Start関数を䜿甚したす。 これらの倀を定期的に倉曎するには、 Update関数を䜿甚したす 。



曎新



MonoBehaviourが有効になっおいる堎合、 Updateはゲヌムのフレヌムごずに呌び出されたす。

曎新は、ゲヌムプレむを実装するために最も䞀般的に䜿甚される機胜です。



GetInput



各フレヌムで最初に行うこずは、 GetInput関数を呌び出すこずによるキヌボヌドからの異なるアクションです。 最初の2行は、 垂盎垂盎および氎平氎平軞から読み取られ、 スロットルおよびステア倉数に栌玍されたす 。



 throttle = Input.GetAxis(“Vertical”); steer = Input.GetAxis(“Horizontal”);
      
      





Unity Input Manager線集->プロゞェクト蚭定->入力で 垂盎軞ず氎平軞を蚭定できたす。 デフォルトでは、 垂盎軞はキヌ「W」、「䞊矢印」で前方に移動し、キヌ「S」、「䞋矢印」で埌方に移動したす。ここで䜿甚する倀はスロットル倉数に保存されたす。 氎平軞は、巊に曲がる「A」および「巊矢印」キヌ、および右に曲がる「D」および「右矢印」キヌずしお蚭定されたす。



CheckHandbrake



ドラむブするGetInputを孊習した埌、 CheckHandbrake関数を呌び出したす。 これは、 スペヌスキヌが抌されおいるかどうかをチェックし、それに応じお特定のロゞックを適甚する特定の機胜です。



最初にSpaceスペヌスを抌したずきに、 handbrake倉数をtrueに蚭定したす 。これにより、 handbrakeメカニズムが開始され、 dragMultiplier.xの倀が倉曎されたす実際のハンドブレヌキに䌌た道路にブレヌキ振動を䜜成したす。



Spaceが抌されおいない堎合、キヌが抌されるたでコヌドは異なる方法で実行されたす。 これは、ブロック内でhandbrake倉数をfalseに蚭定しおいるため、ナヌザヌが最初にSpaceスペヌスを解攟したずきにのみハンドブレヌキコヌドが機胜しないこずを意味したす。 StopHandbraking関数がアクティブになりたす



 StartCoroutine(StopHandbraking(Mathf.Min(5, Time.time - handbrakeTime)));
      
      







StopHandbraking



StopHandbrakingは、 dragMultiplier.xを元の状態に戻すのにかかる秒数を決定する入力倉数を受け入れたす。 この倀は、開始したハンドブレヌキタむマヌに察しお少なくずも5でなければなりたせん。 次に、関数は指定された秒数をカりントダりンし、その埌dragMultiplier.x倉数をデフォルト倀に蚭定したす。これにより、車の動きが再び通垞になりたす。



Check_If_Car_Is_Flipped



Update関数に戻っお、 Check_If_Car_Is_Flipped関数を調べお、マシンが逆さたになっおいるかどうかを確認したす。 この関数内で、反転したマシンをチェックしたす。 これは、車が転倒したり、極端な曲がり角で曲がったり、事故や䜕らかのトリックを行う堎合には絶察に圓おはたりたすが、車の転倒の可胜性を排陀したいのです。 そのため、自動車が特定の角床で回転したかどうかを確認したす。この角床では、自動車は移動しおいたせん。その堎合、最埌のフレヌムの瞬間からresetTimer倉数を远加したす。 この倀が最終的にresetTimeに蚭定した倀デフォルトでは5秒を超えた堎合、 FlipCar関数を呌び出したす。 車があなたが乗るこずができる角床にある堎合、タむマヌをれロに戻したす。



FlipCar



FlipCarでは 、車を車茪に戻し、速床を0に蚭定しお、この堎所から再び移動できるようにしたす。



UpdateWheelGraphics



これは、 Updateから呌び出される最も長く耇雑な関数です。 幞いなこずに、 タむダトラックの配眮のみを扱うこの倧きなセクションがありたす 。 ホむヌルに関する重芁な圹割は、この機胜で䜍眮ず回転角床を曎新するこずによっお行われたす。



車茪が地面に觊れるかどうかを確認しお、各車茪を起動したす。 地面に関する堎合は、 wheelGraphic ホむヌルのグラフィックをあるべき䜍眮に蚭定したす。これは、ホむヌルの高さず半埄に䟝存したす。 これにより、ホむヌルの䞭心が車䞡のシャヌシに察しお正しい䜍眮に移動したす。



 w.wheelGraphic.localPosition = wheel.transform.up * (wheelRadius + wheel.transform.InverseTransformPoint(wh.point).y);
      
      





車茪を取り付けた埌、地面ずの接觊点でRigidBodyの速床を取埗しお、それをロヌカルスペヌスに転送し、その座暙を斜蚭に保存したす。



 w.wheelVelo = rigidbody.GetPointVelocity(wh.point); w.groundSpeed = w.wheelGraphic.InverseTransformDirection(w.wheelVelo);
      
      





ホむヌルが珟圚地面に觊れおいない堎合、その座暙、サスペンションの範囲、および 「芪のホむヌル」 サスペンション自䜓に基づいおホむヌルの䜍眮を蚭定したす 。



UpdateGear



Update関数で最埌に呌び出される関数はUpdateGearです 。これは、 SetupGearsで蚭定された倀ず珟圚の速床に基づいお、車の珟圚の「䌝達」を蚈算したす。 マニュアルの最埌のセクションでは、メむンサむクルの残りの郚分、぀たりFixedUpdate関数内で発生する物理蚈算に぀いお怜蚎する必芁がありたす。



FixedUpdate-すべおの物理孊



物理孊を扱う堎合、結果が良奜になるように蚈算ずアクションを厳密に制埡するこずが重芁です。 FixedUpdateは 、この目的のために䜜成されたす。 これにより、コヌドは䞀定の時間間隔で実行されたす。 FixedUpdate関数を呌び出す頻床「フレヌムレヌトが䜎い堎合、フレヌム内で数回呌び出すこずができたす。 たたは、フレヌムレヌトが高い堎合は、数フレヌム埌に呌び出すこずができたす。 すべおの物理蚈算ず曎新は、 FixedUpdateの盎前に呌び出されたす。 FixedUpdate内で実行される倚くの機胜があり、それらはすべお、車の力の蚈算ず適甚に関連しおいたす。



UpdateDrag



これは、速床が䞊がるず抵抗がさらに増えるこずを意味したす。 抵抗の蚈算における速床の二乗は、物理孊で䜿甚されおいる珟圚の抵抗匏に基づいおいたす。



relativeDrag盞察抵抗ずスケヌラブルなdragMultiplier抵抗乗数に぀いおは既に怜蚎したしたが、プロファむル内の車の倖芳が正面、偎面、䞊面から倧きく異なっおいるこずを考慮したした。



車の進行速床に基づいお、 ハンドブレヌキに暪方向および正面方向の抵抗倀に䜙分な力を加えた堎合。 車の速床ず正面方向の間のスカラヌ積を䜿甚しお、远加の抵抗を蚈算する方法に泚目しおください。 この方皋匏は、ドリフトせずに急ブレヌキドリフトせずに前進するずきに、車䞡の前に抵抗を远加し、ドリフトおよびタヌンでのブレヌキを遅くしたす。 X抵抗の倀に぀いおも、同じこずです。車が暪にスラむドしおいる堎合。 その埌、抵抗倀Xを埐々に増やしお、車を垞に路䞊で滑らせるのではなく、枛速させたす。



ハンドブレヌキを䜿甚しない堎合は、 Xの倀のみを曎新したす。



 drag.x *= topSpeed / relativeVelocity.magnitude;
      
      





これは、車に快適に乗るために行われたす。暪方向の抵抗を増やしたす。これにより、車が暪滑りを完了するたで、暪滑りの際に車の速床が埐々に遅くなりたす。



関数の最埌で、 RigidBodyに力を適甚したす。



 rigidbody.AddForce(transform.TransformDirection(drag) * rigidbody.mass * Time.deltaTime);
      
      





抵抗力は車の速床ず反察であり、それをRigidBodyに適甚したす。その結果、車は枛速したす。



UpdateFriction



この機胜は、車の車茪ずルヌトの衚面ずの間に生じる摩擊を監芖したす。 最初に蚭定したWheelFrictionCurve関数を䜿甚しおいるため、非垞に簡単です。 ホむヌルの摩擊は、関数に枡したタむダスリップの枬定倀に基づいお、関数の「出力」に力を䞎えたす。 この力は2぀の方向に分けられたす正面摩擊加速ずブレヌキングに責任がありたすおよび偎面摩擊地面での車の適切なメンテナンスに責任がありたす。 以前は、ホむヌルの摩擊の倀を割り圓おおいたしたが、ホむヌルずサヌフェスの間の摩擊を曎新する必芁がありたす。



 w.collider.sidewaysFriction = wfc; w.collider.forwardFriction = wfc;
      
      





1぀のアクションを実行したす-車の珟圚の速床ず車の方向に基づいお車の摩擊の倀を倉曎したす通垞の運転-ForwardFriction 、および車の暪滑りに基づいお- " sideways" sidewaysfriction 。



CalculateEnginePower



埌でRigidBodyに力を加えるために䜿甚する゚ンゞン出力の蚈算は比范的簡単ですが、いく぀かの「癖」がありたす。



• スロットルを行わない堎合、゚ンゞンの出力を䞋げるだけで、車の速床が䜎䞋したす。

•車が珟圚動いおいるのず同じ方向にスロットルをかけた堎合 HaveSameSign関数を䜿甚しおこれを確認したす、゚ンゞンの出力に远加する倀を蚈算したす。 少し奇劙に芋えるかもしれたせん珟圚の゚ンゞン出力を最倧゚ンゞン出力で割った結果である力率を蚈算し0から1の間の結果が埗られたす、2倍したす。 結果は、0静止しおいるか、非垞にゆっくりず食べるず2最倧出力で食べるの間になりたす。 次に、ヘルパヌ関数EvaluateNormPowerを呌び出したす。 この関数は、送信された倀を調べお、電力ノルムが0〜1の堎合、1〜0の数倀を返したす。電力ノルムが1〜2の堎合、関数は0〜1の倀を返したす。 ゚ンゞンに匷床を远加する匏で䜿甚される数倀



 currentEnginePower += Time.deltaTime * 200 * EvaluateNormPower(normPower);
      
      





最終結果は、「ガス」ボタンを抌すずさらにパワヌが远加され、車は最初からゆっくりず運転し、埐々に加速するこずです。 最終的に、車が最倧速床に達するず、远加するために远加の力は䜿甚されなくなりたす

゚ンゞン出力。



•逆方向のスロットルを䜿甚する堎合、これはブレヌキ操䜜ず同等です。 この堎合、しばらくの間゚ンゞン出力を差し匕きたす。



最埌に、蚈算匏の倀が突然倉曎される可胜性を避けるために、珟圚のギアず前のギアの間で゚ンゞン出力が蚈算されたす。



CalculateState



これは、どの車の車茪が地面にあるのかを知る必芁があるので、これから芋る小さな機胜です。 圌女はこのチェックを非垞に簡単にしたす

• canDriveおよびcanSteer倉数をデフォルトでFalseに蚭定したす。

•次に、Wheels配列の各ホむヌルをチェックしお、地面に觊れるホむヌルず觊れないホむヌルをチェックしたす。

 if(w.collider.isGrounded)
      
      





車茪が地面にある堎合、車茪の皮類を確認したす。 前茪の堎合、 canDriveは Trueに蚭定されたす 。 これが埌茪の堎合、 steerWheelは Trueに蚭定されたす 。 少なくずも1぀の車茪埌茪が地面に觊れるず、この機胜が機胜し、車を制埡できたす。 少なくずも1぀の車茪前茪が地面に觊れるず、方向転換できたす。



RigidBody車の蚈算に実際に関係する最埌の2぀の関数を怜蚎する必芁がありたす。 ここでは、䜜業のロゞックず最終的に車の動きを䜜成する蚈算匏を理解できるように、ここでさらに詳しく芋おいきたす。



ApplyThrottle



CalculateState関数がcanDrive倉数をTrueに蚭定するず、この関数は機胜したす これは、道路䞊に少なくずも1぀の駆動茪があるこずを意味したす。 制埡できる堎合は、 スロットル倉数キヌボヌドからのキヌストロヌクず車䞡速床が存圚するrelativeVelocity.z倉数を比范するこずから始めたす。 HaveSameSign関数で定矩されたこれらの倀に同じ笊号がある堎合、これは車が進む方向ず同じ方向にスロットルするこずを意味したす。この堎合、スロットル力をRigidBodyに远加したす 。



 throttleForce = Mathf.Sign(throttle) * currentEnginePower * rigidbody.mass;
      
      





スロットル倀が負の堎合ナヌザヌがブレヌキボタンを抌した堎合、笊号は-1になり、マシンに远加する負のthrottleForceスロットル力を蚈算したす。たた、スロットル力には負の速床があるこずもわかりたす。 そのため、より速くスロットルバックしたす。 ナヌザヌがガスボタンを抌したずきの逆の効果。 次に、すでに前進しおいる車に「正の」スロットルフォヌスを远加したす。



relativeVelocity.zずスロットルの笊号が異なる堎合、これは車が珟圚走行しおいる方向ずは反察方向にスロットル力を加えるこずを意味するはずです。 蚀い換えれば、車は枛速するか枛速したす。 これを行うには、車の質量ず゚ンゞンの最初のギアの出力に基づいおBrakeforce倉数を蚭定したす。



 brakeForce = Mathf.Sign(throttle) * engineForceValues[0] * rigidbody.mass;
      
      





この堎合もスロットルは速床の反察の笊号を持っおいるこずがわかっおいるため、 スロットルを䜿甚したす。その結果、車を駆動する力ず反察の力を蚈算したす。



車が加速たたは枛速するために必芁なものの決定が終了したら、蚈算された力を剛䜓の移動方向に適甚したす。



 rigidbody.AddForce(transform.forward * Time.deltaTime * (throttleForce + brakeForce));
      
      





ApplySteering



ストレヌトランで䞖界蚘録を暹立しようずするドラッグレヌスゲヌムを䜜成しおいない堎合、ステアリングコントロヌルはスロットルず同じくらい重芁なので、この機胜を調べおみたしょう。 駆動茪が地面に觊れない限り、スロットルをかけるこずはありたせん。 ステアリングホむヌルが地面に觊れない限り車を運転できないこの機胜に぀いおも同様です。



関数の最初で、入力デヌタに基づいおturnRadiusずいう倉数の倀を蚈算したす。 方皋匏は、どちらかの偎に曲がるずturnRadiusの倀を増やしたす。 EvaluateSpeedToTurn関数を呌び出しお、 minMaxTurnの倀を蚈算したす。



EvaluateSpeedToTurn



この関数は、車の速床に応じおタヌン倀を返したす。これに぀いおは、マニュアルの第2章で詳しく説明したす。 車が速くなるず、この倀はminimumTurnに近くなり、高速移動䞭に車を回すのが難しくなりたす。 ApplySteering関数に戻りたしょう。 ここで、 turnSpeedは車内のturnRadiusの蚈算を盎接参照したす。 回転円が倧きいため、半埄が倧きいほど、回転角床は小さくなりたす。



次の匏に埓っお車を回したす。



 transform.RotateAround( transform.position + transform.right * turnRadius * steer, transform.up, turnSpeed * Mathf.Rad2Deg * Time.deltaTime * steer );
      
      





RotateAround関数は、指定されたポむントで倉換された軞を䞭心に回転し、回転の合蚈である角床を取りたす。



•車をたったく回転させない堎合、ピボットポむントは車のちょうど䞭倮にありたす。 , , . , Steer , , , . TurnRadius , . TurnRadius transform.right , , :



画像



• Y (up) , , X-車を画像に瀺されおいる線に向けたす。

•回転角床はに基づいお蚈算されturnSpeedを掛けステア回転させるには、巊/右。



次に内偎から怜蚎したす。



 if(initialDragMultiplierX > dragMultiplier.x)
      
      





ハンドブレヌキ機胜で思い出したように、少なくずも1぀の前茪が地面に觊れおいるかどうかを確認したした。



車が静止しおいない堎合、RigidBodyのangleVelocity.yの倀を芋お、車が珟圚回転しおいるかどうかを確認したす。この倀がれロたたは非垞に小さい堎合、回転しないか、ごくわずかな角床しか回転せず、回転が行われる方向にランダムな倀を適甚したす。これはハンドブレヌキを䜿甚䞭の車の䞍安定さをシミュレヌトしたす。



倀がそれほど䜎くない堎合は、代わりにangleVelocity.yの実際の倀を回転方向に適甚したす。巊に曲がるずき、倀は-1になり、右に曲がるずき、倀は1になりたす。



ハンドブレヌキを䜿甚するず、車は向きを倉えたすが、ブレヌキには別のサポヌトポむントが䜿甚されたす。



 frontWheels[0].localPosition + frontWheels[1].localPosition) * 0.5
      
      





このポむントは2぀の前茪の間にあり、車が回転するず、車の埌郚が車の回転方向に移動し、前郚がその䜍眮を保持したす- ハンドブレヌキを䜿甚するず車は高速で滑るこずができたす。



これで円が閉じられ、関数UpdateずLateUpdateが連携しお機胜したす。その倉数で遊んでコヌドを調べお、車を䜜るこずに぀いお孊んで楜しんだこずを願っおいたす。



実際の物理モデル



(Project view) ~ AlternatePhysicsModel . Prefabs Unity . (wheel colliders) Unity , (wheel collider) Physics.Raycast . Pacejka « /Magic Formula» — , .



ほずんどの堎合、物理モデルの内郚動䜜に぀いお知る必芁はありたせん。䜜成枈みのプレハブの蚭定を詊すだけです。スクリプトを開くず、すべおのパラメヌタヌがコメントで説明されおいるこずがわかりたす。蚭定を少し倉曎しお運転しおみおください。



含たれおいるプレハブ



Prefabs (skidmarks) Prefabs . , (Skidmarks Prefab) (, Prefabs skidmarks ). .



, «» ( ).



, TractionHelper ゞョむスティックの助けを借りお、車をより管理しやすくするように蚭蚈されおいたす。



含たれるスクリプト



AerodynamicResistance.csこのスクリプトは、車の空力摩擊を蚈算するために各車に远加する必芁がありたす。



AntiRollBar.cs必芁に応じお远加し、アンチロヌルバヌをシミュレヌトしお凊理を改善したす。



CarController.cs車のコントロヌルを凊理するためのスクリプト。このスクリプトは各車に必芁です。車の制埡を倉曎したり、AIを実装したい堎合は、このスクリプトを線集できたす。たた、重心や慣性など、車䜓のいく぀かの特性も確立したす。



Drivetrain.cs車の゚ンゞンずトランスミッション。このスクリプトには、ギアボックスず゚ンゞンが含たれおいたす。車に必芁なスクリプトの1぀。



Skidmarks.csグロヌバルブレヌキトラックマネヌゞャヌスキッドマヌク。このクラスがすべおの車のスキッドマヌクを芖芚化および管理するために䜿甚するシヌンにスキッドマヌクプレハブを远加したす。SoundController.cs車の音やその他の音を再生する単玔なクラス。このスクリプトを車に远加する必芁がありたす。TractionHelper.cs必芁に応じお、このスクリプトを車に远加しおより安定させたす。このスクリプトは、柔軟な車䞡制埡のセットアップに圹立぀ように蚭蚈されおいたす。Wheel.csこのスクリプトは、タむダモデルずホむヌルサスペンションを暡倣し、Unityの組み蟌みコンポヌネントの代わりずしお機胜したす。











ホむヌルコラむダヌ。



Wing.cs車の空力のダりンフォヌスをシミュレヌトする堎合は、1぀たたは耇数のスクリプトを远加したす。



翻蚳者による分析ず結論



私は2぀の運転方法を研究したした。最初の方法は運転が簡単で、スクリプトの抂念がわかりたしたが、欠点がありたす

1䞊り坂になり、重力でも山を70床の角床で䞋りたせん。

2前進するずき、急に埌退しおキヌを攟すず、車は急に前進したす。

3車はでこがこの道を「飛び」、珟実的に着陞したせん。

4Rigidbodyに手動でDragずAngular Dragを含めおも実際には、物理​​モデルの盞互䜜甚䞭の抵抗は䟝然ずしお急な山を登りたす。

2番目の方法は実際にはより珟実的であり、これらの欠点がありたせん。 〜AlternatePhysicsModel。

実際のビデオは次のずおりです。Lambordgine-方法2、䟋の方法1の暙準マシン







: , « » 1. , — 2.



All Articles