ð TOP / ã¢ãã³C++ M10ãC++17ãïŒECSã»ããŒã¿æå
ã¢ãã³ç¬¬10ç« ïŒãC++17ãç¶æ¿ããåæãšECSïŒããŒã¿æåèšèšãšãã£ãã·ã¥å¹çïŒ
ãç¶æ¿ããåæãã®çé«ãåå®å
šãªã³ã³ããŒãã³ãçè±ããããŠè¿ä»£ã²ãŒã èšèš
ãªããžã§ã¯ãæåã®åŒ·åãªæŠåšãã¯ã©ã¹ã®ç¶æ¿ãã§ãããã²ãŒã éçºãå€§èŠæš¡åãããšãè±åœ¢ç¶æ¿ïŒDiamond InheritanceïŒããåºåºã¯ã©ã¹ã®ç¥æ ŒåïŒGod ClassïŒããã¯ã©ã¹ççºããšããèŽåœçãªå£ã«çŽé¢ããŸããæçµç« ã§ã¯ãè¿ä»£ã²ãŒã ãšã³ãžã³ïŒUnity, Unreal, BevyçïŒã®èšèšæšæºã§ãããç¶æ¿ããåæïŒComposition over InheritanceïŒããšãC++ãã³ãã¬ãŒããæŽ»çšãããECSïŒEntity Component SystemïŒããæ§ç¯ãå
š7ç« ã®åŠã³ãçµå®ãããå
šåŒŸå¹ãã¹ãæç ŽããŠåæ¥ã®æãè¿ããŸãïŒ
7.1 ç¶æ¿ã®éçïŒè±åœ¢ç¶æ¿ã»ã¯ã©ã¹ççºã»åºåºã¯ã©ã¹ã®ç¥æ Œå
ãæµã ãã Enemy ãç¶æ¿ããåããã Movable ãç¶æ¿ãâŠâŠãã®çŽæçãªç¶æ¿é¢ä¿ã¯ãã²ãŒã 仿§ãè€éåããç¬éã«ç Žç¶»ããŸãããªãå€§èŠæš¡éçºã§ã¯ãæ·±ãã¯ã©ã¹ç¶æ¿ããªãŒããçŠæ¢ãããã®ãããã®çç±ãè§£æããŸãã
ð§ ãã³ã®ã³å
茩
ãã³å
çïŒæçµã¹ããŒãžçšã«ã巚倧æ¯èŠãã¹ããäœããããã§ãïŒãã¹ã¯ãæµïŒEnemyïŒãã§ãããã匟ãæã¡ïŒShooterïŒãããã·ãŒã«ããæã¡ïŒShieldedïŒãããã¢ã€ãã ãèœãšãïŒItemDropperïŒãããç»é¢å€ã«åºãªãïŒBoundedïŒãâŠâŠãããå
šéšå€éç¶æ¿ããããã³ã³ãã€ã©ãããææ§ãªåºåºã¯ã©ã¹ãã ãšæãããŸããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ã¬ããïŒããããããªããžã§ã¯ãæåã®çŠå¿ãè±åœ¢å€éç¶æ¿ã®æ»ã®ãã€ã€ã¢ã³ããããïŒEnemy ã Shooter ãåã BaseObject ãç¶æ¿ããŠããããããã¹ã®äžã«åãåºåºã¯ã©ã¹ã®ããŒã¿ã2éã«çŽã蟌ãã§è¡çªããã®ããïŒ
ð§ ãã³ã®ã³å
茩
ããâŠâŠãããå€éç¶æ¿ããããŠãå
šéšã®æ©èœãäžçªèŠªã® Enemy ã¯ã©ã¹ã«çªã£èŸŒãã°ãããã§ããããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
絶察ã«ãããïŒããããããš Enemy ã¯ã©ã¹ãæ°åè¡ã®ããŽããã¯ã©ã¹ïŒç¥ã¯ã©ã¹ïŒãã«ãªãããã ã®ã¶ã³æµã€ã³ããŒããŒãŸã§å·šå€§ãã¹ã®ããŒã ç ²ã¿ã€ããŒãæã€ãã¡ã«ãªãïŒä»ãããªããžã§ã¯ãæåã®æéèŠæ Œèšããç¶æ¿ããåæïŒComposition over InheritanceïŒãã®ççãç¥ãæããïŒ
7.2 C++ãã³ãã¬ãŒããšåå®å
šæ§ïŒ`entity.get<T>()` ã®æ¥µæ
ã³ã³ããŒãã³ããèªç±ã«çè±ã§ããããã«ããªãããå®è¡æãã£ã¹ãã®ãªãŒããŒãããïŒdynamic_castïŒãæé€ããå®å
šãªåå®å
šæ§ãäž¡ç«ããC++ãã³ãã¬ãŒãã®ææ³ãåŠã³ãŸãã
7.3 ECSïŒEntity Component SystemïŒïŒããŒã¿ãšåŠçã®å®å
šåé¢
EntityïŒIDã®ã¿ïŒãComponentïŒããŒã¿ã®ã¿ïŒãSystemïŒåŠçã®ã¿ïŒããã®3äœäžäœããªãçŸä»£ã®ã²ãŒã éçºãåžå·»ããŠããã®ããåã·ã¹ãã ã®å調åäœããçŽè§£ããŸãã
7.4 å
š7ç« ã®å®çµïŒCèšèªã®ã¡ã¢ãªäžå®ããã¢ãã³C++ã®å°å¹³ãž
第1ç« ã®ã1ãã¡ã€ã«ã»çãã€ã³ã¿ã»ã¹ãã²ãã£ãããå§ãŸã£ãåéºã¯ãã€ãã«æå
端ã®ECSã¢ãŒããã¯ãã£ãžãšå°éããŸãããç§ãã¡ãç»ã£ãŠããé²åã®è»è·¡ãæ¯ãè¿ããŸãã
ð§ ãã³ã®ã³å
茩
ãã£ããããïŒãã¹æ¯èŠ [ B ] ãšåŒŸå¹ãšãªãŒã [ E ] ãæç ŽããŸããïŒ3WAYã¬ãŒã¶ãŒãã³ã³ããŒãã³ããè¶³ããã ãã§åããããã³ãŒãããã¡ããã¡ããã£ããããŠãŠãå
šç¶ãã°ãåºãŸããïŒ
ð»ââïž ã·ãã¯ãå
ç
èŠäºããããã³ã®ã³ïŒãäž»ã¯ã€ãã«æãéããã®ããïŒç¬¬1ç« ã§ãfree() ãå¿ãããã©ãããããããã€ã³ã¿ã®ç¢å°ãæãããšéããŠãã£ãCèšèªããã°ã©ãããä»ãã¹ããŒããã€ã³ã¿ãæããStateãšObserverã§ççµåã«ãããã³ãã¬ãŒãECSãŸã§å®è£
ããã®ããïŒ
ð§ ãã³ã®ã³å
茩
ããã£âŠâŠãã³å
çãããããšãããããŸãâŠâŠïŒããªãã¯ã©ã¹ã«ããã®ããããªãçãã€ã³ã¿ã䜿ã£ãŠã¯ãããªãã®ããããªãç¶æ¿ã§ã¯ãªãåæãªã®ãããçç±ãå
šéšè
ã«èœã¡ãŸããïŒ
ð»ââïž ã·ãã¯ãå
ç
ããïŒéå
·ïŒæ§æïŒãèŠããã ããªã誰ã§ãã§ããããããããªããã®èšèšã«ããã®ããšããå¿
ç¶æ§ããéã§çè§£ãããäž»ã¯ãããç«æŽŸãªC++ãšã³ãžãã¢ããïŒèžã匵ã£ãŠãäžçäžã®å·šå€§ãããžã§ã¯ããžçŸœã°ãããããïŒåæ¥ããã§ãšãïŒðð
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. å€§èŠæš¡ãªããžã§ã¯ãæåèšèšã«ãããŠãç¶æ¿ããåæïŒComposition over InheritanceïŒããåŒ·ãæšå¥šãããæ±ºå®çãªçç±ã¯äœã§ããïŒ
1. ç¶æ¿ã䜿ããšã³ã³ãã€ã©ã®æé©åãäžåå¹ããªããªããã 2. æ·±ãç¶æ¿ããªãŒã¯è±åœ¢ç¶æ¿ãç¥ã¯ã©ã¹ïŒGod ClassïŒãçã¿ã仿§å€æŽã§ç Žç¶»ããããããåæãªãéšåã®çµã¿åããã§æè»ã«æ©èœã远å ã»çè±ã§ãããã 3. C++17以éã§ã¯èšèªä»æ§ãšã㊠class ã®ç¶æ¿æ§æãéæšå¥šã«ãªã£ããã 4. åæã䜿ããšããã°ã©ã ã®ãã€ããªãµã€ãºãåžžã«åå以äžã«ãªããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒæ·±ãç¶æ¿ããªãŒã¯è±åœ¢ç¶æ¿ãç¥ã¯ã©ã¹ïŒGod ClassïŒãçã¿ã仿§å€æŽã§ç Žç¶»ããããããåæãªãéšåã®çµã¿åããã§æè»ã«æ©èœã远å ã»çè±ã§ãããã
æ£è§£ã¯ãæ·±ãç¶æ¿ããªãŒã¯è±åœ¢ç¶æ¿ãç¥ã¯ã©ã¹ãçã¿ã仿§å€æŽã§ç Žç¶»ããããããåæãªãéšåã®çµã¿åããã§æè»ã«æ©èœã远å ã»çè±ã§ãããããã§ãããA is-a BïŒAã¯Bã§ããïŒããšããéçãªèŠªåé¢ä¿ãããããA has-a BïŒAã¯Bãæã£ãŠããïŒããšããåçãªéšååæã®æ¹ããèŠæ±ã®å€åã«å§åçã«åŒ·ãèšèšã«ãªããŸãã
Q2. ECSïŒEntity Component SystemïŒã«ãããã3ã€ã®èŠçŽ ã®è²¬åããšããŠæ£ããçµã¿åããã¯ã©ãã§ããïŒ
1. Entity: ããŒã¿ããŒã¹éä¿¡ / Component: ç»é¢æç» / System: ããŒããŒãå
¥å 2. Entity: åãªãèå¥ID / Component: çŽç²ãªããŒã¿ä¿æïŒããžãã¯ãªãïŒ / System: æ¯ãèãã»æŽæ°åŠçã®å®è¡ïŒããŒã¿ãªãïŒ 3. Entity: ãã¹ãŠã®åºåºã¯ã©ã¹ / Component: 掟çã¯ã©ã¹ / System: main颿° 4. Entity: ã¹ããŒããã€ã³ã¿ / Component: ã¬ããŒãžã³ã¬ã¯ã¿ / System: ã³ã³ãã€ã©
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒEntity: åãªãèå¥ID / Component: çŽç²ãªããŒã¿ä¿æïŒããžãã¯ãªãïŒ / System: æ¯ãèãã»æŽæ°åŠçã®å®è¡ïŒããŒã¿ãªãïŒ
æ£è§£ã¯ãEntity: åãªãèå¥ID / Component: çŽç²ãªããŒã¿ä¿æïŒããžãã¯ãªãïŒ / System: æ¯ãèãã»æŽæ°åŠçã®å®è¡ïŒããŒã¿ãªãïŒãã§ããããŒã¿ãšåŠçãå®å
šã«åé¢ããããšã§ãã¡ã¢ãªå±ææ§ã®åäžãé«ããã¹ãå®¹ææ§ãã³ãŒãã®åå©çšæ§ãå®çŸããŸãã
Q3. `entity->getComponent<TransformComponent>()` ã®ãããªC++ãã³ãã¬ãŒãèšèšã«ãããŠãdynamic_cast ã§ã¯ãªã typeidïŒstd::type_indexïŒã掻çšããäž»ãªå©ç¹ã¯äœã§ããïŒ
1. RTTIïŒå®è¡æåæ
å ±ïŒã«ããéãã¯ã©ã¹éå±€ã®åçæ¢çŽ¢ã³ã¹ããåé¿ããé«éãªããŒãã«åŒãïŒããã·ã¥ãããæ€çŽ¢ïŒã§åå®å
šã«ãã€ã³ã¿ãååŸã§ãããã 2. ä»®æ³é¢æ°ããŒãã«ïŒvtableïŒãæããªãã¯ã©ã¹ã§ã dynamic_cast ãåãããã«ãããã 3. ãã€ã³ã¿ã§ã¯ãªãåç
§ããè¿ããªããªãå¶çŽãåé¿ãããã 4. ã³ã³ãã€ã«ãšã©ãŒããã¹ãŠå®è¡æãšã©ãŒã«é
å»¶ããããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒRTTIïŒå®è¡æåæ
å ±ïŒã«ããéãã¯ã©ã¹éå±€ã®åçæ¢çŽ¢ã³ã¹ããåé¿ããé«éãªããŒãã«åŒãïŒããã·ã¥ãããæ€çŽ¢ïŒã§åå®å
šã«ãã€ã³ã¿ãååŸã§ãããã
æ£è§£ã¯ãRTTIã«ããéãã¯ã©ã¹éå±€ã®åçæ¢çŽ¢ã³ã¹ããåé¿ããé«éãªããŒãã«åŒãã§åå®å
šã«ãã€ã³ã¿ãååŸã§ãããããã§ããåºåºã³ã³ããŒãã³ãã«ä»®æ³ãã¹ãã©ã¯ã¿ãæããã€ã€ãåããšã«åºæã® std::type_index ãããŒã«ããããšã§ãæ¯ãã¬ãŒã æ°åååŒã°ããã²ãŒã ã«ãŒãã§ãé«éã«åäœããŸãã
Q4. æ¬ã«ãªãã¥ã©ã å
š7ç« ãéããŠåŠãã ãCèšèªïŒæç¶ãåïŒããã¢ãã³C++ïŒãªããžã§ã¯ãæåã»ECSïŒãžã®ãã©ãã€ã ã·ãããã®æ¬è³ªãšã¯äœã§ããïŒ
1. 颿°ãã§ããéãé·ãæžããã°ããŒãã«å€æ°ã§å
šãŠãå
±æããããš 2. malloc/free ã巚倧switchã®ãããªãããã°ã©ãã®æ³šæåã«äŸåããæäœæ¥ããæé€ããRAIIã»ã«ãã»ã«åã»åã·ã¹ãã ã»ççµåèšèšã«ãã£ãŠããã°ã®çºçãæ§é çã«äžå¯èœã«ãããããš 3. ãã¹ãŠã®å€æ°ããã€ã³ã¿ã«ããããŒãã¡ã¢ãªãçŽæ¥æåã§ç®¡çããããš 4. ã¯ã©ã¹ããã³ãã¬ãŒãã䜿ããããã¯ãã ãã§é«éåããããš
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒmalloc/free ã巚倧switchã®ãããªãããã°ã©ãã®æ³šæåã«äŸåããæäœæ¥ããæé€ããRAIIã»ã«ãã»ã«åã»åã·ã¹ãã ã»ççµåèšèšã«ãã£ãŠããã°ã®çºçãæ§é çã«äžå¯èœã«ãããããš
æ£è§£ã¯ãmalloc/free ã巚倧switchã®ãããªãããã°ã©ãã®æ³šæåã«äŸåããæäœæ¥ããæé€ããRAIIã»ã«ãã»ã«åã»åã·ã¹ãã ã»ççµåèšèšã«ãã£ãŠããã°ã®çºçãæ§é çã«äžå¯èœã«ãããããšãã§ããã¢ãã³C++ã®èšèšãšã¯ã人éããã¹ãããäœå°ãã¢ãŒããã¯ãã£ã®åã§æ²æ»
ããããšã«ãããŸããå
š7ç« ã®å®çµãå¿ããããã§ãšãããããŸãïŒ
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â