
ãšã³ããªãŒ
ãããã£ãŠã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ã³ã³ããŒãã³ãã®ããããã£ãå€æŽããŸãããã
- ãµã¹ãã³ã·ã§ã³ã®è·é¢-å®éãããã¯ãµã¹ãã³ã·ã§ã³ã®ã¹ããªã³ã°ã®é·ãã§ã0.15ã«èšå®ãããŠããŸã
- ãµã¹ãã³ã·ã§ã³ã¹ããªã³ã°->ã¹ããªã³ã°-ãµã¹ãã³ã·ã§ã³ã®åæ§ãRigidbodyã®ééã倧ããã»ã©ãåæ§ã倧ããããå¿ èŠããããŸãã9000ã«èšå®ããŸãã
- ãµã¹ãã³ã·ã§ã³ã¹ããªã³ã°->ãã³ããŒ-ãµã¹ãã³ã·ã§ã³ãœããããŒãå€ã倧ãããããšã¹ããªã³ã°ã®åããé ããªãã100ã«èšå®
- 質é-ãã€ãŒã«ã®è³ªéã1ãæ®ã
- åæ¹æ©æŠ-ãããã³ãããã€ãŒã«ã®æ©æŠåããã®ãŸãŸã«ããŠãããŸã
- 暪æ¹åã®æ©æŠ-ã暪æ¹åãã®è»èŒªã®æ©æŠåã¯ãè»ã®ããªãããå®è£ ããå Žåã«äŸ¿å©ã§ããã®ãŸãŸã«ããŠãããŸã
ïŒååŸãèŠãªãã§ãã ãããããªãã¯å¥ã®ãã®ãæã£ãŠãããããããŸãããäž»ãªããšã¯åãããªãã®ãã€ãŒã«ãšäžèŽããããšã§ãïŒ

ã ãããä»ããåçãã¯ãªãã¯ããŠãã ãããç§ãã¡ã®è»ã¯ãŸã£ããç°ãªãæ¹æ³ã§åäœããããã«ãªããŸãããä»ã§ã¯å°åœ¢ã®è¡šé¢ããè·³ãäžãããäžã®æé¢ã«çœ®ããšããããã転ãããŸããããããã€ãŒã«ã³ã©ã€ããŒãç§ãã¡ã®ããã«åãæ¹æ³ã§ãã
ããããããã圌ãã®èœåã®ãã¹ãŠã§ã¯ãããŸããããããã䜿çšããŠè»ãé転ããè»èŒªãå転ãããŠå°åœ¢ã®ãã³ãã«åå¿ãããæ¹æ³ãèŠã€ããŸãããã ã¹ã¯ãªãããéå§ããŸãïŒ
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 } }
- ã¹ã¯ãªããã®ã¡ã€ã³ã¯ã©ã¹ã¯ãã¹ã¯ãªãããã¡ã€ã«ãšåãæ¹æ³ã§åŒã³åºãå¿ èŠããããŸããããããªããšãã³ã³ãã€ã©ã¯ãšã©ãŒãã¹ããŒããŸãã
- ããã³ãã³ã©ã€ããŒã®é åã
- ãªã¢ã³ã©ã€ããŒã®é åã
- StartïŒïŒé¢æ°ã䜿çšããŠåæåããŸãã
- Unity3dã¹ã¯ãªããã®åºæ¬ãã¥ãŒããªã¢ã«ã§è¿°ã¹ãããã«ããªããžã§ã¯ããšã®ç©ççãªçžäºäœçšã«ã¯ãUpdateïŒïŒé¢æ°ãããFixedUpdateïŒïŒé¢æ°ã䜿çšããæ¹ãé©åã§ãã

