ããŒã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.