
4幎åã«æåã®èšäºã50 Unity Tipsããå ¬ââéããŸããã ãã®ã»ãšãã©ãäŸç¶ãšããŠé¢é£ããŠãããšããäºå®ã«ããããããã次ã®çç±ã§å€ããå€æŽãããŸããã
- ãŠããã£ãè¯ããªããŸããã ããšãã°ãFPSã«ãŠã³ã¿ãŒãä¿¡é Œã§ããããã«ãªããŸããã ããããã£ããã¯ãŒã䜿çšããæ©èœã«ãããã«ã¹ã¿ã ãšãã£ã¿ãŒãèšè¿°ããå¿
èŠãæžããŸããã ãã¬ããã䜿çšããæ¹æ³ã¯ãäºåå®çŸ©ããããã¹ãããããã¬ãããšãã®ä»£æ¿ã®èŠæ±ãå°ãªããªããŸããã ã¹ã¯ãªããå¯èœãªãªããžã§ã¯ãããã䜿ãããããªããŸããã
- Visual Studioãšã®çµ±åãæ¹åããããããã°ãã¯ããã«ç°¡åã«ãªããããµã«ããããã°ã®å¿
èŠæ§ãæžå°ããŸããã
- ãµãŒãããŒãã£ã®ããŒã«ãšã©ã€ãã©ãªãæ¹åãããŸããã Asset Storeã«ã¯å€ãã®ã¢ã»ããã衚瀺ãããŠãããèŠèŠçãªãããã°ããã®ã³ã°ãªã©ã®åŽé¢ãç°¡çŽ åãããŠããŸãã ç¬èªã®ïŒç¡æã®ïŒ æ¡åŒµãã©ã°ã€ã³ã®ã³ãŒãã®å€§éšåã¯ãç§ã®æåã®èšäºã§èª¬æãããŠããŸãïŒãããŠããã®å€§éšåã¯ããã§èª¬æãããŠããŸãïŒã
- ããŒãžã§ã³ç®¡çã®æ¹åã ïŒãããããã£ãšå¹ççã«äœ¿çšããããšãåŠãã ã ããããããŸããïŒã ããšãã°ããã¬ããçšã«è€æ°ã®ã³ããŒãŸãã¯ããã¯ã¢ããã³ããŒãäœæããå¿
èŠã¯ãããŸããã
- ç§ã¯ããçµéšãç©ãã§ããŸãã éå»4幎ã«ããã£ãŠãç§ã¯Unityã§å€ãã®ãããžã§ã¯ãã«åãçµã¿ãŸããããã®äžã«ã¯ãå€æ°ã®ã²ãŒã ãããã¿ã€ã ã Father.IOãªã©ã®å®æããã²ãŒã ãã¡ã€ã³ã®Unity ã°ãªããã¢ã»ãããªã©ããããŸãã
ãã®èšäºã¯ãäžèšã®ãã¹ãŠãèæ ®ããŠæ¹èšãããå ã®èšäºã®ããŒãžã§ã³ã§ãã
ãã³ãã«é²ãåã«ãæåã«çãã¡ã¢ãæ®ããŸãïŒæåã®èšäºãšåãã§ãïŒã ãããã®ãã³ãã¯ããã¹ãŠã®Unityãããžã§ã¯ãã«é©çšãããããã§ã¯ãããŸããã
- 圌ãã¯å°ããªããŒã ã®äžå¡ãšããŠãããžã§ã¯ãã«åãçµãã ç§ã®çµéšã«åºã¥ããŠããŸãïŒ3ã20人ïŒã
- æ§é åãåå©çšæ§ãã³ãŒãã®æå¿«ãããã®ä»ã®åŽé¢ã«ã¯ä»£åããããŸããããã¯ãããŒã ã®èŠæš¡ããããžã§ã¯ãã®èŠæš¡ããããžã§ã¯ãã®ç®æšã«äŸåããŸãã ããšãã°ã ããããã¹ãŠãgamejamã«äœ¿çšããããã§ã¯ãããŸãã ã
- å€ãã®ãã³ãã䜿çšããã®ã¯å¥œã¿ã®åé¡ã§ãïŒç°ãªãå ŽåããããŸãããããã«ãªã¹ããããŠãããã³ãã®ããããã«å¯ŸããŠã¯åªããææ³ã§ãïŒã
Unityã®Webãµã€ãã«ã¯ããããžã§ã¯ãã§ã®äœæ¥ã«é¢ããæšå¥šäºé ããããŸãïŒãã ãããããã®ã»ãšãã©ã¯ãããžã§ã¯ãã®çç£æ§ã®åäžãç®çãšããŠããŸãïŒ ïŒãããã¯ãã¹ãŠè±èªã§ãïŒ ã
- ãã¹ããã©ã¯ãã£ã¹
- ç©çããŒã¹ã®ã³ã³ãã³ãäœæã®ãã¹ããã©ã¯ãã£ã¹https://youtu.be/OeEYEUCa4tI
- Unityã®2Dãã¹ããã©ã¯ãã£ã¹https://youtu.be/HM17mAmLd7k
- Unityã®å éšçãªãã³ããšã³ãhttps://youtu.be/Ozc_hXzp_KU
- Unityã®ãã³ããšã³ãhttps://youtu.be/2S6Ygq58QF8
- http://docs.unity3d.com/Manual/HOWTO-ArtAssetBestPracticeGuide.html
äœæ¥ããã»ã¹
1.æåãããã¹ã±ãŒã«ã決å®ããåãã¹ã±ãŒã«ã§ãã¹ãŠãäœæããŸãã ããããªããšãåŸã§ã¢ã»ãããããçŽããªããã°ãªããªãå ŽåããããŸãïŒããšãã°ãã¢ãã¡ãŒã·ã§ã³ã¯åžžã«æ£ããã¹ã±ãŒãªã³ã°ãããŸããïŒã 3Dã²ãŒã ã®å Žåããããã1ã¡ãŒãã«ã«çžåœãã1ãŠããã£åäœãåãã®ãæåã§ãã ã©ã€ãã£ã³ã°ãšç©çåŠã䜿çšããªã2Dã²ãŒã ã®å Žåãéåžžã¯1ãã¯ã»ã«ïŒãåäœã解å床ïŒã«çžåœãã1ãŠããã£åäœãé©åã§ãã UIïŒããã³2Dã²ãŒã ïŒã®å Žåãåäœè§£å床ïŒHDãŸãã¯2xHDã䜿çšïŒãéžæãããã®è§£å床ã§ã¹ã±ãŒãªã³ã°ãããã¹ãŠã®ã¢ã»ãããäœæããŸãã
2.åã·ãŒã³ãå®è¡ããŸãã ããã«ãããã²ãŒã ãéå§ããããã«ã·ãŒã³ãåãæ¿ããããšãªãããã¹ãããã»ã¹ãé«éåã§ããŸãã ããã¯ããã¹ãŠã®ã·ãŒã³ã§å¿ èŠãªã·ãŒã³ã®ããŠã³ããŒãéã§æž¡ãããæ°žç¶ãªããžã§ã¯ãã䜿çšããå Žåã¯æ³šæãå¿ èŠã§ãã ãããå®çŸãã1ã€ã®æ¹æ³ã¯ãéä¿¡ããããªããžã§ã¯ããã·ã³ã°ã«ãã³ã«ããããšã§ããããã«ãããã·ãŒã³ã«ãªããªããžã§ã¯ãã¯èªåçã«ããŒããããŸãã ã·ã³ã°ã«ããŒã³ã«ã€ããŠã¯ãå¥ã®ãã³ãã§è©³ãã説æããŸãã
3.ãœãŒã¹ç®¡çã䜿çšããŠããããå¹æçã«äœ¿çšããæ¹æ³ãåŠã³ãŸãã
- ã¢ã»ãããããã¹ããšããŠã·ãªã¢ã«åããŸãã å®éãããã«ããã·ãŒã³ãšãã¬ããã®äºææ§ã¯åäžããŸããããå€æŽã®è¿œè·¡ã¯ç°¡åã«ãªããŸãã
- ã·ãŒã³ãšãã¬ãããå
±æããæŠç¥ããã¹ã¿ãŒããŸãã éåžžãè€æ°ã®äººãã·ãŒã³ããã¬ããã§äœæ¥ããã¹ãã§ã¯ãããŸããã å°ããªããŒã ã§ã¯ãã·ãŒã³ãŸãã¯ãã¬ããã§äœæ¥ãéå§ããåã«ãå
šå¡ã«äœæ¥ããªãããã«äŸé Œããã ãã§ååãªå ŽåããããŸãã ç©ççãªããŒã¯ã³ã䜿çšããŠãçŸåšã·ãŒã³ã§äœæ¥ããŠãããŠãŒã¶ãŒã瀺ããšäŸ¿å©ãªå ŽåããããŸãïŒããŒãã«ã«å¯Ÿå¿ããããŒã¯ã³ãããå Žåã®ã¿ãã·ãŒã³ã§äœæ¥ã§ããŸãïŒã
- ã¿ã°ãããã¯ããŒã¯ãšããŠäœ¿çšããŸãã
- åå²æŠç¥ãéžæããããã«åºå·ããŸãã ã·ãŒã³ãšãã¬ããã®æ¥ç¶ãã¹ã ãŒãºã«ããããšã¯äžå¯èœã§ãããããåå²ã¯éåžžã«è€éã«ãªãå¯èœæ§ããããŸãã ã©ã®åå²æ¹æ³ãéžæããŠããã·ãŒã³ãšãã¬ãããå
±æããããã®æŠç¥ãšé£æºããå¿
èŠããããŸãã
- ãµãã¢ãžã¥ãŒã«ã¯æ³šæããŠäœ¿çšããŠãã ããã ãµãã¢ãžã¥ãŒã«ã¯åå©çšå¯èœãªã³ãŒãããµããŒãããåªããæ¹æ³ã§ãããããã€ãã®å±éºããããŸãã
- éåžžãç°ãªããããžã§ã¯ãã®ã¡ã¿ãã¡ã€ã«ã¯åãã§ã¯ãããŸããã ããã¯éåžžãMonoBehaviourãŸãã¯ã¹ã¯ãªããåå¯èœãªãªããžã§ã¯ãã䜿çšããªãã³ãŒãã§ã¯åé¡ã«ãªããŸããããMonoBehaviourããã³ãµãã¢ãžã¥ãŒã«ã䜿çšããã¹ã¯ãªããåå¯èœãªãªããžã§ã¯ãã§ã¯ã³ãŒãã倱ãããå¯èœæ§ããããŸãã
- è€æ°ã®ãããžã§ã¯ãïŒ1ã€ãŸãã¯è€æ°ããµãã¢ãžã¥ãŒã«ã䜿çšïŒã§äœæ¥ããŠããå Žåããã¹ãŠã®ãããžã§ã¯ãã®ã³ãŒããå®å®ãããããã«ãç°ãªããããžã§ã¯ãã«å¯ŸããŠpull-merge-commit-pushãç¹°ãè¿ãå®è¡ããå¿ èŠããããšãã«ããæŽæ°ã®éªåŽ©ããçºçããããšããããŸãïŒãã®ããã»ã¹äžã«ä»ã®èª°ããå€æŽãå ãããšãéªåŽ©ãç¶ç¶ããå¯èœæ§ããããŸãïŒã ãã®åœ±é¿ãæå°éã«æãã1ã€ã®æ¹æ³ã¯ããµãã¢ãžã¥ãŒã«ã«é¢é£ãããããžã§ã¯ããããµãã¢ãžã¥ãŒã«ã«å€æŽãå ããããšã§ãã åæã«ããµãã¢ãžã¥ãŒã«ã䜿çšãããããžã§ã¯ãã¯åžžã«ãã«ããå¿ èŠããããããã·ã¥ããå¿ èŠã¯ãããŸããã
- éåžžãç°ãªããããžã§ã¯ãã®ã¡ã¿ãã¡ã€ã«ã¯åãã§ã¯ãããŸããã ããã¯éåžžãMonoBehaviourãŸãã¯ã¹ã¯ãªããåå¯èœãªãªããžã§ã¯ãã䜿çšããªãã³ãŒãã§ã¯åé¡ã«ãªããŸããããMonoBehaviourããã³ãµãã¢ãžã¥ãŒã«ã䜿çšããã¹ã¯ãªããåå¯èœãªãªããžã§ã¯ãã§ã¯ã³ãŒãã倱ãããå¯èœæ§ããããŸãã
4.åžžã«ã³ãŒããããã¹ãã·ãŒã³ãåé¢ããŸãã äžæçãªã¢ã»ãããšã¹ã¯ãªããã®ã³ãããããªããžããªã«ã³ãããããäœæ¥ãçµäºããããããããããžã§ã¯ãããåé€ããŸãã
5.ããŒã«ïŒç¹ã«UnityïŒãåæã«ã¢ããã°ã¬ãŒãããŸãã Unityã¯ãçŸåšã®ããŒãžã§ã³ä»¥å€ã®ãããžã§ã¯ããéããšãã«æ¥ç¶ãç¶æããã®ã«ã¯ããã«åªããŠããŸãããããŒã ã¡ã³ããŒãç°ãªãããŒãžã§ã³ã§äœæ¥ããŠããå Žåãæ¥ç¶ã倱ãããããšããããŸãã
6.ãµãŒãããŒãã£ã®ã¢ã»ãããã¯ãªãŒã³ãªãããžã§ã¯ãã«ã€ã³ããŒããããããã䜿çšããæ°ããããã±ãŒãžãã€ã³ããŒãããŸãã ãããžã§ã¯ãã«çŽæ¥ã€ã³ããŒããããšãã¢ã»ãããåé¡ãåŒãèµ·ããå ŽåããããŸãã
- è¡çªïŒãã¡ã€ã«ãŸãã¯ååïŒãçºçããå¯èœæ§ããããŸããç¹ã«ã Pluginsãã©ã«ããŒã®ã«ãŒãã«ãã¡ã€ã«ãå«ãè³ç£ããŸãã¯äŸã§æšæºè³ç£ã䜿çšããè³ç£ã®å Žåã§ãã
- ããããä¹±ãããã¡ã€ã«ããããžã§ã¯ãå šäœã«æ£ãã°ã£ãŠããå ŽåããããŸãã ããã¯ã䜿çšããªãããšã«æ±ºããŠåé€ãããå Žåã«ç¹ã«åé¡ã«ãªããŸãã
è³ç£ãããå®å šã«ããã«ã¯ã次ã®æé ã䜿çšããŸãã
1.æ°ãããããžã§ã¯ããäœæããã¢ã»ãããã€ã³ããŒãããŸãã
2.ãµã³ãã«ãå®è¡ããåäœããããšã確èªããŸãã
3.ã¢ã»ãããããé©åãªãã©ã«ããŒæ§é ã«æŽçããŸãã ïŒéåžžãã¢ã»ãããèªåã®ãã©ã«ããŒæ§é ã«é©åãããŸããããããããã¹ãŠã®ãã¡ã€ã«ãåããã©ã«ããŒã«ããããããžã§ã¯ãã®æ¢åã®ãã¡ã€ã«ãäžæžãã§ããéèŠãªå Žæã«ãã¡ã€ã«ããªãããšã確èªããŸããïŒ
4.ãµã³ãã«ãå®è¡ããåŒãç¶ãæ©èœããããšã確èªããŸãã ïŒã³ã³ããŒãã³ãã移åãããšãã«è³ç£ããå£ãããããšããããŸããããéåžžããã®åé¡ã¯çºçããŸãããïŒ
5.次ã«ãäžèŠãªã³ã³ããŒãã³ãïŒäŸãªã©ïŒãåé€ããŸãã
6.ã¢ã»ããããŸã ã³ã³ãã€ã«äžã§ããããã¬ããã«ãã¹ãŠã®æ¥ç¶ãããããšã確èªããŸãã æªãªãªãŒã¹ã®ãã®ããŸã ããå Žåã¯ããã¹ãããŸãã
7.ããã§ããã¹ãŠã®è³ç£ãéžæããããã±ãŒãžããšã¯ã¹ããŒãããŸãã
8.ãããžã§ã¯ãã«ã€ã³ããŒãããŸãã
7.ãã«ãããã»ã¹ãèªååããŸãã ããã¯å°èŠæš¡ãªãããžã§ã¯ãã§ã圹ç«ã¡ãŸãããç¹ã«æ¬¡ã®å Žåã«åœ¹ç«ã¡ãŸãã
- ã²ãŒã ã®å€ãã®ç°ãªãããŒãžã§ã³ãæ§ç¯ããå¿ èŠããããŸãã
- ç°ãªãã¬ãã«ã®æè¡ççµéšãæã€ä»ã®ããŒã ã¡ã³ããŒã«ã¢ã»ã³ããªãäœæããå¿ èŠãããããŸãã¯
- ãã«ãããåã«ãããžã§ã¯ãã«å°ããªå€æŽãå ããå¿ èŠããããŸãã
ãããè¡ãæ¹æ³ã«ã€ããŠã¯ã Unity Builds ScriptingïŒBasic and advanced capabilitiesãåç §ããŠãã ããã
8.èšå®ãææžåããŸãã ã»ãšãã©ã®ããã¥ã¡ã³ãã¯ã³ãŒãå ã«ããå¿ èŠããããŸããããã以å€ã®ããã¥ã¡ã³ããäœæããå¿ èŠããããŸãã éçºè ã«èšå®çšã®ã³ãŒãã調ã¹ãããããšã¯ãæéã浪費ããããšãæå³ããŸãã ææžåãããèšå®ã«ãããå¹çãåäžããŸãïŒææžãææ°ã®ç¶æ ã«ä¿ãããŠããå ŽåïŒã 以äžãææžåããŸãã
- ã¿ã°ã䜿çšããŸãã
- ã¬ã€ã€ãŒã®äœ¿çšïŒã³ãªãžã§ã³ãã«ãªã³ã°ãã¬ã€ãã£ã¹ãã£ã³ã°ã®å Žå-ã©ã®ã¬ã€ã€ãŒã«å«ãããã瀺ããŸãïŒã
- ã¬ã€ã€ãŒã®GUI深床ïŒäžã«é 眮ããå¿ èŠããããã®ïŒã
- ã·ãŒã³èšå®ã
- è€éãªãã¬ããã®æ§é ã
- éžæãããã€ãã£ãªã ã
- ãã«ãã®ã«ã¹ã¿ãã€ãºã
äžè¬çãªã³ãŒãã®ãã³ã
9.ãã¹ãŠã®ã³ãŒããããŒã ã¹ããŒã¹ã«é 眮ããŸãã ããã«ãããç¬èªã®ã©ã€ãã©ãªãšãµãŒãããŒãã£ã³ãŒãã®ã³ãŒã競åãåé¿ã§ããŸãã ãã ããéèŠãªã¯ã©ã¹ãšã®ã³ãŒãã®ç«¶åãåé¿ããããšãããšãã¯ãåå空éã«äŸåããªãã§ãã ããã ä»ã®åå空éã䜿çšããå Žåã§ããObjectãActionããŸãã¯Eventã¯ã©ã¹ãååãšããŠäœ¿çšããªãã§ãã ããã
10.ã¢ãµãŒã·ã§ã³ã䜿çšããŸãã ã¹ããŒãã¡ã³ãã¯ãã³ãŒãå ã®äžå€æ¡ä»¶ããã¹ãããã®ã«åœ¹ç«ã¡ãè«ççãªãã°ãåãé€ãã®ã«åœ¹ç«ã¡ãŸãã ã¯ã¬ãŒã ã¯ã Unity.Assertions.Assertã¯ã©ã¹ãä»ããŠå©çšã§ããŸãã æ¡ä»¶ããã§ãã¯ããæ£ãããªãå Žåã¯ã³ã³ãœãŒã«ã«ã¡ãã»ãŒãžãæžã蟌ã¿ãŸãã ã¹ããŒãã¡ã³ãã圹ç«ã€çç±ãããããªãå Žåã¯ãã ã¢ãµãŒã·ã§ã³ã䜿çšããããã°ã©ãã³ã°ã®å©ç¹ïŒå¥åassertã¹ããŒãã¡ã³ãïŒããåç §ããŠãã ããã
11.ããã¹ãã®è¡šç€ºä»¥å€ã«æååã䜿çšããªãã§ãã ããã ç¹ã«ããªããžã§ã¯ããŸãã¯ãã¬ãããèå¥ããããã«æååã䜿çšããªãã§ãã ããã äŸå€ããããŸãïŒUnityã«ã¯ååãä»ããŠã®ã¿ã¢ã¯ã»ã¹ã§ããèŠçŽ ããŸã ãããŸãïŒã ãã®ãããªå Žåã¯ãAnimationNamesãAudioModuleNamesãªã©ã®ãã¡ã€ã«ã«å®æ°ãªã©ã®æååãå®çŸ©ããŸãã ãã®ãããªã¯ã©ã¹ã管çäžèœã«ãªã£ãå Žåããã¹ããããã¯ã©ã¹ã䜿çšããŠãAnimationNames.Player.Runã®ãããªãã®ãå°å ¥ããŸãã
12. InvokeãšSendMessageã䜿çšããªãã§ãã ããã ãããã®MonoBehaviourã¡ãœããã¯ãä»ã®ã¡ãœãããååã§åŒã³åºããŸãã ååã§åŒã³åºãããã¡ãœããã¯ãã³ãŒãå ã§è¿œè·¡ããã®ãå°é£ã§ãïŒã䜿çšæ³ãã¯èŠã€ãããŸãããSendMessageã®ã¹ã³ãŒãã¯åºãã远跡ãããã«å°é£ã§ãïŒã
ã³ã«ãŒãã³ãšã¢ã¯ã·ã§ã³CïŒã䜿çšããŠãç¬èªã®ããŒãžã§ã³ã®Invokeãç°¡åã«äœæã§ããŸãã
public static Coroutine Invoke(this MonoBehaviour monoBehaviour, Action action, float time) { return monoBehaviour.StartCoroutine(InvokeImpl(action, time)); } private static IEnumerator InvokeImpl(Action action, float time) { yield return new WaitForSeconds(time); action(); }
次ã«ãMonoBehaviourã§æ¬¡ã®ããã«äœ¿çšã§ããŸãã
this.Invoke(ShootEnemy); // ShootEnemy - (void) .
ïŒ è¿œå ïŒèª°ããUnityã€ãã³ãã·ã¹ãã ã®äžéšã§ããExecuteEventã¯ã©ã¹ã代æ¿ãšããŠäœ¿çšããããšãææ¡ããŸããããããŸã§ã®ãšãããç§ã¯ããã«ã€ããŠããŸãç¥ããŸããããããã«èª¿æ»ãã䟡å€ãããããã§ããïŒ
13.ã²ãŒã ããã¬ã€ãããšãã«ãã¹ããŒã³ããããªããžã§ã¯ããéå±€ãé£èªåããªãããã«ããŠãã ããã ã²ãŒã ã®ãã¬ã€äžã«ãªããžã§ã¯ããèŠã€ããããããããã«ãã·ãŒã³å ã®ãªããžã§ã¯ãããããã®èŠªãšããŠèšå®ããŸãã 空ã®ã²ãŒã ãªããžã§ã¯ãããŸãã¯ã·ã³ã°ã«ãã³ïŒãã®èšäºã®åŸåãåç §ïŒãåäœãªãã§äœ¿çšããŠãã³ãŒãã§ç°¡åã«ã¢ã¯ã»ã¹ã§ããŸãã ãã®ãªããžã§ã¯ãã«DynamicObjectsãšããååãä»ããŸãã
14. nullãæå¹ãªå€ãšããŠäœ¿çšããå Žåã¯æ£ç¢ºã«æå®ããå¯èœãªå Žåã¯äœ¿çšããªãã§ãã ããã
NULLå€ã¯ãç¡å¹ãªã³ãŒããæ¢ããšãã«åœ¹ç«ã¡ãŸãã ãã ããnullãç¡èŠããç¿æ £ã«ãªããšã誀ã£ãã³ãŒããæ£åžžã«å®è¡ãããé·ãéãšã©ãŒã«æ°ä»ããªãã§ãããã ããã«ãåã¬ã€ã€ãŒã¯nullå€æ°ãç¡èŠãããããã³ãŒãã®å¥¥æ·±ãã§å®£èšã§ããŸãã æå¹ãªå€ãšããŠnullã䜿çšããªãããã«ããŸãã
ç§ã¯æ¬¡ã®ã€ãã£ãªã ã奜ã¿ãŸãïŒnullããã§ãã¯ãããåé¡ãçºçãããšãã«ã³ãŒããæãèœã¡ãããã«ããŸãã åå©çšå¯èœãªã¡ãœããã§ã¯ãå€æ°ã®nullããã§ãã¯ãããšã©ãŒã«ã€ãªããå¯èœæ§ã®ããä»ã®ã¡ãœããã«å€æ°ãæž¡ã代ããã«äŸå€ãã¹ããŒããããšããããŸãã
å Žåã«ãã£ãŠã¯ãnullãæå¹ã§ãããããç°ãªãæ¹æ³ã§åŠçãããããšããããŸãã ãã®ãããªå Žåãå€ãnullã«ãªãçç±ã瀺ãã³ã¡ã³ããè¿œå ããå¿ èŠããããŸãã
ã€ã³ã¹ãã¯ã¿ãŒã§æ§æãããå€ã«ã¯ãäžè¬çãªã¹ã¯ãªããããã䜿çšãããŸãã ãŠãŒã¶ãŒã¯å€ãæå®ã§ããŸãããæå®ããªãå Žåã¯ããã©ã«ãå€ã䜿çšãããŸãã ãããè¡ãæè¯ã®æ¹æ³ã¯ãTã®å€ãã©ããããOptional â¹Tâºã¯ã©ã¹ã䜿çšããããšã§ãïŒããã¯ãNullable â¹Tâºã«å°ã䌌ãŠããŸãïŒãç¹å¥ãªããããã£ã¬ã³ãã©ãŒã䜿çšããŠããã§ãã¯ããã¯ã¹ãã¬ã³ããªã³ã°ãããã§ãã¯ããã¯ã¹ããªã³ã®å Žåã®ã¿ãã§ãã¯ããã¯ã¹ã衚瀺ã§ããŸãã ïŒæ®å¿µãªããããžã§ããªãã¯ã¯ã©ã¹ãçŽæ¥äœ¿çšããããšã¯äžå¯èœã§ããTã®ç¹å®ã®å€ã«å¯ŸããŠã¯ã©ã¹ãæ¡åŒµããå¿ èŠããããŸããïŒ
[Serializable] public class Optional { public bool useCustomValue; public T value; }
ã³ãŒãã§ã¯ã次ã®ããã«äœ¿çšã§ããŸãã
health = healthMax.useCustomValue ? healthMax.Value : DefaultHealthMax;
è¿œå ïŒå€ãã®äººã ã¯ãæ§é äœã䜿çšããæ¹ãè¯ããšèšã£ãŠããŸãïŒãŽããäœæãããnullã«ããããšã¯ã§ããŸããïŒã ãã ããããã¯ãã€ã³ã¹ãã¯ã¿ãŒã§äœ¿çšã§ãããã£ãŒã«ãã«é©çšãããããªæ¹æ³ã§ãéãžã§ããªãã¯ã¯ã©ã¹ã®åºæ¬ã¯ã©ã¹ãšããŠäœ¿çšã§ããªãããšãæå³ããŸãã
15.ã³ã«ãŒãã³ã䜿çšããå Žåãã³ã«ãŒãã³ãå¹æçã«äœ¿çšããããšãåŠã³ãŸãã ã³ã«ãŒãã³ã¯ãå€ãã®åé¡ã解決ãã䟿å©ãªæ¹æ³ã§ãã ãã ãããããã°ã¯å°é£ã§ããããã®å©ããåããã°ãã³ãŒããç°¡åã«ã«ãªã¹ã«å€ããããšãã§ããŸãã
ç解ããå¿ èŠããããŸãïŒ
- ã³ã«ãŒãã³ã䞊è¡ããŠå®è¡ããæ¹æ³ã
- ã³ã«ãŒãã³ãé 次å®è¡ããæ¹æ³ã
- æ¢åã®ã³ã«ãŒãã³ããæ°ããã³ã«ãŒãã³ãäœæããæ¹æ³ã
- CustomYieldInstructionã䜿çšããŠç¬èªã®ã³ã«ãŒãã³ãäœæããæ¹æ³ã
// IEnumerator RunInParallel() { yield return StartCoroutine(Coroutine1()); yield return StartCoroutine(Coroutine2()); } public void RunInSequence() { StartCoroutine(Coroutine1()); StartCoroutine(Coroutine1()); } Coroutine WaitASecond() { return new WaitForSeconds(1); }
16.æ¡åŒµã¡ãœããã䜿çšããŠãå ±éã®ã€ã³ã¿ãŒãã§ãŒã¹ãå ±æããã³ã³ããŒãã³ããæäœããŸãã ïŒ è¿œå ïŒ GetComponentããã®ä»ã®ã¡ãœãããã€ã³ã¿ãŒãã§ã€ã¹ã§æ©èœããããã«ãªã£ãããããã®ã¢ããã€ã¹ã¯åé·ã§ãïŒç¹å®ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã³ã³ããŒãã³ããååŸãããããã®ãããªã³ã³ããŒãã³ããæã€ãªããžã§ã¯ããæ€çŽ¢ããããããšäŸ¿å©ãªå ŽåããããŸãã
以äžã®å®è£ ã§ã¯ããããã®é¢æ°ã®æ±çšããŒãžã§ã³ã®ä»£ããã«typeofã䜿çšããŸãã æ±çšããŒãžã§ã³ã¯ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯æ©èœãããtypeofã¯æ©èœããŸãã 以äžã®ã¡ãœããã¯ããžã§ããªãã¯ã¡ãœããã§ã©ããããŸãã
public static TInterface GetInterfaceComponent(this Component thisComponent) where TInterface : class { return thisComponent.GetComponent(typeof(TInterface)) as TInterface; }
17.æ¡åŒµã¡ãœããã䜿çšããŠãæ§æããã䟿å©ã«ããŸãã äŸïŒ
public static class TransformExtensions { public static void SetX(this Transform transform, float x) { Vector3 newPosition = new Vector3(x, transform.position.y, transform.position.z); transform.position = newPosition; } ... }
18.ããæè»ãªGetComponentã®ä»£æ¿æ段ã䜿çšããŸãã RequireComponentã䜿çšããŠäŸåé¢ä¿ã匷å¶çã«è¿œå ããã®ã¯äžå¿«ãªå ŽåããããŸããç¹ã«ãšã€ãªã¢ã³ã¯ã©ã¹ã§GetComponentãåŒã³åºãå Žåã¯ãåžžã«å¯èœãŸãã¯åãå ¥ãããããšã¯éããŸããã ãŸãã¯ããªããžã§ã¯ããèŠã€ãããªãå Žåã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããå¿ èŠãããå Žåã¯ã次ã®GameObjectæ¡åŒµæ©èœã䜿çšã§ããŸãã
public static T GetRequiredComponent(this GameObject obj) where T : MonoBehaviour { T component = obj.GetComponent(); if(component == null) { Debug.LogError(" " + typeof(T) + ", ", obj); } return component; }
19.åãããšãããããã«ç°ãªãã€ãã£ãªã ã䜿çšããªãã§ãã ããã å€ãã®å Žåãç©äºãè¡ãããã®ããŸããŸãªæ £çšçãªæ¹æ³ããããŸãã ãã®ãããªå Žåã1ã€ã®ã€ãã£ãªã ãéžæããŠããããžã§ã¯ãå šäœã«äœ¿çšããŸãã çç±ã¯æ¬¡ã®ãšããã§ãã
- äžéšã®ã€ãã£ãªã ã¯äºææ§ãäžååã§ãã ããã€ãã£ãªã ã䜿çšãããšãå¥ã®ã€ãã£ãªã ã«é©ããªãæ¹åã«éçºãæ瀺ãããŸãã
- ãããžã§ã¯ãå šäœã§1ã€ã®ã€ãã£ãªã ã䜿çšãããšããããžã§ã¯ãåå è ã¯äœãèµ·ãã£ãŠããããããããç解ã§ããŸãã åæã«ãæ§é ãšã³ãŒããããç解ãããããªãããšã©ãŒã®å¯èœæ§ãæžå°ããŸãã
ã€ãã£ãªã ã°ã«ãŒãã®äŸïŒ
- ã³ã«ãŒãã³ã¯æéç¶æ ãã·ã³ã§ãã
- çµã¿èŸŒã¿ã®ãã¬ãã-æ¥ç¶ããããã¬ãã-ç¥ã®ãã¬ããã
- ããŒã¿å ±ææŠç¥ã
- 2Dã²ãŒã ã®ç¶æ ã«ã¹ãã©ã€ãã䜿çšããæ¹æ³ã
- ãã¬ããã®æ§é ã
- ç£åµæŠç¥ã
- ãªããžã§ã¯ããèŠã€ããæ¹æ³ïŒã¿ã€ã/åå/ã¿ã°/ã¬ã€ã€ãŒ/ãªã³ã¯å¥ã
- ãªããžã§ã¯ããã°ã«ãŒãåããæ¹æ³ïŒã¿ã€ã/åå/ã¿ã°/ã¬ã€ã€ãŒ/ãªã³ã¯ã®é åã
- ä»ã®ã³ã³ããŒãã³ãã®ã¡ãœãããåŒã³åºãæ¹æ³ã
- ãªããžã§ã¯ãã®ã°ã«ãŒã/èªå·±ç»é²ãæ€çŽ¢ããŸãã
- å®è¡é åºã®å¶åŸ¡ïŒUnityã®å®è¡é åºèšå®ã䜿çš-yield-logic-Awake / Startããã³Update / Late Update-æåã«ããæ¹æ³-ä»»æã®ã¢ãŒããã¯ãã£
- ããŠã¹ã䜿çšããã²ãŒã å ã®ãªããžã§ã¯ã/äœçœ®/ç®æšã®éžæïŒéžæãããŒãžã£ãŒã¯ããŒã«ã«ã®èªæ²»ã§ãã
- ã·ãŒã³ãå€æŽãããšãã®ããŒã¿ã¹ãã¬ãŒãžïŒ PlayerPrefsã䜿çšããããæ°ããã·ãŒã³ãããŒããããšãã«ç Žæ£ãããªãïŒ ç Žæ£ããïŒãªããžã§ã¯ãã䜿çšããŸãã
- ã¢ãã¡ãŒã·ã§ã³ãçµã¿åãããïŒãã¬ã³ããè¿œå ãã¬ã€ã€ãŒåïŒæ¹æ³ã
- å ¥ååŠçïŒäžå€®-ããŒã«ã«ïŒ
20.äžæåæ¢ãç°¡åã«åŠçã§ããããã«ãç¬èªã®æéã¯ã©ã¹ãäœæããŠç¶æããŸãã Time.DeltaTimeãšTime.TimeSinceLevelLoadãã©ããããŠãäžæåæ¢ãšæéã¹ã±ãŒã«ãå¶åŸ¡ããŸãã ã¯ã©ã¹ã䜿çšããã«ã¯èŠåŸãå¿ èŠã§ãããç¹ã«ããŸããŸãªã¿ã€ããŒïŒããšãã°ãã€ã³ã¿ãŒãã§ã€ã¹ã¢ãã¡ãŒã·ã§ã³ãã²ãŒã ã¢ãã¡ãŒã·ã§ã³ïŒã§å®è¡ããå Žåããã¹ãŠãéåžžã«ç°¡åã«ãªããŸãã
è¿œå ïŒ Unityã¯unscaledTimeãšunscaledDeltaTimeããµããŒãããå€ãã®ç¶æ³ã§ãã€ãã£ãæéã¯ã©ã¹ãåé·ã«ããŸãã ããããã°ããŒãã«æéã®ã¹ã±ãŒãªã³ã°ããæãŸãããªãæ¹æ³ã§èšè¿°ããªãã£ãã³ã³ããŒãã³ãã«åœ±é¿ãäžããå ŽåãäŸç¶ãšããŠæçšã§ãã
21.æŽæ°ãå¿ èŠãªãŠãŒã¶ãŒã¯ã©ã¹ã¯ãã°ããŒãã«ãªéçæéã«ã¢ã¯ã»ã¹ã§ããŸããã 代ããã«ãUpdateã¡ãœããã®ãã©ã¡ãŒã¿ãŒãšããŠæéå·®ãåãåãå¿ èŠããããŸãã ããã«ãããäžèšã®äžæåæ¢ã·ã¹ãã ãå®è£ ãããšãããŸãã¯ã«ã¹ã¿ã ã¯ã©ã¹ã®åäœãé«éåãŸãã¯äœéåãããšãã«ããããã®ã¯ã©ã¹ã䜿çšã§ããŸãã
22. WWWåŒã³åºããè¡ãããã«å ±éã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸãã ãµãŒããŒãšã®éä¿¡éãå€ãã²ãŒã ã§ã¯ãéåžžãäœåãã®WWWåŒã³åºãããããŸãã çã®WWW Unityã¯ã©ã¹ã䜿çšããããã©ã°ã€ã³ã䜿çšãããã«é¢ä¿ãªãããã€ã©ãŒãã¬ãŒãã®ããã«æ©èœããèãã¬ã€ã€ãŒãäžã«æžããšäŸ¿å©ã§ãã
ç§ã¯éåžžãCallã¡ãœããïŒGetãšPostãšã¯å¥ã«ïŒãCallImplããã³MakeHandlerã³ã«ãŒãã³ãå®çŸ©ããŸãã æ¬è³ªçã«ãCallã¡ãœããã¯ãMakeHandlerã¡ãœããã䜿çšããŠãããŒãµãŒããã®ãã¹ãŒããŒãã³ãã©ãŒããæåæããã³å€±ææã®ãã³ãã©ãŒãäœæããŸãã ãŸããCallImplã³ã«ãŒãã³ãåŒã³åºããŸããããã¯URLã圢æããåŒã³åºããè¡ããå®äºãããŸã§åŸ æ©ããŠããããã¹ãŒããŒãã³ãã©ãŒããåŒã³åºããŸãã
ããã¯æ¬¡ã®ãããªãã®ã§ãã
public void Call<T>(string call, Func<string, T> parser, Action<T> onSuccess, Action<string> onFailure) { var handler = MakeHandler(parser, onSuccess, onFailure); StartCoroutine(CallImpl(call, handler)); } public IEnumerator CallImpl<T>(string call, Action<T> handler) { var www = new WWW(call); yield return www; handler(www); } public Action<WWW> MakeHandler<T>(Func<string, T> parser, Action<T> onSuccess, Action<string> onFailure) { return (WWW www) => { if(NoError(www)) { var parsedResult = parser(www.text); onSuccess(parsedResult); } else { onFailure(" "); } } }
ãã®ã¢ãããŒãã«ã¯ããã€ãã®å©ç¹ããããŸãã
- 倧éã®å®åã³ãŒãã®èšè¿°ãåé¿ããŸã
- æåã«å¿ èŠãªèŠçŽ ãåŠçããããšãã§ããŸãïŒããšãã°ãããŒãUIã³ã³ããŒãã³ãã®è¡šç€ºãç¹å®ã®äžè¬çãªãšã©ãŒã®åŠçãªã©ïŒã
23.ããã¹ããããããããå Žåã¯ããã¡ã€ã«ã«å ¥ããŸãã ã€ã³ã¹ãã¯ã¿ãŒã®ç·šéãã£ãŒã«ãã«ã¯å ¥ããªãã§ãã ããã Unityãšãã£ã¿ãŒãéããã«ãç¹ã«ã·ãŒã³ãä¿åããããšãªãããã°ããå€æŽã§ããããã«ããŸãã
24.ããŒã«ã©ã€ãºãèšç»ããŠããå Žåã¯ããã¹ãŠã®è¡ã1ãæã«åããŸãã ãããè¡ãã«ã¯ããã€ãã®æ¹æ³ããããŸãã ãããã®1ã€ã¯ãåè¡ã«publicã¿ã€ãã®æååãã£ãŒã«ããæã€Textã¯ã©ã¹ãå®çŸ©ããããšã§ããããã©ã«ãã§ã¯ãããšãã°è±èªãèšå®ãããŸãã ä»ã®èšèªã¯åã¯ã©ã¹ã«ãªããé¡äŒŒèšèªã§ãã£ãŒã«ããååæåããŸãã
ããè€éãªæ¹æ³ïŒå€§éã®ããã¹ããŸãã¯å€æ°ã®èšèªã«é©ããŠããŸãïŒã¯ãã¹ãã¬ããã·ãŒããèªã¿åããéžæããèšèªã«åºã¥ããŠç®çã®è¡ãéžæããããžãã¯ãäœæããããšã§ãã
ã¯ã©ã¹èšèš
25.æ€æ»ããããã£ãŒã«ãã®äœ¿çšæ¹æ³ã決å®ãããããæšæºã«ããŸãã 2ã€ã®æ¹æ³ããããŸãïŒãã£ãŒã«ãããããªãã¯ã«ãããããã£ãŒã«ãããã©ã€ããŒãã«ããŠ[SerializeField]ãšããŠããŒã¯ããŸãã åŸè ã¯ãããæ£ç¢ºãã§ãããå©äŸ¿æ§ã¯å£ããŸãïŒãã®æ¹æ³ã¯Unityèªäœã«ã¯ããŸãæ®åããŠããŸããïŒã éžæãããã®ãäœã§ããããããæšæºã«ããŠãããŒã ã®éçºè ããããªãã¯ãã£ãŒã«ãã®è§£éæ¹æ³ãç解ã§ããããã«ããŸãã
- æ€æ»ããããã£ãŒã«ãã¯å
¬éãããŠããŸãã ãã®å Žåããããªãã¯ãšã¯æ¬¡ã®ãšããã§ãããå€æ°ã¯ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«èšèšè
ãå®å
šã«å€æŽã§ããŸãã ã³ãŒãã§ãã®å€ãèšå®ããªãã§ãã ããã
- æ€æ»ããããã£ãŒã«ãã¯ãã©ã€ããŒãã§ãããSerializableãšããŠããŒã¯ãããŸãã ãã®å Žåãpublicãšã¯ããã³ãŒãå ã§ãã®å€æ°ãå®å šã«å€æŽã§ãããããšãæå³ããŸãïŒãããã£ãŠããããã®å€ãã¯ååšãããMonoBehavioursããã³ScriptableObjectsã«ã¯ãããªãã¯ãã£ãŒã«ãã¯ãããŸããïŒã
26.ã€ã³ã¹ãã¯ã¿ãŒã§æ§æããå¿ èŠããªãéããã³ã³ããŒãã³ãå€æ°ãå ¬éããªãã§ãã ããã ããã§ãªãå Žåãç¹ã«åœŒããäœãããŠããããæ確ã§ãªãå Žåã¯ããã¶ã€ããŒã«ãã£ãŠå€æŽãããŸãã ãŸãã«ããããåé¿ã§ããªãå ŽåããããŸãïŒããšãã°ãäžéšã®ãšãã£ã¿ãŒã¹ã¯ãªãããå€æ°ã䜿çšããå¿ èŠãããå ŽåïŒã ãã®å Žåã HideInInspectorå±æ§ã䜿çšããŠãã€ã³ã¹ãã¯ã¿ãŒã§é衚瀺ã«ããå¿ èŠããããŸãã
27.ããããã£ããã¯ãŒã䜿çšããŠããã£ãŒã«ãããã䜿ããããããŸãã ããããã£ããã¯ãŒã䜿çšããŠãã€ã³ã¹ãã¯ã¿ãŒã§ã³ã³ãããŒã«ãæ§æã§ããŸãã ããã«ãããããŒã¿ã®ã¿ã€ããšæ¿å ¥ä¿è·ã«æé©ãªã³ã³ãããŒã«ãäœæã§ããŸãïŒããšãã°ãå€æ°ã®å€ãå¶éããïŒã Headerå±æ§ã䜿çšããŠãã£ãŒã«ããæŽçãã Tooltipå±æ§ã䜿çšããŠãã¶ã€ããŒã«è¿œå ã®ããã¥ã¡ã³ããæäŸããŸãã
28.ã«ã¹ã¿ã ãšãã£ã¿ãŒã§ã¯ãªãããããã£ããã¯ãŒãåªå ããŸã ã ããããã£ããã¯ãŒã¯ãã£ãŒã«ãã¿ã€ãããšã«å®è£ ãããŸããã€ãŸããå®è£ ã«ãããæéãå€§å¹ ã«ççž®ãããŸãã ãŸããç¹°ãè¿ã䜿çšããæ¹ã䟿å©ã§ããåã®å®è£ åŸã¯ãä»»æã®ã¯ã©ã¹ã®åãåã«äœ¿çšã§ããŸãã ã«ã¹ã¿ã ãšãã£ã¿ãŒã¯MonoBehaviourã«å®è£ ãããŠãããããåå©çšãé£ãããããå€ãã®äœæ¥ãå¿ èŠã§ãã
29.ããã©ã«ãã§ã¯ãMonoBehavioursããå°å°ãããŸãïŒå°å°ããã修食åã䜿çšããŸãïŒã äžè¬ã«ãMonoBehaviours Unityã¯ç¶æ¿ã«ã¯ããŸã䟿å©ã§ã¯ãããŸããã
- UnityãStartãUpdateãªã©ã®ã¡ãã»ãŒãžã¡ãœãããåŒã³åºãæ¹æ³ã¯ããããã®ã¡ãœããããµãã¯ã©ã¹ã§ã©ã®ããã«æ©èœããããè€éã«ããŸãã 泚æããªããšãééã£ãèŠçŽ ãåŒã³åºãããããåºæ¬ã¡ãœããã®åŒã³åºããå¿ããŸãã
- ã«ã¹ã¿ã ãšãã£ã¿ãŒã䜿çšããå Žåãéåžžã¯ãšãã£ã¿ãŒã®ç¶æ¿éå±€ãã³ããŒããå¿ èŠããããŸãã 誰ããã¯ã©ã¹ã®1ã€ãæ¡åŒµããå¿ èŠãããå Žåãç¬èªã®ãšãã£ã¿ãŒãäœæããããäœæãããã®ã«å¶éããå¿ èŠããããŸãã
ç¶æ¿ãå¿ èŠãªå Žåããããåé¿ã§ããå Žåã¯Unityã¡ãã»ãŒãžã¡ãœããã䜿çšããªãã§ãã ããã åŒãç¶ã䜿çšããå Žåã¯ãä»®æ³åããªãã§ãã ããã å¿ èŠã«å¿ããŠãã¡ãã»ãŒãžã¡ãœããããåŒã³åºããã空ã®ä»®æ³é¢æ°ãå®çŸ©ã§ããŸãããã®ä»®æ³é¢æ°ã¯ãåã¯ã©ã¹ããªãŒããŒã©ã€ãããŠè¿œå ã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸãã
public class MyBaseClass { public sealed void Update() { CustomUpdate(); ... // update } // , update // update. virtual public void CustomUpdate(){}; } public class Child : MyBaseClass { override public void CustomUpdate() { // - } }
ããã«ãããã¯ã©ã¹ã誀ã£ãŠã³ãŒãããªãŒããŒã©ã€ãããããšãé²ããŸãããUnityã¡ãã»ãŒãžãæå¹ã«ããããšã¯ã§ããŸãã åé¡ã«ãªãããããã®é åºã¯å¥œãã§ã¯ãããŸããã äžèšã®äŸã§ã¯ãã¯ã©ã¹ãç¬èªã®æŽæ°ãå®äºããçŽåŸã«ãåã¯ã©ã¹ãæäœãå®è¡ããå¿ èŠãããå ŽåããããŸãã
30.ã€ã³ã¿ãŒãã§ã€ã¹ãã²ãŒã ããžãã¯ããåé¢ããŸãã äžè¬ã«ãã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ããŒãã³ãã¯ã䜿çšãããã²ãŒã ã«ã€ããŠäœãç¥ããªãããã«ããå¿ èŠããããŸãã 衚瀺ããããŒã¿ããããã«æž¡ãããŠãŒã¶ãŒãUIã³ã³ããŒãã³ããšå¯Ÿè©±ãããšãã«ãã§ãã¯ãããã€ãã³ãããµãã¹ã¯ã©ã€ãããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ããŒãã³ãã¯ãã²ãŒã ããžãã¯ã«åŸãå¿ èŠã¯ãããŸããã å ¥åããŒã¿ããã£ã«ã¿ãªã³ã°ããŠããã®æ£ç¢ºæ§ããã§ãã¯ã§ããŸãããåºæ¬ã«ãŒã«ãå®è£ ããã¹ãã§ã¯ãããŸããã å€ãã®ããºã«ã²ãŒã ã§ã¯ããã£ãŒã«ãèŠçŽ ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®æ¡åŒµã§ãããã«ãŒã«ãå«ããã¹ãã§ã¯ãããŸããã ïŒããšãã°ããã§ã¹ã®é§ã¯ãèš±å¯ãããåããèšç®ãã¹ãã§ã¯ãããŸãããïŒ
å ¥åæ å ±ãããã®æ å ±ã«åºã¥ããŠåäœããããžãã¯ããåé¢ããå¿ èŠããããŸãã 移åã®å¿ èŠæ§ã«ã€ããŠä¿³åªã«éç¥ããå ¥åã³ã³ãããŒã©ãŒã䜿çšãã俳åªã¯ãã€ç§»åãããã決å®ããŸãã
ãŠãŒã¶ãŒãç¹å®ã®ãªã¹ãããæŠåšãéžæã§ããããã«ããUIã³ã³ããŒãã³ãã®ç°¡åãªäŸã次ã«ç€ºããŸãã ãããã®ã¯ã©ã¹ãã²ãŒã ã«é¢ããŠç¥ã£ãŠããã®ã¯æŠåšã¯ã©ã¹ã ãã§ãïŒæŠåšã¯ã©ã¹ã¯ãã®ã³ã³ããã衚瀺ããããŒã¿ã®æçšãªãœãŒã¹ã§ããããã§ãïŒã ã²ãŒã ã¯ã³ã³ããã«ã€ããŠãäœãç¥ããŸããã 圌女ã¯OnWeaponSelectã€ãã³ããç»é²ããã ãã§ãã
public WeaponSelector : MonoBehaviour { public event Action OnWeaponSelect {add; remove; } //GameManager public void OnInit(List weapons) { foreach(var weapon in weapons) { var button = ... // buttonOnInit(weapon, () => OnSelect(weapon)); // , // } } public void OnSelect(Weapon weapon) { if(OnWepaonSelect != null) OnWeponSelect(weapon); } } public class WeaponButton : MonoBehaviour { private Action<> onClick; public void OnInit(Weapon weapon, Action onClick) { ... // this.onClick = onClick; } public void OnClick() // OnClick UI Button { Assert.IsTrue(onClick != null); // onClick(); } }
31.æ§æãã¹ããŒã¿ã¹ãããã³ãµããŒãæ å ±ãåé¢ããŸãã
- æ§æå€æ°ã¯ããã®ããããã£ãä»ããŠãªããžã§ã¯ããå®çŸ©ããããã«ãªããžã§ã¯ãã§æ§æãããå€æ°ã§ãã ããšãã°ã maxHealth ã
- ç¶æ å€æ°ã¯ããªããžã§ã¯ãã®çŸåšã®ç¶æ ãå®å šã«æ±ºå®ããå€æ°ã§ãã ãããã¯ãã²ãŒã ãä¿åããµããŒãããŠããå Žåã«ä¿åããå¿ èŠãããå€æ°ã§ãã ããšãã°ã currentHealthã§ãã
- ç°¿èšå€æ°ã¯ãé床ãå©äŸ¿æ§ãããã³é·ç§»ç¶æ ã«äœ¿çšãããŸãã ãããã¯ç¶æ å€æ°ããå®å šã«æ±ºå®ã§ããŸãã ããšãã°ã previousHealth ã
ãããã®ã¿ã€ãã®å€æ°ãåé¢ããããšã«ããããããã¯ãŒã¯ãä»ããŠéä¿¡ãåä¿¡ããå¿ èŠããããã®ãä¿åããå¿ èŠããããã®ãå€æŽããããšãã§ããããšãç解ã§ããŸãã ãã®ãããªåé¢ã®ç°¡åãªäŸã次ã«ç€ºããŸãã
public class Player { [Serializable] public class PlayerConfigurationData { public float maxHealth; } [Serializable] public class PlayerStateData { public float health; } public PlayerConfigurationData configuration; private PlayerState stateData; // private float previousHealth; public float Health { public get { return stateData.health; } private set { stateData.health = value; } } }
32.ã¿ã€ãpublicã®ã€ã³ããã¯ã¹é åã䜿çšããªãã§ãã ããã ããšãã°ã次ã®ããã«æŠåšã®é åã匟䞞ã®é åãç²åã®é åãå®çŸ©ããªãã§ãã ããã
public void SelectWeapon(int index) { currentWeaponIndex = index; Player.SwitchWeapon(weapons[currentWeapon]); } public void Shoot() { Fire(bullets[currentWeapon]); FireParticles(particles[currentWeapon]); }
ããã§ã®åé¡ã¯ããããã³ãŒãã«ããã®ã§ã¯ãªããã€ã³ã¹ãã¯ã¿ãŒã§ã®ãšã©ãŒã®ãªãã»ããã¢ããã®è€éãã«ãããŸãã
3ã€ã®å€æ°ãã¹ãŠãã«ãã»ã«åããã¯ã©ã¹ãããé©åã«å®çŸ©ããããããé åãäœæããŸãã
[Serializable] public class Weapon { public GameObject prefab; public ParticleSystem particles; public Bullet bullet; }
ãã®ãããªã³ãŒãã¯èŠæ ãããããªããŸãããããã«éèŠãªããšã¯ãã€ã³ã¹ãã¯ã¿ãŒã§ããŒã¿ãèšå®ãããšãã«ãšã©ãŒãèµ·ããããšãããå°é£ã«ãªãããšã§ãã
33.éã·ãŒã±ã³ã¹æ§é ã«ã¯é åã䜿çšããªãã§ãã ããã ããšãã°ããã¬ãŒã€ãŒã«ã¯3çš®é¡ã®æ»æããããŸãã ãããããçŸåšã®æŠåšã䜿çšããŸãããç°ãªã匟䞞ãšç°ãªãåäœãçæããŸãã
3ã€ã®ç®æ¡æžããé åã«è©°ã蟌ã¿ããã®ã¿ã€ãã®ããžãã¯ã䜿çšã§ããŸãã
public void FireAttack() { /// Fire(bullets[0]); } public void IceAttack() { /// Fire(bullets[1]); } public void WindAttack() { /// Fire(bullets[2]); }
åæåã¯ã³ãŒãã§ãããã«èŠãããããããŸãã...
public void WindAttack() { /// behaviour Fire(bullets[WeaponType.Wind]); }
...ããããæ€æ»å®ã§ã¯ãããŸããã
ååã䜿çšããŠãããã«æžã蟌ãã³ã³ãã³ããç解ã§ããããã«ãåå¥ã®å€æ°ã䜿çšããããšããå§ãããŸãã ã¯ã©ã¹ãäœæããŠããã¹ãŠãå¿«é©ã«ããŸãã
[Serializable] public class Bullets { public Bullet fireBullet; public Bullet iceBullet; public Bullet windBullet; }
ããã¯ãä»ã®ç«ãæ°·ããŸãã¯é¢šã®ããŒã¿ããªãããšãæå³ããŸãã
34.ããŒã¿ãçŽååå¯èœãªã¯ã©ã¹ã«ã°ã«ãŒãåããã€ã³ã¹ãã¯ã¿ãŒã§ãã¹ãŠããã䟿å©ã«èŠããããã«ããŸãã äžéšã®ã¢ã€ãã ã«ã¯ãå€æ°ã®èšå®ãå«ãŸããŠããå ŽåããããŸãã é©åãªå€æ°ãèŠã€ããã®ã¯æªå€¢ã§ãã ç掻ãç°¡çŽ åããã«ã¯ã次ã®æé ã«åŸã£ãŠãã ããã
- å€æ°ã®ã°ã«ãŒãã«åå¥ã®ã¯ã©ã¹ãå®çŸ©ããŸãã ããããå ¬éããŠã·ãªã¢ã©ã€ãºå¯èœã«ãã
- ã¡ã€ã³ã¯ã©ã¹ã§ãäžèšã§å®çŸ©ããåã¿ã€ãã®ãããªãã¯å€æ°ãå®çŸ©ããŸãã
- ãããã®å€æ°ãAwakeãŸãã¯Startã§åæåããªãã§ãã ããã ãããã¯ã·ãªã¢ã©ã€ãºå¯èœã§ãããããUnityããããèªäœãåŠçããŸãã
- å®çŸ©ã§ããã©ã«ãå€ãå²ãåœãŠãããšã«ãããããã©ã«ãå€ãæå®ã§ããŸãã
ããã«ãããã€ã³ã¹ãã¯ã¿ãŒã§ç®¡çããããå€æ°ã®ã°ã«ãŒããäœæãããŸãã
[Serializable] public class MovementProperties // MonoBehaviour! { public float movementSpeed; public float turnSpeed = 1; // } public class HealthProperties // MonoBehaviour! { public float maxHealth; public float regenerationRate; } public class Player : MonoBehaviour { public MovementProperties movementProeprties; public HealthPorperties healthProeprties; }
35.ãããªãã¯ãã£ãŒã«ãã«äœ¿çšãããŠããªãå Žåã§ããMonoBehavior以å€ã®ã¯ã©ã¹ãSerializableã«ããŸããããã«ããããããã°ã¢ãŒãã®ãšãã«ã€ã³ã¹ãã¯ã¿ãŒã§ã¯ã©ã¹ãã£ãŒã«ãã衚瀺ã§ããŸããããã¯ããã¹ããããã¯ã©ã¹ïŒãã©ã€ããŒããŸãã¯ãããªãã¯ïŒã§ãæ©èœããŸãã
36.ã³ãŒãã®ã€ã³ã¹ãã¯ã¿ãŒã§æ§æãããããŒã¿ãå€æŽããªãããã«ããŠãã ãããã€ã³ã¹ãã¯ã¿ãŒã§æ§æãããå€æ°ã¯æ§æå€æ°ã§ãããç¶æ å€æ°ãšããŠã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ã®å®è¡æã«å®æ°ãšããŠæ±ãããå¿ èŠããããŸãããã®èŠåã«åŸããšãã³ã³ããŒãã³ãã®ç¶æ ãå ã®ç¶æ ã«ãªã»ããããã¡ãœãããç°¡åã«èšè¿°ã§ããå€æ°ã®æ©èœãæ確ã«ç解ã§ããŸãã
public class Actor : MonoBehaviour { public float initialHealth = 100; private float currentHealth; public void Start() { ResetState(); } private void Respawn() { ResetState(); } private void ResetState() { currentHealth = initialHealth; } }
ãã¿ãŒã³
ãã¿ãŒã³ã¯ãæšæºçãªæ¹æ³ã䜿çšããŠäžè¬çãªåé¡ã解決ããæ¹æ³ã§ããRobert Nistrom ã®æ¬ãGame Programming PatternsãïŒãªã³ã©ã€ã³ã§ç¡æã§å ¥æå¯èœïŒã¯ãã²ãŒã éçºæã«çºçããåé¡ã®è§£æ±ºã«ãã¿ãŒã³ãã©ã®ããã«é©çšãããããç解ããããã®è²ŽéãªãªãœãŒã¹ã§ããUnityèªäœã«ã¯å€ãã®ãã®ãããªãã¿ãŒã³ããããŸããInstantiateã¯ãããã¿ã€ããã¿ãŒã³ã®äŸã§ããMonoBehaviourã¯ããã³ãã¬ãŒãã¡ãœããããã¿ãŒã³ã®ããŒãžã§ã³ã§ãããUIãšã¢ãã¡ãŒã·ã§ã³ã¯ããªãã¶ãŒããŒããã¿ãŒã³ã䜿çšããæ°ããã¢ãã¡ãŒã·ã§ã³ãšã³ãžã³ã¯ã¹ããŒããã·ã³ã䜿çšããŸãã
ãããã®ãã³ãã¯ãç¹ã«Unityã§ã®ãã¿ãŒã³ã®äœ¿çšã«é¢é£ããŠããŸãã
37.䟿å®äžãã·ã³ã°ã«ããŒã³ïŒãé·ãããã¿ãŒã³ïŒã䜿çšããŸãã 次ã®ã¯ã©ã¹ã¯ããããç¶æ¿ããã¯ã©ã¹ãèªåçã«ã·ã³ã°ã«ãã³ã«ããŸãã
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour { protected static T instance; // . public static T Instance { get { if(instance == null) { instance = (T) FindObjectOfType(typeof(T)); if (instance == null) { Debug.LogError(" " + typeof(T) + ", ."); } } return instance; } } }
äŸãã°ã管çè ã®ããã«æçšãªã·ã³ã°ã«ãã³ParticleManagerãAudioManageråã¯GUIManagerã
ïŒå€ãã®ããã°ã©ããŒã¯ãã¯ã©ã¹åãééã£ãŠããããäºãã«é¢ä¿ã®ãªãã¿ã¹ã¯ãå€ãããããšã瀺ããããXManagerãšæŒ ç¶ãšåŒã°ããã¯ã©ã¹ã«å察ããŠããŸããäžè¬çã«ãç§ã¯åœŒãã«åæããŠããŸãã ãã²ãŒã ã§åãã¿ã¹ã¯ãå®è¡ããããããããã®ã¯ã©ã¹ã¯å®éã«ã¯ã€ãã£ãªã ã§ãïŒ
- , (, Player). , . GameManager ( God ;-) ).
- static public, . GameManager.Player GameManager.Instance.player.
ä»ã®ãã³ãã§èª¬æããããã«ãã·ã³ã°ã«ããŒã³ã¯ãã·ãŒã³ã®ããŠã³ããŒããšã°ããŒãã«ããŒã¿ã®ä¿åã®éã«è»¢éãããããã©ã«ãã®ã¹ããŒã³ãã€ã³ããšãªããžã§ã¯ãã®äœæã«åœ¹ç«ã¡ãŸãã
38.ç¶æ ãã·ã³ã䜿çšããŠãç°ãªãç¶æ ã§ç°ãªãåäœãäœæããããç¶æ ãå€æŽãããšãã«ã³ãŒããå®è¡ãããããŸããã©ã€ãã¹ããŒããã·ã³ã«ã¯å€ãã®ç¶æ ããããåç¶æ ã«å¯ŸããŠãæŽæ°ã¢ã¯ã·ã§ã³ã ãã§ãªããç¶æ ã«å ¥ã£ããšããŸãã¯ç¶æ ã«ãªã£ããšãã«å®è¡ãããã¢ã¯ã·ã§ã³ãæå®ã§ããŸããããã«ãããã³ãŒããã¯ãªãŒã³ã«ãªãããšã©ãŒãçºçãã«ãããªããŸããã¹ããŒããã·ã³ã圹ç«ã€ããšã瀺ãè¯ãå åïŒUpdateã¡ãœããã®ã³ãŒãã«ã¯ããã®åäœãå€æŽããifãŸãã¯switchã³ã³ã¹ãã©ã¯ãããŸãã¯hasShownGameOverMessageãªã©ã®å€æ°ãå«ãŸããŸãã
public void Update() { if(health <= 0) { if(!hasShownGameOverMessage) { ShowGameOverMessage(); hasShownGameOverMessage = true; // false } } else { HandleInput(); } }
ç¶æ ãå¢ãããšããã®ã¿ã€ãã®ã³ãŒãã¯æ··ä¹±ããå¯èœæ§ããããç¶æ ãã·ã³ã¯ãããããæ確ã«ããŸãã
39. UnityEventã¿ã€ãã®ãã£ãŒã«ãã䜿çšããŠãã€ã³ã¹ãã¯ã¿ãŒã§ãªãã¶ãŒããŒãã¿ãŒã³ãäœæããŸãã UnityEventã¯ã©ã¹ã䜿çšãããšããã¿ã³ã®ã€ãã³ããšåãUIã䜿çšããŠãã€ã³ã¹ãã¯ã¿ãŒã§æ倧4ã€ã®ãã©ã¡ãŒã¿ãŒãåãåãã¡ãœããããã€ã³ãã§ããŸããããã¯ãå ¥åãæ±ããšãã«ç¹ã«åœ¹ç«ã¡ãŸãã
40.ãªãã¶ãŒããŒãã¿ãŒã³ã䜿çšããŠããã£ãŒã«ãå€ããã€å€åããããå€æããŸããå€æ°ãå€æŽããããšãã«ã®ã¿ã³ãŒããå®è¡ããããšããåé¡ã¯ãå€ãã®å Žåã²ãŒã ã§çºçããŸãããžã§ããªãã¯ã¯ã©ã¹ã䜿çšããŠããã®åé¡ã«å¯Ÿããæšæºãœãªã¥ãŒã·ã§ã³ãäœæããŸãããããã«ãããå€æ°ã®å€æŽã€ãã³ããç»é²ã§ããŸãã以äžã¯å¥åº·ã®äŸã§ããäœææ¹æ³ã¯æ¬¡ã®ãšããã§ãã
/* */ health = new ObservedValue(100); health.OnValueChanged += () => { if(health.Value <= 0) Die(); };
ããã§ãããšãã°æ¬¡ã®ããã«ããã¹ãŠã®å Žæã§å€ããã§ãã¯ããã«ã©ãã§ãå€æŽã§ããŸãã
if(hit) health.Value -= 10;
ãã«ã¹ã0ãäžåããšãDieã¡ãœãããåŒã³åºãããŸãã詳现ãªè°è«ãšå®è£ ã¯ãã®æçš¿ã§èŠãŸãã
41.ãã¬ããã«ã¢ã¯ã¿ãŒãã¿ãŒã³ã䜿çšããŸããïŒããã¯ãéæšæºããã¿ãŒã³ã§ããåºæ¬çãªèãæ¹ã¯ã Kieran Lord ã®ãã¬ãŒã³ããŒã·ã§ã³ããåãããŠããŸããïŒ
俳åªã¯ããã¬ããã®äž»èŠã³ã³ããŒãã³ãã§ããéåžžãããã¯ãã¬ããã®ãåå¥æ§ããæäŸããã³ã³ããŒãã³ãã§ãããããé«ãã¬ãã«ã®ã³ãŒããæãé »ç¹ã«çžäºäœçšããã³ã³ããŒãã³ãã§ããã¢ã¯ã¿ãŒã¯ãåããªããžã§ã¯ãïŒããã³å Žåã«ãã£ãŠã¯åãªããžã§ã¯ãïŒã«å¯ŸããŠãä»ã®ã³ã³ããŒãã³ãïŒãã«ããŒïŒã䜿çšããŠãžã§ããå®è¡ããŸãã
Unityã¡ãã¥ãŒãããã¿ã³ãªããžã§ã¯ããäœæãããšãSpriteããã³Buttonã³ã³ããŒãã³ãïŒããã³Textã³ã³ããŒãã³ããæã€åïŒãå«ãã²ãŒã ãªããžã§ã¯ããäœæãããŸãããã®å Žåãã¢ã¯ã¿ãŒã¯Buttonã«ãªããŸããã¡ã€ã³ã«ã¡ã©ã«ã¯éåžžãã«ã¡ã©ã³ã³ããŒãã³ãã«æ¥ç¶ãããããã€ãã®ã³ã³ããŒãã³ãïŒGUIã¬ã€ã€ãŒããã¬ã¢ã¬ã€ã€ãŒããªãŒãã£ãªãªã¹ããŒïŒããããŸããã«ã¡ã©ã¯ããã§ã¯ä¿³åªã§ãã
ã¢ã¯ã¿ãŒãé©åã«æ©èœããã«ã¯ãä»ã®ã³ã³ããŒãã³ããå¿ èŠã«ãªãå ŽåããããŸããã¢ã¯ã¿ãŒã³ã³ããŒãã³ãã®æ¬¡ã®å±æ§ã䜿çšããŠããã¬ããã®ä¿¡é Œæ§ãšæçšæ§ãé«ããããšãã§ããŸãã
- RequiredComponentã䜿çšããŠãåãã²ãŒã ãªããžã§ã¯ãã§ã¢ã¯ã¿ãŒãå¿ èŠãšãããã¹ãŠã®ã³ã³ããŒãã³ããæå®ããŸããïŒã¢ã¯ã¿ãŒã¯ãæ»ãå€ãnullã§ãããã©ããã確èªããããšãªããåžžã«GetComponentãå®å šã«åŒã³åºãããšãã§ããŸããïŒ
- DisallowMultipleComponent , . GetComponent, , , ).
- SelectionBase , - . .
[RequiredComponent(typeof(HelperComponent))] [DisallowMultipleComponent] [SelectionBase] public class Actor : MonoBehaviour { ...// }
42.ã©ã³ãã ã§ãã¿ãŒã³åãããããŒã¿ã¹ããªãŒã ãžã§ãã¬ãŒã¿ãŒã䜿çšããŸããïŒããã¯éæšæºã®ãã¿ãŒã³ã§ãããéåžžã«äŸ¿å©ã§ããïŒ
ãžã§ãã¬ãŒã¿ãŒã¯ä¹±æ°ãžã§ãã¬ãŒã¿ãŒã«äŒŒãŠããŸããããã¯ãç¹å®ã®ã¿ã€ãã®æ°ããèŠçŽ ãååŸããããã«åŒã³åºãããNextã¡ãœãããæã€ãªããžã§ã¯ãã§ããèšèšããã»ã¹äžã«ããžã§ãã¬ãŒã¿ãŒãå€æŽããŠãå¹ åºããã¿ãŒã³ãšããŸããŸãªçš®é¡ã®ã©ã³ãã æ§ãäœæã§ããŸãããããã¯ãèŠçŽ ãå¿ èŠãªã³ãŒãã®éšåãšã¯å¥ã«æ°ããèŠçŽ ãçæããããžãã¯ãä¿åã§ãããããã³ãŒãããããããã«ãªãããã䟿å©ã§ãã
以äžã«äŸã瀺ããŸãã
var generator = Generator .RamdomUniformInt(500) .Select(x => 2*x); // 0 998 var generator = Generator .RandomUniformInt(1000) .Where(n => n % 2 == 0); // var generator = Generator .Iterate(0, 0, (m, n) => m + n); // var generator = Generator .RandomUniformInt(2) .Select(n => 2*n - 1) .Aggregate((m, n) => m + n); // 1 -1 var generator = Generator .Iterate(0, Generator.RandomUniformInt(4), (m, n) => m + n - 1) .Where(n >= 0); // ,
æ¢ã«ãžã§ãã¬ãŒã¿ãŒã䜿çšããŠãé害ç©ã®çæãèæ¯è²ã®å€æŽãæç¶ãåé³æ¥œãåèªã²ãŒã ã®ããã«æååãçæããŠåèªãäœæããŠããŸãã次ã®èšèšã䜿çšãããšããžã§ãã¬ãŒã¿ãŒã䜿çšããŠãããŸããŸãªééã§ç¹°ãè¿ãããã³ã«ãŒãã³ãæ£åžžã«å¶åŸ¡ã§ããŸãã
while (true) { //- yield return new WaitForSeconds(timeIntervalGenerator.Next()); }
ãžã§ãã¬ãŒã¿ãŒã®è©³çŽ°ã«ã€ããŠã¯ããã®æçš¿ããèªã¿ãã ããã
ãã¬ãããšã¹ã¯ãªããå¯èœãªãªããžã§ã¯ã
43.ãã¹ãŠã«ãã¬ããã䜿çšããŸããã·ãŒã³å ã§ãã¬ããïŒãŸãã¯ãã¬ããã®äžéšïŒã§ã¯ãªãã²ãŒã ãªããžã§ã¯ãã®ã¿ããã©ã«ããŒã§ããå¿ èŠããããŸããäžåºŠã ã䜿çšãããäžæã®ãªããžã§ã¯ãã§ãã£ãŠãããã¬ããã§ããå¿ èŠããããŸããããã«ãããã·ãŒã³ã®å€æŽãå¿ èŠãšããªãå€æŽãç°¡åã«è¡ãããšãã§ããŸãã
44.ãã¬ããããã¬ããã«ãã€ã³ãããŸããã€ã³ã¹ã¿ã³ã¹ãã€ã³ã¹ã¿ã³ã¹ã«ãã€ã³ãããªãã§ãã ããããã¬ãããã·ãŒã³ã«ãã©ãã°ãããšããã¬ãããšã®é¢ä¿ãä¿åãããŸãããã€ã³ã¹ã¿ã³ã¹ãžã®ãªã³ã¯ã¯ä¿åãããŸãããå¯èœãªå Žåã¯ãã¬ããã«ã¹ããããããšãã·ãŒã³ãã»ããã¢ããããã³ã¹ããåæžãããã·ãŒã³ãå€æŽããå¿ èŠæ§ãæžå°ããŸãã
å¯èœãªéããã€ã³ã¹ã¿ã³ã¹éã®æ¥ç¶ãèªåçã«ç¢ºç«ããŸããã€ã³ã¹ã¿ã³ã¹ããªã³ã¯ããå¿ èŠãããå Žåã¯ãããã°ã©ã ã§ãªã³ã¯ã確ç«ããŸããããšãã°ããã¬ãããã¬ãŒã€ãŒã¯ãèµ·åæã«GameManagerã«èªåèªèº«ãç»é²ã§ããŸãããŸããGameManagerã¯ãèµ·åæã«ãã¬ãããã¬ãŒã€ãŒãèŠã€ããããšãã§ããŸãã
45.ä»ã®ã¹ã¯ãªãããè¿œå ããå Žåã¯ããã¬ããã®ã«ãŒãã§ã°ãªãããäœæããªãã§ãã ãããã°ãªãããããã¬ãããäœæããå Žåãæåã«ã°ãªããã空ã®ã²ãŒã ãªããžã§ã¯ãã«èŠªã«ãããããã«ãŒãã«ããŸããã¹ã¯ãªãããã°ãªããã§ã¯ãªãã«ãŒãã«ãã€ã³ãããŸãããããã£ãŠãã€ã³ã¹ãã¯ã¿ãŒã§æ§æãããå€ã倱ãããšãªããã°ãªãããå¥ã®ã°ãªããã«ç°¡åã«çœ®ãæããããšãã§ããŸãã
46.転éãããæ§æããŒã¿ã«ã¯ããã¬ããã§ã¯ãªãã¹ã¯ãªããå¯èœãªãªããžã§ã¯ãã䜿çšããŸãã
ãã®å ŽåïŒ
- ã·ãŒã³ã¯å°ãããªããŸã
- 1ã€ã®ã·ãŒã³ïŒãã¬ããã€ã³ã¹ã¿ã³ã¹ïŒã誀ã£ãŠå€æŽããããšã¯ã§ããŸããã
47.ãããã®ã¬ãã«ã«ã¯ã¹ã¯ãªããå¯èœãªãªããžã§ã¯ãã䜿çšããŸããã¬ãã«ããŒã¿ã¯å€ãã®å ŽåXMLãŸãã¯JSONã§ä¿åãããŸããã代ããã«ã¹ã¯ãªãããªããžã§ã¯ãã䜿çšããããšã«ã¯ããã€ãã®å©ç¹ããããŸãã
- ãããã¯ãšãã£ã¿ãŒã§ç·šéã§ããŸããããŒã¿ã®æ€èšŒã容æã«ãªãããã®æ¹æ³ã¯æè¡è 以å€ã®èšèšè ã«ãšã£ãŠãã䟿å©ã§ããããã«ãã«ã¹ã¿ã ãšãã£ã¿ãŒã䜿çšããŠãç·šéãããã«ç°¡åã«ããããšãã§ããŸãã
- ããŒã¿ã®èªã¿åã/æžã蟌ã¿ããã³è§£æã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã
- åé¢ãšåã蟌ã¿ãããã³çµæã®ã¢ã»ããã®ç®¡çãããç°¡åã«ãªããŸãããã®ããã倧èŠæš¡ãªæ§æããã§ã¯ãªãããã«ãã£ã³ã°ãããã¯ããã¬ãã«ãäœæã§ããŸãã
48.ã¹ã¯ãªããå¯èœãªããžã§ã¯ãã䜿çšããŠãã€ã³ã¹ãã¯ã¿ãŒã§åäœãæ§æããŸããã¹ã¯ãªãããªããžã§ã¯ãã¯éåžžãæ§æããŒã¿ã«é¢é£ä»ããããŠããŸãããããŒã¿ãšããŠãã¡ãœãããã䜿çšããããšãã§ããŸãã
æµã®ã¿ã€ãããããåæµãäœããã®çš®é¡ã®SuperPowersè¶ å€§åœã»ãããæã£ãŠããã·ããªãªãèããŸããããããéåžžã®ã¯ã©ã¹ã«ããŠãEnemyã¯ã©ã¹ã§ãªã¹ããååŸã§ããŸãããã«ã¹ã¿ã ãšãã£ã¿ãŒããªããšãã€ã³ã¹ãã¯ã¿ãŒã§ç°ãªãè¶ å€§åœïŒããããç¬èªã®ããããã£ãæã€ïŒã®ãªã¹ããæ§æã§ããŸããããããããããã®è¶ 倧åœè³ç£ãäœæããïŒScriptableObjectãšããŠå®è£ ããïŒå ŽåãæåããŸãïŒ
ä»çµã¿ã¯æ¬¡ã®ãšããã§ãã
public class Enemy : MonoBehaviour { public SuperPower superPowers; public UseRandomPower() { superPowers.RandomItem().UsePower(this); } } public class BasePower : ScriptableObject { virtual void UsePower(Enemy self) { } } [CreateAssetMenu("BlowFire", "Blow Fire") public class BlowFire : SuperPower { public strength; override public void UsePower(Enemy self) { /// blow fire } }
ãã®ãã¿ãŒã³ã䜿çšããå Žåã次ã®å¶éãå¿ããªãã§ãã ããã
- . NotImplementedExceptions , . Abstract , .
- Generic . generic , generic.
49.ã¹ã¯ãªããå¯èœãªãªããžã§ã¯ãã䜿çšããŠããã¬ãããç¹æ®åããŸãã2ã€ã®ãªããžã§ã¯ãã®æ§æãäžéšã®ããããã£ã§ã®ã¿ç°ãªãå Žåãéåžž2ã€ã®ã€ã³ã¹ã¿ã³ã¹ãã·ãŒã³ã«æ¿å ¥ããããããã®ããããã£ã¯ã€ã³ã¹ã¿ã³ã¹ã«èšå®ãããŸããéåžžãããããã£ã®å¥åã®ã¯ã©ã¹ãäœæããããšããå§ãããŸããããã¯ã2ã€ã®ã¿ã€ãéã§ç°ãªãå Žåããããã¹ã¯ãªãããªããžã§ã¯ãã®å¥åã®ã¯ã©ã¹ã§ãã
ããã«ãããæè»æ§ãåäžããŸãã
- ç¹æ®åã¯ã©ã¹ããç¶æ¿ããŠãããŸããŸãªã¿ã€ãã®ãªããžã§ã¯ãã®ç¹å®ã®ããããã£ãäœæã§ããŸãã
- ã·ãŒã³ã®èšå®ãããå®å šã«ãªããŸãïŒãã¹ãŠã®ããããã£ãèšå®ããŠç®çã®ã¿ã€ãã®ãªããžã§ã¯ããäœæããã®ã§ã¯ãªããç®çã®ã¹ã¯ãªããå¯èœãªãªããžã§ã¯ããéžæããã ãã§ãïŒã
- ã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžãã³ãŒããä»ããŠãããã®ãªããžã§ã¯ãã管çããæ¹ãç°¡åã§ãã
- 2ã€ã®ã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ãè€æ°ããå Žåãå€æŽãè¡ããšãã«ãããã®ããããã£ãäžå®ã§ããããšã確èªã§ããŸãã
- æ§æå€æ°ã®ã»ããããçµã¿åãããŠäžèŽãããããšãã§ããã»ããã«åå²ã§ããŸãã
ãã®ãããªã»ããã¢ããã®ç°¡åãªäŸã次ã«ç€ºããŸãã
[CreateAssetMenu("HealthProperties.asset", "Health Properties")] public class HealthProperties : ScriptableObject { public float maxHealth; public float resotrationRate; } public class Actor : MonoBehaviour { public HealthProperties healthProperties; }
å€æ°ã®ã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ã䜿çšãããšãã¹ãã·ã£ã©ã€ãŒãŒã·ã§ã³ãéåžžã®ã¯ã©ã¹ãšããŠå®çŸ©ãããã®ãªã¹ããããããé©çšã§ããé©åãªå ŽæïŒããšãã°ãGameManagerïŒã«é¢é£ä»ããããã¹ã¯ãªããå¯èœãªãªããžã§ã¯ãã§äœ¿çšã§ããŸããå®å šæ§ãé床ãå©äŸ¿æ§ã確ä¿ããã«ã¯ãããå°ããæ¥çå€ããå¿ èŠã§ãã以äžã¯ãå¯èœãªæå°ã®äœ¿çšäŸã§ãã
public enum ActorType { Vampire, Wherewolf } [Serializable] public class HealthProperties { public ActorType type; public float maxHealth; public float resotrationRate; } [CreateAssetMenu("ActorSpecialization.asset", "Actor Specialization")] public class ActorSpecialization : ScriptableObject { public List healthProperties; public this[ActorType] { get { return healthProperties.First(p => p.type == type); } // ! } } public class GameManager : Singleton { public ActorSpecialization actorSpecialization; ... } public class Actor : MonoBehaviour { public ActorType type; public float health; // public Regenerate() { health += GameManager.Instance.actorSpecialization[type].resotrationRate; } }
50. CreateAssetMenuå±æ§ã䜿çšããŠãScriptableObjectäœæãAsset / Createã¡ãã¥ãŒã«èªåçã«è¿œå ããŸãã
ãããã°
51. Unity.
- context Debug.Log , , .
- Debug.Break (, , ).
- Debug.DrawRay Debug.DrawLine (, DrawRay «» ray cast).
- Gizmos . gizmo renderer mono behaviours DrawGizmo .
- ( private Unity).
52. IDEã®ãããã¬ãŒãå¹ççã«äœ¿çšããæ¹æ³ãåŠã³ãŸããããšãã°ãVisual Studioã§ã®Unityã²ãŒã ã®ãããã°ãåç §ããŠãã ããã
53.çµæçãªå€ã®å€åã®ã°ã©ããæãããžã¥ã¢ã«ãããã¬ãŒã䜿çšããŸããç©çåŠãã¢ãã¡ãŒã·ã§ã³ãããã³ãã®ä»ã®åçããã»ã¹ã®ãããã°ãç¹ã«äžèŠåã«çºçãããšã©ãŒã«éåžžã«äŸ¿å©ã§ãããã®ãšã©ãŒããã£ãŒãã§ç¢ºèªãããšã©ãŒæã«å€åããä»ã®å€æ°ã远跡ã§ããŸãããŸããç®èŠæ€æ»ã«ãããå€ãé »ç¹ã«å€æŽãããããæ確ãªçç±ãªãéžè±ããããããªã©ãç¹å®ã®çš®é¡ã®å¥åŠãªåäœãæããã«ãªããŸããMonitor Componentsã䜿çšããŸãããä»ã«ãèŠèŠçãªãããã°ããŒã«ããããŸãã
54.ã³ã³ãœãŒã«ã§äŸ¿å©ãªé²é³ã䜿çšããŸããã«ããŽãªããšã«è²åããããåºåãå¯èœã«ãããããã®ã«ããŽãªã«åŸã£ãŠåºåããã£ã«ã¿ãªã³ã°ã§ãããšãã£ã¿æ¡åŒµã䜿çšããŸããEditor Console Proã䜿çšããŸãããä»ã®æ¡åŒµæ©èœããããŸãã
55.ç¹ã«ãã¢ã«ãŽãªãºã ãšæ°åŠã³ãŒãã®ãã¹ãã«ã¯ãUnityãã¹ãããŒã«ã䜿çšããŸããããšãã°ãUnityãã¹ãããŒã«ã®ãã¥ãŒããªã¢ã«ããUnityãã¹ãããŒã«ã䜿çšããå éã§ã®åäœãã¹ãã®æçš¿ãåç §ããŠãã ããã
56. Unityãã¹ãããŒã«ã䜿çšããŠã倧ãŸããªãã¹ããå®è¡ããŸãã Unityãã¹ãããŒã«ã¯ãæ£åŒãªãã¹ãã«é©ããŠããã ãã§ã¯ãããŸããããŸããã·ãŒã³ãéå§ããã«ãšãã£ã¿ãŒã§å®è¡ããã䟿å©ãªã倧ãŸããªããã¹ãã«ã䜿çšã§ããŸãã
57.ããŒããŒãã·ã§ãŒãã«ããã䜿çšããŠã¹ã¯ãªãŒã³ã·ã§ãããæ®ããŸããå€ãã®ãã°ã¯èŠèŠç衚瀺ã«é¢é£ããŠãããã¹ã¯ãªãŒã³ã·ã§ãããæ®ãããšãã§ããã°ãããããå ±åããã®ãã¯ããã«ç°¡åã§ããã¹ã¯ãªãŒã³ã·ã§ãããäžæžããããªãããã«ãçæ³çãªã·ã¹ãã ã«ã¯PlayerPrefsã«ãŠã³ã¿ãŒãå¿ èŠã§ããã¹ã¯ãªãŒã³ã·ã§ããã¯ãåŸæ¥å¡ã誀ã£ãŠãªããžããªã«ã³ãããããªãããã«ããããžã§ã¯ããã©ã«ãã«ä¿åããå¿ èŠã¯ãããŸããã
58.ããŒããŒãã·ã§ãŒãã«ããã䜿çšããŠãéèŠãªå€æ°ã®ã¹ãããã·ã§ãããå°å·ããŸããã²ãŒã äžã«èª¿æ»å¯èœãªäºæããªãã€ãã³ããçºçããå Žåã«ãæ å ±ãç»é²ã§ããŸãããã¡ãããå€æ°ã®ã»ããã¯ã²ãŒã ã«ãã£ãŠç°ãªããŸãããã³ãã¯ãã²ãŒã ã§çºçããå žåçãªãšã©ãŒã§ããããšãã°ããã¬ãŒã€ãŒãšæµã®äœçœ®ããŸãã¯AI俳åªã®ãæèã®ç¶æ ãïŒããšãã°ã圌ãåŸãããšããŠããæ¹æ³ïŒã
59. , . äŸïŒ
- .
- .
- GUI.
- .
- .
誀ã£ãŠãããã°ãªãã·ã§ã³ããªããžããªã«ã³ãããããªãããã«æ³šæããŠãã ããããããã®ãªãã·ã§ã³ãå€æŽãããšãããŒã å ã®ä»ã®éçºè ãæ··ä¹±ãããå¯èœæ§ããããŸãã
60.ãããã°ãããããŒã®å®æ°ãå®çŸ©ãã1ã€ã®å Žæã«ä¿åããŸãããããã°ããŒã¯ãã²ãŒã å ¥åãšã¯ç°ãªããéåžž1ãæã§åŠçãããŸããããããããŒã®ç«¶åãåé¿ããã«ã¯ãæåã«å®æ°ãå®çŸ©ããŸããå¥ã®æ¹æ³ã¯ããããã°æ©èœããããã©ããã«é¢ä¿ãªãããã¹ãŠã®ããŒã1ãæã§åŠçããããšã§ãã ïŒãã®ã¢ãããŒãã®æ¬ ç¹ã¯ããã®ã¯ã©ã¹ããã®ããã ãã«ãªããžã§ã¯ããžã®è¿œå ã®åç §ãå¿ èŠãšããå¯èœæ§ãããããšã§ãïŒã
61.æç¶ãåã¡ãã·ã¥çæã®å Žåãé ç¹ã«å°ããªçãæç»ãŸãã¯ã¹ããŒã³ããŸãã ããã«ãããäžè§åœ¢ãšUVã䜿çšããŠã°ãªããã衚瀺ããåã«ãé ç¹ãé©åãªå Žæã«ãããé©åãªãµã€ãºã§ããããšã確èªã§ããŸãã
æ§èœ
62.ããã©ãŒãã³ã¹ã«é¢ããäžè¬çãªèšèšããã³æ§é ã®ã¬ã€ãã©ã€ã³ã«æ³šæããŠãã ããã
- å€ãã®å Žåããã®ãããªãã³ãã¯ç¥è©±ã«åºã¥ããŠããããã¹ãã§ãã¹ããããŠããŸããã
- ãã¹ãã«ãã£ãŠæšå¥šäºé ãæ€èšŒãããããšããããŸããããã¹ãã®å質ã¯äœããªããŸãã
- ãã³ãã¯å質ãã¹ãã«ãã£ãŠãã¹ããããŸãããéçŸå®çã§ããããç°ãªãã³ã³ããã¹ãã§é©çšã§ããŸããïŒããšãã°ãé åã®äœ¿çšãäžè¬çãªãªã¹ããããé«éã§ããããšãç°¡åã«èšŒæã§ããŸãããã ããå®éã®ã²ãŒã ã®ã³ã³ããã¹ãã§ã¯ããã®éãã¯ã»ãšãã©åžžã«éèŠã§ã¯ãããŸãããããªãã®å Žåã¯åœ¹ã«ç«ããªããïŒ
- æã ãã¢ããã€ã¹ã¯æ£ãããããã§ã«æ代é ãã§ãã
- æšå¥šäºé ã圹ç«ã€å ŽåããããŸãããããã劥åãå¿ èŠãªå ŽåããããŸããæã«ã¯é ãããæééãã«å®äºããã²ãŒã ã¯ãéããé ãããããåªããŠããŸããé«åºŠã«æé©åãããã²ãŒã ã«ã¯ãcãªé 延ãªãªãŒã¹ã³ãŒããå«ãŸããå¯èœæ§ãé«ããªããŸãã
- äžèšã®ããã»ã¹ãããéãçã®åé¡ã®åå ãèŠã€ããã«ã¯ãããã©ãŒãã³ã¹ã®ãã³ããæ€èšããããšã圹ç«ã¡ãŸãã
63.ã§ããã ãæ©ããã¿ãŒã²ããããã€ã¹ã§å®æçã«ã²ãŒã ã®ãã¹ããéå§ããŸããããã€ã¹ã«ã¯ããŸããŸãªããã©ãŒãã³ã¹ç¹æ§ããããŸãã圌ãã«ããªãã«é©ããäžããããªãã§ãã ãããåé¡ã«ã€ããŠæ©ãåŠã¶ã»ã©ãåé¡ãããå¹æçã«è§£æ±ºã§ããŸãã
64.ãããã¡ã€ã©ãŒãå¹æçã«äœ¿çšããŠãããã©ãŒãã³ã¹ã®åé¡ã®åå ã远跡ããæ¹æ³ãåŠã³ãŸãã
- , .
- ( Profiler.BeginFrame Profiler.EndFrame ) .
- , , iOS .
- .
65.å¿ èŠã«å¿ããŠãããæ£ç¢ºãªãããã¡ã€ãªã³ã°ã®ããã«ãµãŒãããŒãã£ã®ãããã¡ã€ã©ãŒã䜿çšããŸãã Unityãããã¡ã€ã©ãŒã¯ãäœãèµ·ãã£ãŠããã®ãæ確ã«ææ¡ã§ããªãããšããããŸãããããã¡ã€ã«ãã¬ãŒã ãäžè¶³ãããããã£ãŒããããã¡ã€ãªã³ã°ãã²ãŒã ã®é床ãäœäžããããã¹ãçµæãæå³ããªããªãããšããããŸãããã®å Žåãç¬èªã®ãããã¡ã€ã©ãŒã䜿çšããŸãããå¥ã®ãããã¡ã€ã©ãŒãAsset Storeã§èŠã€ããããšãã§ããŸãã
66.ããã©ãŒãã³ã¹æ¹åã®å¹æã枬å®ããŸããããã©ãŒãã³ã¹ãæ¹åããããã«å€æŽãè¡ãå Žåã¯ãããã枬å®ããŠãå€æŽã«ãã£ãŠå®éã«ããã©ãŒãã³ã¹ãæ¹åãããããšã確èªããŸããå€æŽã枬å®ãããŠããªããéèŠã§ãªãå Žåã¯ãç Žæ£ããŸãã
67.ããã©ãŒãã³ã¹ãåäžãããããã«ãèªã¿ã«ããã³ãŒããèšè¿°ããªãã§ãã ãããäŸå€ïŒ
- ãããã¡ã€ã©ãŒã«ãã£ãŠã³ãŒãã«åé¡ãèŠã€ãããå€æŽåŸã®æ¹åã枬å®ããŸãããæ¹åã¯éåžžã«åªããŠããããããµããŒãã®äœ¿ãããããæžãã䟡å€ããããŸãã
ãŸãã¯
- ããªãã¯äœãããŠããããæ£ç¢ºã«ç¥ã£ãŠããŸãã
åœåæšæºãšãã©ã«ããŒæ§é
68.ææžåãããåœåèŠåãšãã©ã«ããŒæ§é ã«åŸããŸããæšæºåãããåœåãšãã©ã«ãæ§é ã®ãããã§ããªããžã§ã¯ããæ€çŽ¢ããŠç解ãããããªããŸãã
ã»ãšãã©ã®å Žåãç¬èªã®åœåèŠåãšãã©ã«ããŒæ§é ãäœæããå¿ èŠããããŸãã以äžã«äŸã瀺ããŸãã
åœåã®äžè¬åå
- ã¹ããŒããã¹ããŒããšåŒã³ãŸãã é³¥ã¯é³¥ãšåŒã°ããã¹ãã§ãã
- çºé³ããŠèŠããããååãéžæããŠãã ãããMayaã²ãŒã ãäœæããŠããå Žåãã¬ãã«ã«QuetzalcoatisReturnïŒReturn of QuetzalcoatlïŒãšããååãä»ããªãã§ãã ããã
- . , . - buttonHolder buttonContainer .
- Pascal case, : ComplicatedVerySpecificObject. , , (. « »).
- (WIP, final).
- : DVamp@W DarkVampire@Walk.
- -: Die, DarkVampire@Die, DarkVampire@Death.
- : DarkVampire, VampireDark; PauseButton, ButtonPaused. , , Button. [ , . , , . , .]
- . , , PathNode0, PathNode1. 0, 1.
- , . , Bird0, Bird1, Bird2 Flamingo, Eagle, Swallow.
ã¡ã€ã³åãšèŠçŽ ã®ãã¢ã¹ãã¯ããã説æããéšåã®éã«ã¯ã¢ã³ããŒã¹ã³ã¢ã䜿çšããŸãã äŸïŒ
- GUIãã¿ã³ã®ç¶æ EnterButton_ActiveãEnterButton_Inactive
- ãã¯ã¹ã㣠DarkVampire_DiffuseãDarkVampire_Normalmap
- ã¹ã«ã€ããã¯ã¹ JungleSky_TopãJungleSky_North
- LODã°ã«ãŒãDarkVampire_LOD0ãDarkVampire_LOD1
ãã®èŠåã䜿çšããŠãç°ãªãã¿ã€ãã®èŠçŽ ãåºå¥ããªãã§ãã ãããããšãã°ãRock_SmallãRock_Largeã¯SmallRockãLargeRockãšåŒã°ããã¹ãã§ãã
æ§é
ã·ãŒã³å³ããããžã§ã¯ããã©ã«ããŒãããã³ã¹ã¯ãªãããã©ã«ããŒã«ã¯ãåæ§ã®ãã³ãã¬ãŒããå¿ èŠã§ãã以äžã«äœ¿çšã§ããäŸã瀺ããŸãã
ãã©ã«ããŒæ§é
MyGame
Helper
Design
Scratchpad
Materials
Meshes
Actors
DarkVampire
LightVampire
...
Structures
Buildings
...
Props
Plants
...
...
Resources
Actors
Items
...
Prefabs
Actors
Items
...
Scenes
Menus
Levels
Scripts
ãã¹ã
Textures
UI
å¹æ
...
UI
MyLibray
...
Plugins
SomeOtherAsset1
SomeOtherAsset2
...
Main
Debug
Managers
Cameras
Lights
UI
Canvas
HUD
PauseMenu
...
World
Ground
Props
Structures
...
Gameplay
Actors
Items
...
Dynamic Objects
Debug
Gameplay
Actors
Items
...
Framework
Graphics
UI
...