次ã«ãã³ã©ã€ããŒã§äœæ¥ããã¹ã¯ãªãããè£è¶³ããŸãã
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ãã¿ã³ãŸãã¯å·Šç¢å°ã䜿çšããŠå³ã«æ²ãããŸãã
ãã®ã¹ã¯ãªããã®æ©èœãèŠãŠã¿ãŸãããã
- ãã€ãŒã«ã®æ倧å転è§ã
- ãã€ãŒã«ã«äŒéãããæ倧ãã«ã¯ã
- æ倧å¶åãã«ã¯ã
- Inputã¯ã©ã¹ã®GetAxisïŒïŒé¢æ°ã¯ãã³ã³ãããŒã©ãŒã®ç§»åããŒãæŒããããžã§ã€ã¹ãã£ãã¯ã®ã¹ãã£ãã¯ã移åãããšãã«çºçããã€ãã³ããåŸ æ©ããŸããé¢æ°ã¯ä»®æ³è»žã®æ¹åãåããŸãïŒããšãã°ããåçŽãã¯WãSããŒããŸãã¯ãžã§ã€ã¹ãã£ãã¯ãååŸã«ç§»åããŸãïŒã -1ãã1ãŸã§ã®æ°å€ãè¿ããŸãã-1ã¯å·Šãžã®åŸéãSããŒã¯ãåçŽã軞ãDã¯ãæ°Žå¹³ãïŒ0-軞ã¯ã¢ã¯ãã£ãã§ã¯ãªãã1ã¯åé²ããŸãã¯å³ïŒWåçŽã®ã軞ããAãããæ°Žå¹³ãããŸãã¯ãžã§ã€ã¹ãã£ãã¯ã®ã¹ãã£ãã¯ãå·Šå³ã«åãããŸãïŒã
- ä»®æ³è»žããååŸããçµæãCarMoveïŒïŒé¢æ°ã«æž¡ããŸãã
- WColForwardé åã«é 眮ãããŠããåWheel Colliderã«ã€ããŠãsteerAngleå€æ°ïŒãã€ãŒã«ã®å転è§åºŠïŒã«ã氎平軞ããååŸããå€ãä¹ç®ããŠå€æŽããŸãã
- åçŽè»žãéæ¢ããŠããå ŽåïŒã€ãŸããWããŒãŸãã¯SããŒãæŒããªãå ŽåïŒããã¬ãŒãåã®åå ã§ããbrakeTorqueã³ã©ã€ããŒå€æ°ãå€æŽããŸããããã¯ã移åããŒãæŒããªãå Žåã«æ £æ§ã§è»ã移åããªãããã«ããããã«å¿ èŠã§ãã
- ãã以å€ã®å ŽåïŒWããŒãŸãã¯SããŒãæŒããå ŽåïŒããã¬ãŒãåã¯ãŒãã«ãªããŸãã次ã«ãåçŽè»žããååŸããå€ãæããããšã§motorTorqueå€æ°ïŒãã€ãŒã«ãã«ã¯ïŒãå€æŽãããã®çµæãè»ãå éãå§ããŸãã
ããã ãã§ãããïŒ ãã€ããŒãªæ¬ é¥ãä¿®æ£ããããã«æ®ã£ãŠããŸãããŸããé«éã§å転ããããšãããšãè»ã¯æšªã«åããŸããããã¯ããªãžããããã£ãããã«æ¥ç¶ãããŠãããã¹ãŠã®ã³ã©ã€ããŒã«åºã¥ããŠç§ãã¡ã®è»ã®éå¿ãèšç®ãããšããäºå®ã«ãããã®ã§ããã次ã«ãç§ãã¡ã®è»èŒªã¯ãŸã ãããŸããã¹ãã³ããŠãäžåäžãªå°åœ¢ã«åå¿ããŸããã
é çªã«ãã¹ãŠã«ã€ããŠè©±ããŸãããã
4.éå¿
ããã¯çŽ æŽãããã·ã³ãã«ã«èšå®ãããŠããŸããæåã«ç©ºã®GOãäœæãããããéå¿ãšåŒã³ããããCarãªããžã§ã¯ãã«ãã©ãã°ããããšãã°ãé«éã§æ²ãããšãã«ç§ã®è»ã暪転ããªãããã«ãããããã®äœçœ®ã«é 眮ããå¿ èŠããããŸãç§ã¯ãã®ããã«ããªããã°ãªããŸããã§ããïŒ


