ã³ã³ããŒãã³ããMonoBehaviourããç¶æ¿ããã¯ã©ã¹ãšåŒã³ãŸãã ããã§ã¯ãåºæ¬ã¯ã©ã¹èªäœã®ååãéåžžã«é©åã«éžæãããŠããããã®åäœãæ確ã«ãªãã.monoãã©ãããã©ãŒã ã«ãã£ãŠå®è¡ãããããšãããããŸãã ããããMONOã¯1ã€ã* 1ã€*ã®åäœã§ãããšä»®å®ãããšéåžžã«äŸ¿å©ã§ãã ãããŠãã³ã³ããŒãã³ããéçºããéã«æåã«æ³šæããå¿ èŠãããã®ã¯ã1ã€ã®ã³ã³ããŒãã³ã-1ã€ã®åäœã§ãã SOLIDã®å¯äžã®è²¬ä»»ååãšãGRASPãåäœããŠããã¯ã©ã¹å ã®ã¡ãœããã®é«åºŠãªçµåã
ããã§ã¯ãGRASPã«æ³šç®ããŸãããã ããã°ã©ãã³ã°ã¯ãç¹å®ã®å®è£ ïŒäœçµåïŒã§ã¯ãªããæœè±¡åã®ã¬ãã«ã§ãªããã°ãªããŸããã ãããŠãäžèŠã·ã³ãã«ãªã²ãŒã ãã¬ã€ã§ãããã€ã³ã¿ãŒãã§ãŒã¹ã®UMLå³ã®äœæãå¿ èŠã§ãã ãªãã§ïŒ äžèŠã§ã¯ãªãããã€ã°ããïŒããªãã¯ãããå¿ èŠãšããŸããïŒã®ååã¯å¿ããããªãã§ãã æ£åœåãããã°åé·ã§ã¯ãããŸããã 誰ãã²ãŒã ãæãã€ããŸããïŒ ã²ãŒã ãã¶ã€ããŒãæ°é人ã®å€èŠ³ã®ãããã®é°æ¹¿ãªäººã ã ãããŠã圌ããäœãå€ããªããšããããšã¯èµ·ãããŸããã ãããã£ãŠãå€æŽã«åããå¿ èŠããããŸãããå€ãã®å Žåãã²ãŒã ããžãã¯ãæ¡åŒµããæºåãå¿ èŠã§ãã ããã«ããããã®ãã¹ãŠã®å€æŽã¯ããã«ã¯è¡ãããŸããããéçºè èªèº«ããããè¡ãçç±ããã§ã«å¿ããŠãããããã§ãªãå Žåã¯ããã§ã¯ãããŸããã ãããã£ãŠãå°ãªããšãæœè±¡åãããUMLãã€ã¢ã°ã©ã ãåžžã«å®è¡ããå¿ èŠããããŸããããã¯ãããžã§ã¯ãã®ããã¥ã¡ã³ãã§ãã CïŒã³ãŒããçæããããã«ãVisual Studioã§UMLå³ãéçºããŸãã
ããã§ã¯ãã²ãŒã ã®éçºãå§ããŸãããã ããšãã°ãã¿ã¯ãŒãã£ãã§ã³ã¹ã®ã³ã¢ã²ãŒã ãã¬ã€ãäœæããŸãã éçºæé ã«ã¯ããŸããŸãªã¢ãããŒãããããŸãããççž®çã䜿çšããŸãã
æåã®ã¹ãããïŒåé¡ã®èª¬æ
ã²ãŒã çšã«äœæãããããã¥ã¡ã³ãã®ããŒãžæ°ã«é¢ä¿ãªããäž»ãªãã®ãåžžã«åŒ·èª¿ã§ããã¯ãã§ãã ãã¡ãããã²ãŒã ãã¬ã€ã®å€§ãŸããªèª¬æã¯ããŠãŒã¹ã±ãŒã¹ã«åå²ããæ¹ãé©åã§ãã
ãã¬ã€ã€ãŒã¯æµãããŠã¹ãç Žå£ããªãããã«ããªããã°ãªããŸããã ãããè¡ãã«ã¯ã圌ã¯ç¯å²å ã®æµãç Žå£ããå¡ãèšå®ããå¿ èŠããããŸãã åæã«ã1ã€ã®ã¿ã¯ãŒãæ»æã§ããæµã¯1人ã ãã§ãã 圌ãæ»ã¬ãå¡ã®ç¯å²å€ã«åºããšã次ã«å©çšå¯èœãªãã®ãéžæãããŸãã æµã¯æ³¢ã®ããã«èŠããåæ³¢ã®æ°ã¯å¢ããŸãã æµã¯åºçŸå°ç¹ãã家ãžã®éã«æ²¿ã£ãŠç§»åããŸãã 家ã«è¿ã¥ããšç Žå£ããå§ããŸãã 家ãç Žå£ããããšãã²ãŒã ãªãŒããŒã§ãã
2çªç®ã®ã¹ãããïŒã¿ã¹ã¯åæ
äž»ãªãã®ã®ç 究ããå§ããŸãããïŒå¡ãã¯ãªãŒãã家ã ãã®ãããæ¢ã«é 眮ãããã²ãŒã ãªããžã§ã¯ãïŒã¿ã¯ãŒãšå®¶ïŒã§ã·ãŒã³ãäœæãããšãçµæãåŸãããŸãïŒã¯ãªãŒãã衚瀺ããã家ã«ç§»åããå¡ã®æå·ã«ããçµè·¯ã«æ²¿ã£ãŠæ»ã«ããããã家ã«å°éãããšæå·ãåŒãèµ·ãããŸãã æ»äº¡ãããšãã¯ãªãŒãã¯ã·ãŒã³ããæ¶ããŸãã 家ãç Žå£ããããããã¹ãŠã®ã¯ãªãŒããç Žå£ããããšãã²ãŒã ãªãŒããŒã§ãã
ã¡ã€ã³ã®ã²ãŒã ãšã³ãã£ãã£ãéžæãããããã®ããããã£ãšåäœãæå®ããŸãã
1ïŒã¿ã¯ãŒã ããããã£ïŒãã¡ãŒãžãã·ã§ããéã®ã¯ãŒã«ããŠã³ãã¿ãŒã²ããéžæç¯å²ãã¿ãŒã²ããéžæããžãã¯ã
åäœïŒã¿ãŒã²ããéžæãšã¿ãŒã²ããæ»æã
ãŸããããŸããŸãªã²ãŒã ãã¬ã€ã§ã¯ããã¡ãŒãžãç Žå£ã®ååŸãã¿ãŒã²ããéžæã®ããžãã¯ãªã©ãããŸããŸãªçš®é¡ã®ã¿ã¯ãŒããããŸãã
2ïŒã¯ãªãŒãã ããããã£ïŒHPããã¡ãŒãžãæ»æéã®ã¯ãŒã«ããŠã³ã移åé床ã
è¡åïŒå®¶ãžã®ã«ãŒãã«æ²¿ã£ãŠç§»åããã è¿ãã«è¿ã¥ããããèªå® ã§æ»æããŠãã ããã HP = 0ã®å Žåã殺ããããšèŠãªãããŸãã
ããŸããŸãªã¿ã€ãã®ã¯ãªãŒã-ããšãã°ãHPã«ããã
3ïŒå®¶ã ããããã£ïŒHPã
åäœïŒHP = 0ã®å Žåããã¬ã€ã€ãŒã¯è² ããŸãã
第äžæ®µéïŒå解
ã¿ã¹ã¯ãé©åã«å解ããããšã¯éåžžã«éèŠã ãšæããŸãã ã»ãšãã©ã®æéã¯ãæœè±¡åãšãããã®éã®è«ççæ¥ç¶ã®ç 究ã«è²»ããããã¹ãã§ãã
ãŸããåäœãèŠçŽããŠãã©ã®ã³ã³ããŒãã³ããå¿ èŠããç¹å®ããŸãã
1ïŒã²ãŒã ã«ã¯ããã¡ãŒãžåäœãè¡ã2ã€ã®ãšã³ãã£ãã£ãã¿ã¯ãŒãšã¯ãªãŒãããããŸãã ãã®åäœãã³ã³ããŒãã³ãã«åé¢ããŸããã€ã³ã¿ãŒãã§ãŒã¹ã¯æ¬¡ã®ãšããã§ãã
åŸ ã£ãŠãåŸ ã£ãŠã誰ããèšãã§ãããïŒãã«ãã»ã«åã¯ã©ãã§ããïŒ èª°ã§ãã¯ãŒã«ããŠã³ãšãã¡ãŒãžãå€æŽã§ããã®ã§ããïŒãããããã²ãŒã ãã¶ã€ããŒã ãããã³ã³ããŒãã³ãã®ããããã£ãçŽæçãªæ¹æ³ã§èšå®ããŸãã ãããã£ãŠããã¹ãŠã®ããããã£ã¯UIã«æ å ±ã衚瀺ããã ãã§ãèšå®ããå¿ èŠã¯ãããŸããã ããã«ãUnityã¯ã€ã³ã¹ãã¯ã¿ãŒã§æå®ãããget / setã³ã³ã¹ãã©ã¯ãã®ããããã£ã衚瀺ã§ããŸããããŸãã[SerializeField]ã§ããŒã¯ããããã£ãŒã«ããäœæããå¿ èŠããããŸãã ãããŠåœç¶ãã³ãŒãã®ä»ã®ã¯ã©ã¹ã¯ããããã£ã®å€ãå€æŽã§ããŸããã
ã³ã³ããŒãã³ãã«æ»ããŸãããã 誰ãããã®åäœã®éå§ãããªã¬ãŒããŠåæ¢ããç®æšã瀺ããç®æšãå€æŽããŸãã ãããã誰ã§ããïŒ
2ïŒã¿ãŒã²ããéžæã®ããžãã¯ã¯ã¿ã¯ãŒã®çš®é¡ã«ãã£ãŠç°ãªããã¿ã¯ãŒã ãã§ãªããã¯ãªããããã®åäœã䜿çšããããã2ã€ã®è«çã³ã³ããŒãã³ããåºå¥ããå¿ èŠããããŸãã
æåã®ãã®ã¯ç©çåŠã§åäœããã¯ãªãŒããã³ã©ã€ããŒããªã¬ãŒã«å ¥ããšããã«ã¿ãŒã²ãããã¥ãŒã«è¿œå ãããã¿ãŒã²ãããå¢å ãããšæãããã€ãã³ããäœæããŸãã ã¯ãªãŒãã圱é¿ãåããé åãé¢ãããããã«ããã®ã¿ãŒã²ããããã¥ãŒããåé€ãããã¥ãŒããã¯ãªãŒããåé€ããã€ãã³ããäœæããŸãã
ãã¡ããããã®è¡åã¯å®¶ã«ãšã£ãŠéå°ã§ãã家ã¯æ±ºããŠéããããšã¯ãããŸããã ãŸãã ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãITriggerã®å°æ¥ã®ã³ã³ããŒãã³ããšåŒã³ãŸãã 2ã€ã®Unityã¡ãœããïŒOnTriggerEnter / OnTriggerExitã
2çªç®ã®è«çã³ã³ããŒãã³ãã¯ãããã®ã€ãã³ãã«å¿çããIDamageDealerèªäœã䜿çšããŠãéžæããã¿ãŒã²ããã«ãã¡ãŒãžãäžãããã¡ãŒãžãæ¢ããŸãã
ãããã2çªç®ã®ã³ã³ããŒãã³ãã§ã¿ãŒã²ãããéžæããæ¹æ³ã¯ãã¿ã¯ãŒã®ã¿ã€ããšããããã¯ãªãŒãã§ãããã©ããã«ãã£ãŠç°ãªããŸããïŒ åçŽãªãªãã·ã§ã³ã¯ãããã€ãã®æ±çšSelectTargetã¡ãœããïŒã¿ãŒã²ããéžæããžãã¯ã®ã¿ã€ãïŒã¿ã¯ãŒã¿ã€ããã¯ãªãŒãïŒïŒã§ããã¿ãŒã²ããéžæããžãã¯ã®ã¿ã€ãã«å¿ããŠããããéžæããŸãã ããããç¹ã«ã³ã³ããŒãã³ãã«é¢ããŠã¯ãæ±çšæ§ãåžžã«è¯ããšã¯éããŸããã ã€ã³ã¿ãŒãã§ãŒã¹åé¢ã®ååãæãèµ·ããããŸããæ®éçãªãã®ãããå°ãå ·äœçã§ããæ¹ãè¯ãã§ãã ãããã£ãŠã1ã€ã®ITargetSelectorã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ãŠçµåããããç°ãªãã¿ãŒã²ããéžæåäœçšã®ç°ãªãã³ã³ããŒãã³ãããããŸãã
KeepSelectorïŒã¿ãŒã²ãããšããŠå®¶ãéžæããŸãã
SimpleCreepSelectorïŒãªã¹ãã®æåã®ã¿ãŒã²ãããéžæããŸãã
WeakCreepSelectorïŒæã匱ãã¿ãŒã²ãããéžæããŠè¿œå ããŸãã
ãããã£ãŠãã¿ãŒã²ããéžæã®ã³ã¢ã²ãŒã ãã¬ã€ã¡ã«ãã¯ã¹ãæ¡åŒµããã®ã¯ç°¡åã§ãïŒã¡ã«ãã¯ã¹ã¯åºæ¬çãªãã®ã§ããã¿ã¯ãŒã®éãã¯ããã ãã§ãïŒã ãã ããç¶æ¿ã䜿çšããŠå¥ã®ãªãã·ã§ã³ãå®è¡ã§ããŸãã ã¿ã¯ãŒã®ããã©ã«ãããžãã¯ãåããåºæ¬ã³ã³ããŒãã³ãTargetSelectorããããŸãã ãããŠãKeepSelectorã¯ã©ã¹ãšWeakCreepSelectorã¯ãã¿ãŒã²ããã®ãªã¹ãã«è¿œå ããæ¹æ³ïŒããã家ãã¯ãªãŒããã確èªããããïŒãšã¿ãŒã²ãããéžæããæ¹æ³ããªãŒããŒã©ã€ãããŸãã
3ïŒã²ãŒã ã«ã¯æ¬¡ã®åäœãæã€2ã€ã®ãšã³ãã£ãã£ããããŸãïŒãã¡ãŒãžãåãããšãããããã€ã³ãã®æ°ã¯åœŒãæ»ã¬ãŸã§æžå°ããŸãã
HP <= 0ã®ç¶æ ã確èªããã ãã§ããã®ã«IsDeadãå¿ èŠãªã®ã¯ãªãã§ããïŒ çŸåšã®å®è£ ã§ãã2ãæã§ãã¯ãªãŒããåæ¢ããå Žåã«ç¶æ ã確èªããå¿ èŠããããŸãã ãããã£ãŠãDRYã®åçŽãªååïŒç¹°ãè¿ããªãã§ãã ããïŒã«åŸã£ãŠãããžãã¯ãè€è£œããŸããã ãã®ãããä»ã®æ¡ä»¶ãè¿œå ãããå Žåã«ããžãã¯ãå€æŽããæ¹ãç°¡åã§ãã
å°æ¥çã«æå·ãé©çšããæ¹æ³ãç°¡åã«æ¡åŒµããããã«ãå¥ã®è£å©ã³ã³ããŒãã³ãã«ãã®åäœãäžããŸãã
ãããã£ãŠããã¡ãŒãžãé©çšããæ¹æ³ãç¶æ¿ããã³ãªãŒããŒã©ã€ãããããšãªããå°æ¥çã«IHittableãšIDamageDealerã®2ã€ã®ã³ã³ããŒãã³ããçµã¿åãããããšãã§ããŸãã IDamageDealerãå®è£ ããä»ã®ã³ã³ããŒãã³ããå²ãåœãŠãããšã«ãããåäœãæ¡åŒµããããšãç°¡åã§ãã
4ïŒ1ã€ã®ãšã³ãã£ãã£ã«ç§»ååäœããããŸãïŒIRouteFollowerã ããããã£ïŒWayPoints []ãSpeed;
5ïŒããã§ãè² ããšåã¡ã®ããžãã¯ãåŠçããã³ã³ããŒãã³ããç¹å®ããå¿ èŠããããŸãã家ã§IsDeadããã§ãã¯ããæ³¢æ°ãèæ ®ããŠãã¹ãŠã®ã¯ãªãŒãããã§ãã¯ããŸãã
å®è£ ããžãã¯ã§ã¯ãéå§æã«cryptã¹ããŒã³ã¡ãœãããåŒã³åºããæŽæ°ã§ã¯ãã¹ããŒã³ãããã¯ãªãŒãããã©ããããã®ã¯ãªãŒããæ»ãã§ãããã確èªãããŠã§ãŒãã®æ°ãšçŸåšã®ãŠã§ãŒããèæ ®ããŠãã¹ããŒã³ãŸãã¯ãã¬ã€ã€ãŒãåã£ããšèšããŸãã ãŸãã家ãç Žå£ãããŠãããã©ããã確èªããŸããç Žå£ãããŠããå Žåããã¬ã€ã€ãŒã¯è² ããŠããŸãã
4çªç®ã®ã¹ãããïŒå®è£
ããã§ãã²ãŒã ã®æåã®ããŒãžã§ã³ã®å®è£ ãäœæã§ããŸãã ãããã誰ããå°ããŸãïŒãã¿ã¯ãŒãšã¯ãªãŒãã¯ã©ã¹èªäœã¯ã©ãã§ããïŒã
Unityã§ã¯ãèŠèŠçã«æ§æããããã¬ããïŒããŸããŸãªçš®é¡ã®ã¿ã¯ãŒãã¯ãªãŒããããŠã¹ïŒãããã³è«ççã«ïŒã€ãŸããã³ã³ããŒãã³ããè¿œå ããŠïŒæ§æããŸãã ãŸããã³ã³ããŒãã³ãã®ããããã£ãæ§æããå¿ èŠããããããåå¥ã®ã¯ã©ã¹ãäœæããå¿ èŠã¯ãããŸããã ããããïŒOnTriggerEnter / OnTriggerExitã§ã®åå¿ã«ã€ããŠïŒã¯ãªãŒããšã¯äœããããŒã ã¯äœããç解ããå¿ èŠããããŸãã Unityã«ã¯ãã®ç®çã®ããã®ã¿ã°ããããŸãã 1ã€ã®ã²ãŒã ãªããžã§ã¯ãã ãã1ã€ã®ã¿ã°ãæã€ããšãã§ããã®ã¯ããããããŸãããããã¯æ®éã®ããšã§ãããŠãããŒãµã«ãªããžã§ã¯ããäœæããªãã§ãã ããã
UMLãã€ã¢ã°ã©ã ã³ãŒããçæãããããŒã®ã¹ã±ã«ãã³ãååŸããŠå®è£ ãå§ããŸãããã 次ã«ãã³ã³ããŒãã³ãã®åäœã®å®è£ ãäœæããŸãã ç¹å®ã®å®è£ ãããæœè±¡åã䜿çšããã»ããããããšãå¿ããªãã§ãã ããããã ããããã«ããæ¥ç¶æ§ãåäžããŸãã ç§ã®å®è£ ã®äŸã¯ã https ïŒ //github.com/sountex/COPTDã«ãããŸãã
ã§ãã ãããŠä»ãã²ãŒã ãã¬ã€ãæ¡å€§ããæ¹æ³-äŸãã°ãçµæžãè¿œå ããïŒ ä»ãããªãã¯å°äžå®€ã殺ãããã«ãéãåŸãå¿ èŠãããããããå¡ã®å»ºèšã«è²»ãããŸãã ã¯ãªãŒãåäœã®1ã€ãå®è£ ããã¯ã©ã¹ã«æ°ããããããã£ãæ¥ãã§è¿œå ããªãã§ãã ããã ã¯ã©ã¹åç¬ã®è²¬ä»»ã®ååãæ³èµ·ãããã®æ°ããåäœãæ°ããã³ã³ããŒãã³ãã«åé¢ããŸãã 殺ãããã«çšŒãã éé¡ã®ããŒã¿ãä¿åããåäœãå«ãæ°ããã³ã³ããŒãã³ããäœæããããšã«ãããåå©çšã«é©ããããè¯ããœãªã¥ãŒã·ã§ã³ãäœæããŸãã åå©çšã«ã€ããŠå°ãã ããšãã°ãRTSã«ã¯ã建ç©ã«ãã¡ãŒãžãäžããŠå¥ªããŠãããããããŸãã ã³ã³ããŒãã³ãæåã®ã¢ãããŒããšæœè±¡åã®ãããã§ãäœæããããã¹ãŠã®ã³ã³ããŒãã³ãã¯ãç°ãªããžã£ã³ã«ã®ã²ãŒã ã§ç°¡åã«äœ¿çšã§ããŸãã
次ã®ã¹ãããïŒãã¹ã
ã³ã³ããŒãã³ãã®ã»ãããšããŠã®ã²ãŒã ãªããžã§ã¯ãã®åäœããã¹ãããã«ã¯ãBDDïŒåäœé§åéçºïŒã䜿çšããã®ãæã䟿å©ã§ãã ãŸããåå¥ã®åäœãã¹ãã³ã³ããŒãã³ãããã¹ãããŸãã ããããããã¯å¥ã®åé¡ã§ãã