å¥ã®æ¹æ³ã§ãããäœãããšãã§ããŸããããã¯ãã¹ãŠç§ãã¡ã®äœã®Box Colliderã®å¹ŸäœåŠçãªå¯žæ³ã«äŸåããã®ã§ãéå¿ãè©ŠããŠãã ãããããããæåã«ã¹ã¯ãªãããè¿œå ããŠãã ããïŒ
- å€æ°ã宣èšããŸãïŒpublic Transform COMã
- GOã®éå¿ãã¹ã¯ãªããã®COMãã£ãŒã«ãã«ãã©ãã°ããŸãã
- 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床å転ãããããšãéèŠã§ãããšè¿°ã¹ãŸããããã®çç±ã説æããŸãã ã¹ã¯ãªãããåæããŸãããã
- è»èŒªã®å€åœ¢ãä¿åããé åãäœæããŸãã
- ãããã®å€æ°ã¯ç§ãã¡ã«ãšã£ãŠæçšã§ãããã®çç±ã以äžã§èª¬æããŸãã
- åãã€ãŒã«ã«ã€ããŠå¿ èŠãªæ å ±ãå«ãã¯ã©ã¹ãäœæããŸãããã
- ãã€ãŒã«ãå€åœ¢ããŸãã
- Wheel Collider Wheels;
- ãã€ãŒã«ã®éå§äœçœ®ã
- ãã€ãŒã«ã®å転è§åºŠã
- WheelDataåã§ãã€ãŒã«ã®é åã宣èšããŸãã
- å¿ èŠãªããŒã¿ãwheelsé åã«æž¡ããŸãããã®ããã«ãSetupWheelsïŒïŒé¢æ°ãäœæããŸããã
- SetupWheelsïŒïŒé¢æ°ã¯ããã€ãŒã«ãšãã®WheelColliderã®å€æãåãå ¥ããå¿ èŠãªããŒã¿ãWheelDataã¯ã©ã¹ã«å«ãŸããå€æ°ã«æž¡ãããããè¿ããŸãã
- ãã€ãŒã«ã®å転ã®äœçœ®ãšè§åºŠãèšç®ããUpdateWheelsïŒïŒé¢æ°ãäœæããŸãã
- ãã€ãŒã«ã®å転ãæéå ã«åçã«åŒã䌞ã°ãããããã«ãå¿ èŠãªTimeã¯ã©ã¹ã®å€æ°fixedDeltaTimeãèŠããŠããŸãã
- ãã€ãŒã«é åã®åèŠçŽ ã«å¯ŸããŠã次ã®æäœãå®è¡ããŸãã
- ã¯ã©ã¹å€æ°WheelHitãäœæããŸãïŒäžã§èª¬æããŸããïŒã
- ãã€ãŒã«ã®ããŒã«ã«äœçœ®ãèŠããŠããŸãïŒããŒã«ã«äœçœ®ã¯èŠªåº§æšã«çžå¯Ÿçãªäœçœ®ã§ãã°ããŒãã«ã¯äžçã«çžå¯Ÿçã§ãïŒã
- ãã€ãŒã«ã®WheelColliderãå°åœ¢ïŒãŸãã¯äœãïŒã®è¡šé¢ãšè¡çªããå Žåã
- 次ã«ãã³ã©ã€ããŒããã¬ã€ã³ãµãŒãã§ã¹ãšæ¥è§Šãããã€ã³ãã®éå§ç¹ïŒhit.pointïŒãšçŸåšã®ãã€ãŒã«äœçœ®ã®çµäºç¹ïŒw.wheelTransform.positionïŒã®éãããã³Carãªããžã§ã¯ãã«å¯ŸããŠäžåãã®ãã¯ãã«ã®éã®ãã€ãŒã«ã®ããŒã«ã«äœçœ®ã®Y座æšããDotïŒïŒãæžç®ããŸãïŒtransform.upïŒãããŠãããããã¹ãŠããwheelRadiuså€æ°ãæžç®ããŠããã€ãŒã«ãé©åãªå Žæã«ãªãããã«ããŸãã ïŒäžèšããåèªãç解ããªãã£ãå Žåãã»ãšãã©ã®äººããããåããŠç解ããªãã®ã§ãèœèããªãã§ãã ãããããã¯ã ããã補åãäœã§ããããããäžèšã®ãã¯ãã«ã«ã©ã®ããã«é¢é£ããããç¥ãå¿ èŠããããããã€ãŒã«äœçœ®ããã®ããã«èšç®ããå¿ èŠãããããšãç¥ã£ãŠããã ãã§ãïŒ;
- WheelColliderããã¬ã€ã³ãµãŒãã§ã¹ã«è§Šããªãå Žåã 次ã«ããã€ãŒã«ã®åæããŒã«ã«ããžã·ã§ã³ã®Y座æšããwheelOffsetãåãé€ããŸããããã«ãããè»ãé«ãããèœã¡ããããåŸããã«æšªããã£ãŠãããšãã«ããã€ãŒã«ãæªç¥ã®æ¹åã«é£ã³å»ãããšããããŸããã
- ãã€ãŒã«ã®å€æŽãããäœçœ®ãçŸåšã®äœçœ®ã«é©çšããŸãã
- Mathfã¯ã©ã¹ã®RepeatïŒïŒé¢æ°ã䜿çšããŠãã€ãŒã«ã®ãå転ãè§åºŠãèšç®ããŸãããã®é¢æ°ã¯ãè§åºŠã0ã360床ã®ç¯å²ã«ä¿ã€ã®ã«åœ¹ç«ã¡ãŸããããŸãæŽç·ŽãããŠããªãåŒïŒw.rotation + delta * w.col.rpm * 360.0f / 60.0fïŒããã§ãå®éã«çŸåšã®å転è§åºŠã«ã³ã©ã€ããŒã«ä¿åãããŠãã1åãããã®å転æ°ãæããæéãã«ã¿ã«360/60ãæããŸãã
- çµæãçŸåšã®ããŒã«ã«å転è§åºŠã«é©çšããŸãã ã¯ã©ãŒã¿ããªã³ã¯ã©ã¹ã®ãªã€ã©ãŒïŒïŒé¢æ°ã¯ããã«åœ¹ç«ã¡ãŸãããªã€ã©ãŒè§åºŠã§ã¯ã©ãŒã¿ããªã³ãè¿ããŸãïŒãã ããã¯ã©ãŒã¿ããªã³ãšããåèªãæãå Žåã¯ãããŒã«ã«å転è§åºŠãšã°ããŒãã«å転è§åºŠãæ ŒçŽããæ§é ãšããŠæœè±¡åããŠæ±ãããšããå§ãããŸãïŒããã¯ãããå®å šã«ç°ãªãããšãæå³ããŸããããã§ã¯æ£ç¢ºã«äœãäŒããã®ã§ã¯ãªããåã«ç解ããããã§ãããïŒã æåã®åŒæ°ïŒX軞ã®åšãã®è§åºŠïŒã¯èšç®ããããã€ãŒã«ã®ãå転ãè§åºŠã転éãã2çªç®ã®åŒæ°ïŒY軞ã®åšãã®è§åºŠïŒã¯ã³ã©ã€ããŒã®å転è§åºŠãéä¿¡ãã3çªç®ã®åŒæ°ïŒZ軞ã«æ²¿ã£ãè§åºŠãããã§æ®µèœ1ã§éèŠã ã£ãçç±ãããããŸããïŒãã€ãŒã«ãZ軞ã®åšãã§æ£ç¢ºã«å転ãããŸãïŒå®æ°90.0fãè£åããŸãã
ãããã«
ããŠãUnity3Dã§éåžžã®è»ã®ã¡ã«ããã¯ãæ§ç¯ããæ¹æ³ã«ã€ããŠã話ãã§ããã®ã¯ããã ãã§ããäžèšã®ãã¹ãŠãèªãã§ç解ããåŸãããã«ã¬ãŒã¹ã·ãã¥ã¬ãŒã¿ãŒãäœãããšãã§ããŸãã
ã¬ãã¹ã³ã®æ¬¡ã®éšåã§ã¯ãçŽæããããã«ãæŠè»ãã©ãã¯ã®ä»çµã¿ãæ§ç¯ããæ¹æ³ã«ã€ããŠèª¬æããŸãããŸãã3Dãšãã£ã¿ãŒã§ã¢ãã«åããæ¹æ³ãšãããããã¢ãã«ããšã¯ã¹ããŒãããŠUnityã«ã€ã³ããŒãããæ¹æ³ã«ã€ããŠã説æããŸããåœç¶ã匷å¶çã«ã·ãã¥ã¬ãŒãããããšã¯ãããŸãããã®ãã¢ã§èŠããã®ã§ãããæ¢è£œã®ã¢ãã«ãæäŸããŸãã Unity3dã®åŠç¿ã«ãé¢å¿ããå¯ãããã ãããããšãããããŸãã
>>ã¬ãã¹ã³2