èšäºã®æåã®éšåã§ã¯ãã¢ãã«ãç°¡åã«äœ¿çšã§ããããã«é 眮ããæ¹æ³ãæ€èšããŸããããã¢ãã«ã®ãããã°ãšã€ã³ã¿ãŒãã§ãŒã¹ã®ãã蟌ã¿ã¯ç°¡åã§ãã ãã®ããŒãã§ã¯ãã¢ãã«ã®çŸãããšå€æ§æ§ã®ãã¹ãŠã«ã€ããŠãã¢ãã«ã®å€æŽã«å¯Ÿããã³ãã³ãã®ãªã¿ãŒã³ãæ€èšããŸãã åãšåãããã«ãç§ãã¡ã«ãšã£ãŠã®åªå äºé ã¯ããããã°ã®å©äŸ¿æ§ã§ãããããã°ã©ããŒãæ°ããæ©èœãäœæããããã«å¿ èŠãªãžã§ã¹ãã£ãæå°éã«æãã人ã®ã³ãŒããèªã¿ãããããããšã§ãã
ã¢ãã€ã«ã²ãŒã ã®ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã ããŒã1ïŒã¢ãã«
ã¢ãã€ã«ã²ãŒã ã®ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã ããŒã3ïŒãžã§ããæšåã®è¡šç€º
ãªãã³ãã³ã
ã³ãã³ããã¿ãŒã³ã¯å€§å£°ã§èãããŸãããå®éã«ã¯ãèŠæ±ãããæäœã«å¿ èŠãªãã¹ãŠãè¿œå ãããããã«æ ŒçŽããããªããžã§ã¯ãã«ãããŸããã å°ãªããšãããŒã ããããã¯ãŒã¯çµç±ã§éä¿¡ãããããããã®ã¢ãããŒããéžæããŸããããã«ãå ¬åŒã«äœ¿çšããããã«ã²ãŒã ã®ç¶æ ã®ã³ããŒãããã€ãååŸããŸãã ãã®ããããŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ãããšãã³ãã³ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããåä¿¡è ã«éä¿¡ãããŸãã ç¥èªMVCã®æåCã®æå³ã¯å€å°ç°ãªããŸãã
ãããã¯ãŒã¯äžã§ã®çµæã®äºæž¬ãšã³ãã³ãã®æ€èšŒ
ãã®å Žåãç¹å®ã®ã³ãŒãã¯ã¢ã€ãã¢ã»ã©éèŠã§ã¯ãããŸããã ãããŠãããã«ã¢ã€ãã¢ããããŸãïŒ
èªå°å¿ã®ããã²ãŒã ã¯ããã¿ã³ã«åå¿ããåã«ãµãŒããŒããã®å¿çãåŸ ã€ããšãã§ããŸããã ãã¡ãããã€ã³ã¿ãŒãããã¯ããè¯ããªã£ãŠãããäžçäžã«ããããã®ãµãŒããŒã眮ãããšãã§ããŸãããµãŒããŒããã®å¿çãåŸ ã£ãŠããããã€ãã®æåããã²ãŒã ããç¥ã£ãŠããŸãããã®ãã¡ã®1ã€ã¯Summoning Warsã§ãããããŸãããããã§ãããªãã¯ãããããå¿ èŠã¯ãããŸããã ã¢ãã€ã«ã€ã³ã¿ãŒãããã®å Žåã5ã15ç§ã®ã©ã°ãäŸå€ãããæšæºã§ããå¯èœæ§ãé«ããããã¢ã¹ã¯ã¯ã§ã¯å°ãªããšããã¬ã€ã€ãŒã泚æãæããªãããã«ã²ãŒã ã¯æ¬åœã«çŽ æŽãããã¯ãã§ãã
ãããã£ãŠãã€ã³ã¿ãŒãã§ã€ã¹ã«å¿ èŠãªãã¹ãŠã®æ å ±ãè¡šãã²ãŒã ç¶æ ããããã³ãã³ãã¯ããã«é©çšããããã®åŸãµãŒããŒã«éä¿¡ãããŸãã éåžžãå€åãªJavaããã°ã©ããŒã¯ãµãŒããŒã«åº§ã£ãŠããã¹ãŠã®æ°ããæ©èœãå¥ã®èšèªã§1ã€ãã€è€è£œããŸãã ç§ãã¡ã®ã鹿ããããžã§ã¯ãã§ã¯ã圌ãã®æ°ã¯3人ã«éããŸããã 代ããã«ãå¥ã®æ¹æ³ã§ãããè¡ãããšãã§ããŸãã .NetãµãŒããŒã§å®è¡ããã¯ã©ã€ã¢ã³ãåŽãšåãã³ãã³ãã³ãŒãããµãŒããŒåŽã§å®è¡ããŸãã
ååã®èšäºã§èª¬æããã¢ãã«ã¯ãã»ã«ããã¹ãã®æ°ããèå³æ·±ãæ©äŒãæäŸããŸãã ã¯ã©ã€ã¢ã³ãã§ã³ãã³ããå®è¡ããåŸãGameStateããªãŒã§çºçããå€æŽã®ããã·ã¥ãèšç®ããããŒã ã«é©çšããŸãã ãµãŒããŒãåãã³ãã³ãã³ãŒããå®è¡ããå€æŽã®ããã·ã¥ãäžèŽããªãã£ãå ŽåãäœãããããããªããŸããã
æåã®å©ç¹ïŒ
- ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãéçºãå€§å¹ ã«ã¹ããŒãã¢ãããããµãŒããŒããã°ã©ãã®æ°ãæå°éã«æããŸãã
- ããã°ã©ããŒãé決å®çãªåäœã«ã€ãªãããã¹ãç¯ããå Žåãããšãã°ãèŸæžããæåã®å€ãååŸããããDateTime.nowã䜿çšããã³ãã³ããã£ãŒã«ãã«æ瀺çã«æžã蟌ãŸããªãã£ãããã€ãã®å€ã䜿çšãããšããµãŒããŒã®ããã·ã¥ãäžèŽããªããªããããã«ã€ããŠèª¿ã¹ãŸãã
- ã¯ã©ã€ã¢ã³ãéçºã¯ãåœåã®éããµãŒããŒãªãã§å®è¡ã§ããŸãã ãµãŒããŒããªããŠãããã¬ã³ããªãŒãªã¢ã«ãã¡çã䜿çšã§ããŸãã ããã¯ãå€ã«å€¢ã®ã²ãŒã ãéããŠããŸãã€ã³ãã£ãŒéçºè ã ãã§ãªã䟿å©ã§ãã ç§ããã¯ãœããã¯ã«ãããšãããµãŒããŒããã°ã©ããŒããã¹ãŠã®ããªããŒã倱ãããµãŒããŒã®ä»£ããã«æã ã²ãŒã ã®ç¶æ å šäœãæãã«å®ããããŒã䜿çšããŠãã²ãŒã ãã¢ãã¬ãŒãããããšãäœåãªããããå ŽåããããŸããã
äœããã®çç±ã§äœç³»çã«éå°è©äŸ¡ãããŠããæ¬ ç¹ïŒ
- ã¯ã©ã€ã¢ã³ãããã°ã©ããŒãäœãééã£ãããšããããã¹ãäžã«ãããç®ã«èŠããªãå ŽåïŒããšãã°ãäžæè°ãªç®±ã«å ¥ã£ãŠããååã®ç¢ºçïŒãåãããšãããäžåºŠæžããŠãšã©ãŒãèŠã€ãã人ã¯ããŸããã èªå移æ€å¯èœãªã³ãŒãã«ã¯ããã¹ãã«å¯ŸããŠãã責任ããæ 床ãå¿ èŠã§ãã
詳现ãªãããã°æ å ±
åªå äºé ã®1ã€ã¯ããããã°ã®å©äŸ¿æ§ã§ãã ããŒã ã®å®è¡äžã«å®è¡ããã£ããããå Žå-ãã¹ãŠãæ確ãªå Žåãã²ãŒã ã®ç¶æ ãããŒã«ããã¯ãããã°ã«å®å šãªç¶æ ãéä¿¡ãããããããããããã³ãã³ããã·ãªã¢ã«åããŸãããã¹ãŠã䟿å©ã§çŸããã§ãã ãµãŒããŒãšã®åæãåããŠããªãå Žåãç¶æ³ã¯ããè€éã«ãªããŸãã ãã以æ¥ãã¯ã©ã€ã¢ã³ãã¯ãã§ã«ä»ã®ããã€ãã®ã³ãã³ããå®äºããŠãããçœå®³ã«ã€ãªãã£ãã³ãã³ããå®è¡ããåã«ã¢ãã«ã®ç¶æ ã確èªããã ãã§ãªããæ¬åœã«ãããããšãããã£ãããã§ãã åããŒã ã®åã§ã²ãŒã ã¹ããŒããè€è£œããã®ã¯è€éãããŠè²»çšãããããŸãã ãã®åé¡ã解決ããããã«ããšã³ãžã³ã®ãã³ãããã®äžã«çž«ãä»ããããã¹ããŒã ãè€éã«ããŸãã
ã¯ã©ã€ã¢ã³ãã«ã¯ã1ã€ã®ã²ãŒã ã¹ããŒãã§ã¯ãªãã2ã€ã®ã²ãŒã ã¹ããŒãããããŸãã æåã¯ã¬ã³ããªã³ã°ã®ã¡ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ãšããŠæ©èœããã³ãã³ãã¯ããã«é©çšãããŸãã ãã®åŸãé©çšãããã³ãã³ãã¯ãµãŒããŒã«éä¿¡ããããã«ãã¥ãŒã«å ¥ããããŸãã ãµãŒããŒã¯ãµã€ãã§åãã¢ã¯ã·ã§ã³ãå®è¡ãããã¹ãŠãæ£åžžã§æ£ããããšã確èªããŸãã 確èªãåãåã£ãã¯ã©ã€ã¢ã³ãã¯ãåãã³ãã³ããååŸããŠ2çªç®ã®ã²ãŒã ç¶æ ã«é©çšãããµãŒããŒã«ãã£ãŠæ¢ã«æ£ãããšç¢ºèªãããç¶æ ã«ããŸãã åæã«ãå®å šã®ããã«è¡ãããå€æŽã®ããã·ã¥ãæ¯èŒããæ©äŒããããŸãããŸããã¯ã©ã€ã¢ã³ãäžã®ããªãŒå šäœã®å®å šãªããã·ã¥ãæ¯èŒããããšãã§ããŸããããã¯ãã³ãã³ãã®å®è¡åŸã«èšç®ã§ããééãå°ãªããååã«é«éã§ãããšèŠãªãããŸãã ãµãŒããŒããã¹ãŠãæ£åžžã§ãããšèšã£ãŠããªãå Žåãäœãèµ·ãã£ãã®ããã¯ã©ã€ã¢ã³ãã«å°ããã¯ã©ã€ã¢ã³ãã¯ã³ãã³ããã¯ã©ã€ã¢ã³ãã§æ£åžžã«å®è¡ãããåãšãŸã£ããåãããã«ãã·ãªã¢ã«åããã2çªç®ã®ã²ãŒã ç¶æ ãã¯ã©ã€ã¢ã³ãã«éä¿¡ã§ããŸãã
ãœãªã¥ãŒã·ã§ã³ã¯éåžžã«é åçã«èŠããŸãããã³ãŒãã¬ãã«ã§è§£æ±ºããå¿ èŠããã2ã€ã®åé¡ãçºçããŸãã
- ã³ãã³ããã©ã¡ãŒã¿ã®äžã«ã¯ãåçŽãªã¿ã€ãã ãã§ãªããã¢ãã«ãžã®ãªã³ã¯ããããŸãã å¥ã®ã²ãŒã ã¹ãããã§ã¯ããŸã£ããåããªããžã§ã¯ããã¢ãã«ã®ä»ã®ãªããžã§ã¯ãã§ãã ãã®åé¡ã次ã®æ¹æ³ã§è§£æ±ºããŸããã³ãã³ããã¯ã©ã€ã¢ã³ãã§å®è¡ãããåã«ããã¹ãŠã®ããŒã¿ãã·ãªã¢ã«åããŸãã ãããã®äžã«ã¯ãã¢ãã«ãžã®ãªã³ã¯ããããŸããããã¯ãã²ãŒã ç¶æ ã®ã«ãŒãããã¢ãã«ãžã®ãã¹ã®åœ¢åŒã§èšè¿°ããŸãã å®è¡åŸã«ãã¹ãå€æŽãããå¯èœæ§ããããããããŒã ã®åã«ãããè¡ããŸãã 次ã«ããã®ãã¹ããµãŒããŒã«éä¿¡ãããšããµãŒããŒã®ã²ãŒã ã¹ããŒãã¯ãéäžã§ã¢ãã«ãžã®ãªã³ã¯ãååŸã§ããŸãã åæ§ã«ãããŒã ã2çªç®ã®ã²ãŒã ç¶æ ã«é©çšãããå Žåãã¢ãã«ã¯2çªç®ã®ã²ãŒã ç¶æ ããååŸã§ããŸãã
- åºæ¬çãªã¿ã€ããšã¢ãã«ã«å ããŠãããŒã ã«ã¯ã³ã¬ã¯ã·ã§ã³ãžã®ãªã³ã¯ããããŸãã èŸæž<ããŒãã¢ãã«>ãèŸæž<ã¢ãã«ãããŒ>ããªã¹ã<ã¢ãã«>ããªã¹ã<å€>ã ãã¹ãŠã®å Žåã圌ãã¯ã·ãªã¢ã©ã€ã¶ãŒãæžããªããã°ãªããŸããã 確ãã«ãããªãã¯ããã«çªå ¥ããããšã¯ã§ããŸãããå®éã®ãããžã§ã¯ãã§ã¯ããã®ãããªåéã¯ãã£ãã«èµ·ãããŸããã
- ãµãŒããŒã«äžåºŠã«1ã€ãã€ã³ãã³ããéä¿¡ããããšã¯ãå§ãã§ããŸãããã€ã³ã¿ãŒãããã§ã³ãã³ããååŸã«ãã©ãã°ãããããéããŠãŒã¶ãŒãã³ãã³ããäœæã§ããããã§ãã貧匱ãªã€ã³ã¿ãŒãããã§ã¯ããµãŒããŒã§åŠçã§ããªãã£ãã³ãã³ãã®ããŒã«ã倧ãããªããŸãã ã³ãã³ããäžåºŠã«1ã€ãã€éä¿¡ãã代ããã«ãããã€ãã®ããŒã¹ããŸãšããŠéä¿¡ããŸãã ãã®å ŽåããµãŒããŒããäœãåé¡ãçºçãããšããå¿çãåãåã£ãåŸãæåã«ãµãŒããŒã«ãã£ãŠç¢ºèªãããåãããã±ãŒãžããã®ãã¹ãŠã®ä»¥åã®ã³ãã³ãã2çªç®ã®ç¶æ ã«é©çšããå¿ èŠããããŸãããã®åŸãå¶åŸ¡2çªç®ã®ç¶æ ãæ¶å»ããŠãµãŒããŒã«éä¿¡ããŸãã
ã³ãã³ãã®å©äŸ¿æ§ãšäœ¿ãããã
ã³ãã³ãå®è¡ã³ãŒãã¯ãã²ãŒã å ã§2çªç®ã«å€§ãããæã責任ã®ããã³ãŒãã§ãã ããã·ã³ãã«ã§æ確ã«ãªããããã°ã©ããŒãæã§äœåãªããšãæžãå¿ èŠãå°ãªããªãã»ã©ãã³ãŒããéãæžããããšã©ãŒãå°ãªããªããéåžžã«äºæ³å€ã«ãããã°ã©ããŒã¯å¹žãã«ãªããŸãã å®è¡ã³ãŒãã¯ãåå¥ã®éçã«ãŒã«ã¯ã©ã¹ã«ããäžè¬çãªéšåãšæ©èœã«å ããŠãã³ãã³ãèªäœã«çŽæ¥é 眮ããŸããã»ãšãã©ã®å Žåããããã¯ãåäœããã¢ãã«ã¯ã©ã¹ã®æ¡åŒµã®åœ¢åŒã§ãã ç§ã®ããããããžã§ã¯ãã®ã³ãã³ãã®äŸãããã€ã瀺ããŸãã1ã€ã¯éåžžã«åçŽã§ããã1ã€ã¯ããå°ãè€éã§ãã
namespace HexKingdoms { public class FCSetSideCostCommand : HexKingdomsCommand { // protected override bool DetaliedLog { get { return true; } } public FCMatchModel match; public int newCost; protected override void HexApply(HexKingdomsRoot root) { match.sideCost = newCost; match.CalculateAssignments(); match.CalculateNextUnassignedPlayer(); } } }
ãããŠããã®ãã°ãç¡å¹ã«ãããŠããªãå Žåããã®ã³ãã³ããããèªäœã®åŸã«æ®ããã°ããããŸãã
[FCSetSideCostCommand id=1 match=FCMatchModel[0] newCost=260] Execute:00:00:00.0027546 Apply:00:00:00.0008689 { "LOCAL_PERSISTENTS":{ "@changed":{ "0":{"SIDE_COST":260}, "1":{"POSSIBLE_COST":260}, "2":{"POSSIBLE_COST":260}}}}
ãã°ã«ç€ºãããæåã®æéã¯ãã¢ãã«ã«å¿ èŠãªãã¹ãŠã®å€æŽãè¡ãããæéã§ããã2çªç®ã¯ããã¹ãŠã®å€æŽãã€ã³ã¿ãŒãã§ãŒã¹ã³ã³ãããŒã©ãŒã«ãã£ãŠå®è¡ãããæéã§ãã ããã¯ãã²ã©ãé ãããšã誀ã£ãŠè¡ããªãããããŸãã¯åã«ã¢ãã«èªäœã®ãµã€ãºã®ããã«æäœã«æéãããããããå Žåã«éã«åãããã«éç¥ããããã«ããã°ã«è¡šç€ºããå¿ èŠããããŸãã
Id-shniksã®æ°žç¶ãªããžã§ã¯ããžã®åŒã³åºãã¯å¥ãšããŠããã°ã®å¯èªæ§ãå€§å¹ ã«äœäžãããŸãããããã§ã¯åé¿ã§ãããããããŸããããã³ãã³ãã³ãŒãèªäœãšã²ãŒã ç¶æ ã§è¡ã£ããã°ã¯é©ãã»ã©æ確ã§ãã ã³ãã³ãã®ããã¹ãã§ã¯ãããã°ã©ããŒã1åäœåã«ç§»åããããšã¯ãããŸããã å¿ èŠãªãã®ã¯ãã¹ãŠããã³ãããã®äžã®ãšã³ãžã³ã«ãã£ãŠè¡ãããŸãã
ã§ã¯ããã倧ããªããŒã ã®äŸãèŠãŠã¿ãŸããã
namespace HexKingdoms { public class FCSetUnitForPlayerCommand : HexKingdomsCommand { // protected override bool DetaliedLog { get { return true; } } public FCSelectArmyScreenModel screen; public string unit; public int count; protected override void HexApply(HexKingdomsRoot root) { if (count == 0 && screen.player.units.ContainsKey(unit)) { screen.player.units.Remove(unit); screen.selectedUnits.Remove(unit); } else if (count != 0) { if (screen.player.units.ContainsKey(unit)) { screen.player.units[unit] = count; screen.selectedUnits[unit].count = count; } else { screen.player.units.Add(unit, count); screen.selectedUnits[unit] = new ReferenceUnitModel() { type = unit, count = count }; } } screen.SetSelectedReferenceUnits(); screen.player.CalculateUnitsCost(); var side = screen.match.sides[screen.side]; screen.match.CalculatePlayerAssignmentsAcceptablity(side); screen.match.CalculateNextUnassignedPlayer(screen.player); } } }
ãããŠãããã«ããŒã ãæ®ãããã°ããããŸãïŒ
[FCSetUnitForPlayerCommand id=3 screen=/UI_SCREENS[main] unit=militia count=1] Execute:00:00:00.0065625 Apply:00:00:00.0004573 { "LOCAL_PERSISTENTS":{ "@changed":{ "2":{ "UNITS":{ "@set":{"militia":1}}, "ASSIGNED":7}}}, "UI_SCREENS":{ "@changed":{ "main":{ "SELECTED_UNITS":{ "@set":{ "militia":{"@new":null, "TYPE":"militia", "REMARK":null, "COUNT":1, "SELECTED":false, "DISABLED":false, "HIGHLIGHT_GREEN":false, "HIGHLIGHT_RED":false, "BUTTON_ENABLED":false}}}}}}}
圌ããèšãããã«ãããã¯ã¯ããã«æ確ã§ãã æéããããŠãããŒã ã«äŸ¿å©ã§ã³ã³ãã¯ãã§æçãªãã°ãæäŸããŸãã ãããããªãã®å¹žãã®éµã§ãã ã¢ãã«ã¯éåžžã«é«éã«åäœããå¿ èŠããããããããã§ã¯ãã¹ãã¬ãŒãžã®æ¹æ³ãšãã£ãŒã«ããžã®ã¢ã¯ã»ã¹æ¹æ³ã§ããŸããŸãªããªãã¯ã䜿çšããŸããã ææªã®å Žåãã³ãã³ãã¯ãã¬ãŒã ããšã«1åå®è¡ãããŸãããå®éã«ã¯æ°åã®é »åºŠã§å®è¡ããããããã³ãã³ããã£ãŒã«ãã®ã·ãªã¢ã«åãšéã·ãªã¢ã«åã¯ããªãã¬ã¯ã·ã§ã³ãä»ããŠãåé¡ãªãå®è¡ãããŸãã é åºãåºå®ãããããã«ãååã§ãã£ãŒã«ãã䞊ã¹æ¿ããã ãã§ããã³ãã³ãã®å®è¡äžã«ãã£ãŒã«ãã®ãªã¹ãã1åã³ã³ãã€ã«ãããã€ãã£ãã¡ãœããCïŒã䜿çšããŠèªã¿æžãããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®æ å ±ã¢ãã«ã
ãšã³ãžã³ãè€éã«ãã次ã®ã¹ãããã«é²ã¿ãŸãããããã®ã¹ãããã¯æãããèŠããŸãããã€ã³ã¿ãŒãã§ãŒã¹ã®äœæãšãããã°ãå€§å¹ ã«ç°¡çŽ åããŸãã éåžžã«å€ãã®å Žåãç¹ã«é¢é£ããMVPãã¿ãŒã³ã§ã¯ãã¢ãã«ã«ã¯ãµãŒããŒå¶åŸ¡ã®ããžãã¹ããžãã¯ã®ã¿ãå«ãŸããã€ã³ã¿ãŒãã§ã€ã¹ã®ç¶æ ã«é¢ããæ å ±ã¯ãã¬ãŒã³ã¿ãŒå ã«ä¿åãããŸãã ããšãã°ã5ã€ã®ãã±ããã泚æãããšããŸãã ãã§ã«çªå·ãéžæããŠããŸããããŸã ã泚æããã¿ã³ãã¯ãªãã¯ããŠããŸããã ãã©ãŒã ã§éžæãããã±ããã®æ£ç¢ºãªæ°ã«é¢ããæ å ±ã¯ãã¯ã©ã¹ã®ç§å¯ã®ã³ãŒããŒã®ã©ããã«ä¿åã§ããã¢ãã«ãšãã®ãã£ã¹ãã¬ã€ã®éã®ã¬ã¹ã±ãããšããŠæ©èœããŸãã ãŸãã¯ãããšãã°ããã¬ã€ã€ãŒãç»é¢ãåãæ¿ããããã¢ãã«ã«äœãå€åããªããæ²åãèµ·ãã£ããšãã«åœŒãããå Žæã§ããããã°ã«é¢äžããããã°ã©ããŒã¯éåžžã«èšç·Žããããã¹ã¿ãŒã®èšèããããç¥ããŸããã ç§ã®æèŠã§ã¯ããã®ã¢ãããŒãã¯ã·ã³ãã«ã§ç解ãããããã»ãšãã©ã®å Žåã«äœ¿çšãããå°ãæªæããããŸãã äœãåé¡ãçºçããå Žåããšã©ãŒã®åå ãšãªã£ããã®ãã¬ãŒã³ã¿ãŒã®ç¶æ ãèŠã€ããæ¹æ³ããŸã£ãããªãããã§ãã ç¹ã«ãå¶åŸ¡äžã®åçŸå¯èœãªç°å¢ã®ãã¹ã¿ãŒã§ã¯ãªãã1000ãã«ã®æäœäžã«ããã«ãµãŒããŒã§ãšã©ãŒãçºçããå Žåã
ãã®éåžžã®ã¢ãããŒãã®ä»£ããã«ãã¢ãã«ä»¥å€ã®äººã«ã€ã³ã¿ãŒãã§ãŒã¹ã®ç¶æ ã«é¢ããæ å ±ãå«ããããšãçŠæ¢ããŸãã ããã«ã¯ããã€ãã®ããã«ãæŠããªããã°ãªããªãé·æãšçæããããŸãã
- ïŒ+1ïŒæãéèŠãªå©ç¹ã¯ã人ã ã®ããã°ã©ãã³ã°äœæ¥ãæ°ãæç¯çŽã§ããããšã§ããäœãåé¡ãçºçããå Žåãããã°ã©ããŒã¯äºæ ã®åã«ã²ãŒã ã®ç¶æ ãèªã¿èŸŒãã ãã§ãããžãã¹ã¢ãã«ã ãã§ãªããç»é¢ã®æåŸã®ãã¿ã³ãžã®ã€ã³ã¿ãŒãã§ã€ã¹å šäœã®ç¶æ ããŸã£ããåãã«ãªããŸãã
- ïŒ+2ïŒäžéšã®ããŒã ãã€ã³ã¿ãŒãã§ãŒã¹ã§äœããå€æŽããå Žåãããã°ã©ããŒã¯ç°¡åã«ãã°ã«ã¢ã¯ã»ã¹ããåã®ã»ã¯ã·ã§ã³ã®ããã«ã䟿å©ãªjson圢åŒã§äœãå€æŽãããããç°¡åã«ç¢ºèªã§ããŸãã
- ïŒ-1ïŒã¢ãã«ã«ã¯ãã²ãŒã ã®ããžãã¹ããžãã¯ãç解ããããã«å¿ èŠã§ã¯ãªãããµãŒããŒã«ãã£ãŠ2åå¿ èŠãšãããªãå€ãã®åé·ãªæ å ±ã衚瀺ãããŸãã
ãã®åé¡ã解決ããããã«ãäžéšã®ãã£ãŒã«ããnotServerVerifiedãšããŠããŒã¯ããŸããããšãã°ã次ã®ããã«ãªããŸãã
public EDictionary<string, UIStateModel> uiScreens { get { return UI_SCREENS.Get(this); } } public static PDictionaryModel<string, UIStateModel> UI_SCREENS = new PDictionaryModel<string, UIStateModel>() { notServerVerified = true };
ã¢ãã«ã®ãã®éšåãšãã®äžã®ãã¹ãŠã¯ãã¯ã©ã€ã¢ã³ãã®ã¿ã«é¢é£ããŸãã
ãŸã èŠããŠããå Žåã¯ããšã¯ã¹ããŒãããå¿ èŠããããã®ãšããã§ãªããã®ã®ãã©ã°ïŒ
[Flags] public enum ExportMode { all = 0x0, changes = 0x1, serverVerified = 0x2 }
ãããã£ãŠãããã·ã¥ããšã¯ã¹ããŒããŸãã¯èšç®ãããšãã«ãããªãŒå šäœããšã¯ã¹ããŒããããããµãŒããŒã«ãã£ãŠãã§ãã¯ãããããªãŒã®äžéšã®ã¿ããšã¯ã¹ããŒãããããæå®ã§ããŸãã
ããããçããæåã®æãããªè€éãã¯ããµãŒããŒããã§ãã¯ããå¿ èŠãããã³ãã³ããšäžèŠãªã³ãã³ããåå¥ã«äœæããå¿ èŠãããããšã§ãããå®å šã«ãã§ãã¯ããå¿ èŠã¯ãªãã³ãã³ãããããŸãã ã³ãã³ããèšå®ããããã®äžå¿ èŠãªæäœãããã°ã©ãã«ããŒãããªãããã«ããããã«ããšã³ãžã³ããŒãã§å¿ èŠãªãã¹ãŠã®æäœãå床詊ã¿ãŸãã
public partial class Command { /** <summary> , </summary> */ public virtual void Apply(ModelRoot root) {} /** <summary> </summary> */ public virtual void ApplyClientSide(ModelRoot root) {} }
ã³ãã³ããäœæããããã°ã©ãã¯ããããã®æ©èœã®äžæ¹ãŸãã¯äž¡æ¹ããªãŒããŒã©ã€ãã§ããŸãã ãã¡ãããããã¯ãã¹ãŠçŽ æŽãããããšã§ãããããã°ã©ããŒãäœããå°ç¡ãã«ããªãããã«ããã«ã¯ã©ãããã°ããã§ããããããã圌ãäœããå°ç¡ãã«ãããã©ãããã°ææ©ãç°¡åã«ä¿®æ£ã§ããã§ããããã 2ã€ã®æ¹æ³ããããŸãã æåã®ã¢ããªã±ãŒã·ã§ã³ãé©çšããŸãããã2çªç®ã®ã¢ããªã±ãŒã·ã§ã³ããã£ãšæ°ã«å ¥ããããããŸããã
æåã®æ¹æ³
ã¢ãã«ã®ã¯ãŒã«ãªæ©èœã䜿çšããŸãã
- ãšã³ãžã³ã¯æåã®é¢æ°ãåŒã³åºãããã®åŸããµãŒããŒããã§ãã¯ããã²ãŒã ç¶æ ã®éšåã®å€æŽã®ããã·ã¥ãåãåããŸãã å€æŽããªãå Žåã¯ãã¯ã©ã€ã¢ã³ãããŒã ã®ã¿ã察象ãšããŠããŸãã
- ãµãŒããŒã§æ€èšŒããããã®ã ãã§ãªããã¢ãã«å šäœã®å€æŽã®ã¢ãã«ããã·ã¥ãååŸããŸãã åã®ããã·ã¥ãšç°ãªãå Žåãããã°ã©ããŒã¯å°ç¡ãã«ããŠããµãŒããŒã«ãã£ãŠãã§ãã¯ãããªãã£ãã¢ãã«ã®äžéšãå€æŽããŸããã ç¶æ ããªãŒãäžåšããnotServerVerified = trueãã£ãŒã«ããšåœŒãå€æŽããããªãŒã®äžã«ãããã£ãŒã«ãã®å®å šãªãªã¹ããããã°ã©ããŒã«å®è¡ãšããŠãã³ãããŸãã
- 2çªç®ã®é¢æ°ãåŒã³åºããŸãã ã¢ãã«ããããã§ãã¯ãããéšåã§çºçããå€æŽã®ããã·ã¥ãååŸããŸãã æåã®åŒã³åºãåŸã®ããã·ã¥ãšäžèŽããªãå Žåã2çªç®ã®é¢æ°ã§ããã°ã©ãããã¹ãŠãè¡ã£ãããšãæå³ããŸãã ãã®å Žåã«éåžžã«æçãªãã°ãååŸãããå Žåã¯ãã¢ãã«å šäœãå ã®ç¶æ ã«ããŒã«ããã¯ãããã¡ã€ã«ã«ã·ãªã¢ã«åããŸããããã°ã©ãã¯ãããã°ã«äŸ¿å©ã«ãªããå šäœãè€ââ補ããŸãïŒ2è¡-ã·ãªã¢ã«å-éã·ãªã¢ã«åïŒãæåã«é©çšããŸãé¢æ°ãã¢ãã«ãå€æŽãããŠããªãããã«å€æŽãã³ããããããã®åŸã2çªç®ã®é¢æ°ãé©çšããŸãã ãããŠããµãŒããŒãã§ãã¯ãããéšåã®ãã¹ãŠã®å€æŽãJSONã®åœ¢åŒã§ãšã¯ã¹ããŒãããäžæ£ãªå®è¡ã«å«ããŸããããã«ãããæ¥ããããããã°ã©ããŒã¯ãäœãã©ãã§å€æŽããäœãå€æŽãã¹ãã§ã¯ãªãããããã«ç¢ºèªã§ããŸãã
ãã¡ãããæãããèŠããŸãããå®éã«ã¯7è¡ã§ãããããè¡ãé¢æ°ã¯ãã¹ãŠïŒ2çªç®ã®æ®µèœããããªãŒããã©ããŒã¹ããããšãé€ãïŒæ¢ã«æºåãã§ããŠããããã§ãã ãããŠãããã¯ã¬ã»ãã·ã§ã³ã§ãããããæé©ã§ã¯ãªãè¡åããšãããšãã§ããŸãã
第äºã®æ¹æ³
ããå°ãæ®å¿ã§ããModelRootã«ã¯1ã€ã®ããã¯ãã£ãŒã«ãããããŸããã2ã€ã«åå²ã§ããŸãã1ã€ã¯ãã§ãã¯ããããã£ãŒã«ãã®ã¿ããµãŒããŒã«ããã¯ãããã1ã€ã¯ãã§ãã¯ããããã£ãŒã«ãã®ã¿ãããã¯ããŸãã ãã®å Žåãäœãééã£ãããšãããããã°ã©ããŒã¯ããããè¡ã£ãå Žæã«çµã³ä»ããŠããã«ããã«ã€ããŠèª¬æãåŸãã§ãããã ãã®ã¢ãããŒãã®å¯äžã®æ¬ ç¹ã¯ãããªãŒã§1ã€ã®ã¢ãã«ããããã£ãæªãã§ãã¯ãšããŠããŒã¯ãããŠããå Žåãåãã£ãŒã«ããããŒã¯ãããŠããªããŠããããã·ã¥ã®èšç®ãšå€æŽã®å¶åŸ¡ã«é¢ãããã®äžã®ããªãŒã®ãã¹ãŠãæ€æ»ãããªãããšã§ãã ãããŠãã¡ãããããã¯ã¯éå±€ã調ã¹ãŸãããã€ãŸããããªãŒã®ãã§ãã¯ãããŠããªãéšåã®ãã¹ãŠã®ãã£ãŒã«ããããŒã¯ããå¿ èŠããããUIã®åãã¯ã©ã¹ãšããªãŒã®éåžžã®éšåã䜿çšããå Žæã«ãã£ãŠã¯æ©èœããŸããã ãªãã·ã§ã³ãšããŠããã®ãããªæ§æãå¯èœã§ãïŒç°¡ç¥åããŠèšè¿°ããŸãïŒã
public class GameState : Model { public RootModelData data; public RootModelLocal local; } public class RootModel { public bool locked { get; } }
次ã«ãåãµãããªãŒã«ç¬èªã®ããã¯ãããããšãããããŸãã GameStateã¯ã¢ãã«ãç¶æ¿ããŸããåãæ©èœããã¹ãŠåå¥ã«å®è£ ãããããç°¡åã ããã§ãã
å¿ èŠãªæ¹å
ãã¡ãããã³ãã³ãã®åŠçãæ åœãããããŒãžã£ãŒãæ°ããæ©èœãè¿œå ããå¿ èŠããããŸãã å€æŽã®æ¬è³ªã¯ããã¹ãŠã®ã³ãã³ãããµãŒããŒã«éä¿¡ãããã®ã§ã¯ãªãããã§ãã¯ãããå€æŽãäœæããã³ãã³ãã®ã¿ããµãŒããŒã«éä¿¡ãããããšã§ãã ãã®åŽã®ãµãŒããŒã¯ãã²ãŒã ç¶æ ããªãŒå šäœãäžããã®ã§ã¯ãªãããã§ãã¯å¯Ÿè±¡ã®éšåã®ã¿ãäžãããããããã·ã¥ã¯ãã§ãã¯å¯Ÿè±¡ã®éšåã«ã€ããŠã®ã¿äžèŽããŸãã ãµãŒããŒã§ã³ãã³ããå®è¡ããããšãã³ãã³ãã®2ã€ã®é¢æ°ã®ãã¡æåã®é¢æ°ã®ã¿ãèµ·åãããŸããã²ãŒã ç¶æ ã®ã¢ãã«ãžã®åç §ã解決ããå Žåããã¹ãããªãŒã®æ€èšŒäžå¯èœãªéšåã«ã€ãªããå Žåãã¢ãã«ã®ä»£ããã«ã³ãã³ãå€æ°ã«nullãé 眮ãããŸãã ãã¹ãŠã®ééä¿¡ããŒã ã¯ãéåžžã®ããŒã ãšæ£çŽã«äžŠãã§ããŸãããåæã«ç¢ºèªæžã¿ãšã¿ãªãããŸãã ããããã©ã€ã³ã«å°éãããããã®åã«æªç¢ºèªã®ãã®ããªããªããšããã«ããããã¯ããã«2çªç®ã®ç¶æ ã«é©çšãããŸãã
å®è£ ã«ã¯åºæ¬çã«è€éãªãã®ã¯ãããŸããã ã¢ãã«ã®åãã£ãŒã«ãã®ããããã£ã«ã¯ããã1ã€ã®æ¡ä»¶ã§ããããªãŒãã©ããŒãµã«ããããŸãã
å¥ã®å¿ èŠãªæ¹è¯-ããªãŒã®ãã§ãã¯æžã¿ããã³æªãã§ãã¯ã®éšåã§ParsistentModelã®åå¥ã®ãã¡ã¯ããªãå¿ èŠã«ãªãããããã®NextFreeIdã¯ç°ãªããŸãã
ãµãŒããŒã«ãã£ãŠéå§ãããã³ãã³ã
ãµãŒããŒãã¯ã©ã€ã¢ã³ãã«ã³ãã³ããããã·ã¥ãããå ŽåããµãŒããŒã«å¯Ÿããã¯ã©ã€ã¢ã³ãã®ç¶æ ãæ°ã¹ãããå ã«ãžã£ã³ãããå¯èœæ§ããããããããã€ãã®åé¡ããããŸãã äž»ãªèãæ¹ã¯ããµãŒããŒãã³ãã³ããéä¿¡ããå¿ èŠãããå Žåã次ã®å¿çã§ãµãŒããŒéç¥ãã¯ã©ã€ã¢ã³ãã«éä¿¡ãããã®ã¯ã©ã€ã¢ã³ãã«éä¿¡ãããéç¥ã®ãã£ãŒã«ãã«ãããæžã蟌ã¿ãŸãã ã¯ã©ã€ã¢ã³ãã¯éç¥ãåä¿¡ããããã«åºã¥ããŠã³ãã³ããäœæããã¯ã©ã€ã¢ã³ãã§å®äºããããŸã ãµãŒããŒã«å°éããŠããªããã®ã®åŸã«ãããããã¥ãŒã®æåŸã«é 眮ããŸãã ãã°ãããããšãã¢ãã«ãæäœããéåžžã®ããã»ã¹ã®äžéšãšããŠãã³ãã³ãããµãŒããŒã«éä¿¡ãããŸãã åŠçã®ããã«ãã®ã³ãã³ããåä¿¡ãããšããµãŒããŒã¯çºä¿¡ãã¥ãŒããéç¥ãã¹ããŒããŸãã ã¯ã©ã€ã¢ã³ãã次ã®ããã±ãŒãžã§èšå®æéå ã«éç¥ã«å¿çããªãã£ãå Žåãåèµ·åã³ãã³ããéä¿¡ãããŸãã éç¥ãåãåã£ãã¯ã©ã€ã¢ã³ããèœã¡ãããåŸã§æ¥ç¶ããããäœããã®çç±ã§ã²ãŒã ãããŒããããããå ŽåããµãŒããŒã¯ãã¹ãŠã®éç¥ãã³ãã³ãã«å€æããŠããç¶æ ã«æž¡ãããã®åŽã§ããããå®è¡ããŸãããã®åŸãåå ã¯ã©ã€ã¢ã³ãã«æ°ããç¶æ ãäžããŸãã ãµãŒããŒããã¬ã€ã€ãŒãããéã奪ã£ãç¬éã«ãã¬ã€ã€ãŒããéã䜿ãããšãã§ããå Žåããã¬ã€ã€ãŒã¯è² ã®ãªãœãŒã¹ãšç«¶åç¶æ ã«ãªãå¯èœæ§ãããããšã«æ³šæããŠãã ããã å¶ç¶ã®äžèŽã¯ããããã«ãããŸããããDAUã倧ããå Žåãã»ãšãã©é¿ããããŸããã ãããã£ãŠããã®ãããªç¶æ³ã§ã€ã³ã¿ãŒãã§ãŒã¹ãšã²ãŒã ã®ã«ãŒã«ãæ»ã¬ããšã¯ãããŸããã
ãµãŒããŒã®å¿çãç¥ãå¿ èŠãããå®è¡ããã³ãã³ã
å žåçãªééãã¯ãä¹±æ°ã¯ãµãŒããŒããããååŸã§ããªããšèããããšã§ãã å ±éã®sidããéå§ããŠãã¯ã©ã€ã¢ã³ããšãµãŒããŒã§åæããŠå®è¡ãããåãæ¬äŒŒä¹±æ°ãžã§ãã¬ãŒã¿ãŒã䜿çšããããšã劚ãããã®ã¯äœããããŸããã ããã«ãçŸåšã®ã·ãŒãã¯ã²ãŒã ã¹ããŒãã«çŽæ¥ä¿åã§ããŸãã ãã®ãžã§ãã¬ãŒã¿ãŒã®å¿çãåæããã®ãé£ãããšæãã人ãããŸãã å®éããã®ããã«ã¯ãåãèšäºã«ãã1ã€æ°åãããã°ååã§ããã€ãŸãããã®æç¹ãŸã§ã«ãžã§ãã¬ãŒã¿ãŒããåãåã£ãæ°åã®æ°ã§ãã äœããã®çç±ã§ãžã§ãã¬ãŒã¿ãŒãåæããªãå Žåãã©ããã«ãšã©ãŒããããã³ãŒãã¯ç¢ºå®çã«æ©èœããŸããã ãããŠããã®äºå®ã¯ã«ãŒãããã®äžã«é ãããã¹ãã§ã¯ãªããæŽçãããŠãšã©ãŒãæ¢ãã¹ãã§ãã äžæè°ãªç®±ãå«ããŠãã»ãšãã©ã®å Žåããã®ã¢ãããŒãã§ååã§ãã
ãã ãããã®ãªãã·ã§ã³ãé©åã§ãªãå ŽåããããŸãã ããšãã°ãéåžžã«é«äŸ¡ãªè³åããã¬ã€ããŠããŠãcãªä»²éã«ã²ãŒã ãéã³ã³ãã€ã«ãããããªãå ŽåãããããæžããŠãä»ãããã€ã¢ã¢ã³ãããã¯ã¹ãéãããšããã®åã«å¥ã®å Žæã§ãã©ã ãåããšã©ããªãããäºåã«äŒããŸãã ã©ã³ãã å€æ°ããšã«ã·ãŒããåå¥ã«ä¿åã§ããŸããããã«ãããæ£é¢ããã®ãããã³ã°ãé²æ¢ã§ããŸãããå¿ èŠãªè£œåãçŸåšããã€ããããéç¥ãããããããã®å©ãã«ã¯ãªããŸããã ããŠãæãæçœãªã±ãŒã¹-ãŸããªã€ãã³ãã®å¯èœæ§ã«é¢ããæ å ±ãã¯ã©ã€ã¢ã³ãèšå®ã«åæ ããããªãå ŽåããããŸãã èŠããã«ããµãŒããŒã®å¿çãåŸ ã€å¿ èŠãããå ŽåããããŸãã
ãã®ãããªç¶æ³ã¯ããšã³ãžã³ã®è¿œå æ©èœã§ã¯ãªããããŒã ã2ã€ã«åå²ããããšã§è§£æ±ºããå¿ èŠããããŸããæåã®ç¶æ³ã§ã¯ãç¶æ³ãæºåããéç¥ãåŸ æ©ç¶æ ã«ããŸãã ã¯ã©ã€ã¢ã³ãã§ãããã®éã®ã€ã³ã¿ãŒãã§ã€ã¹ããã£ãããšãããã¯ããŠããå¥ã®ã³ãã³ããããæããããšããããŸããããšãã°ããšãã«ã®ãŒã®åäœãæéå ã«åŸ©å ãããŸãã
ãã®ãããªç¶æ³ã¯ã«ãŒã«ã§ã¯ãªããäŸå€ã§ããããšãç解ããããšãéèŠã§ãã å®éãã»ãšãã©ã®ã²ãŒã ã«å¿ èŠãªã®ã¯ãGetInitialGameStateãšãã1ã€ã®ããŒã ã ãã§ãã ãã®ãããªã³ãã³ãã®ãã1ã€ã®ããã¯ã¯ãã¡ã¿ã²ãŒã ã§ã®ãã¬ã€ã€ãŒéã®å¯Ÿè©±ãããšãã°GetLeaderboardã§ãã ä»ã®200åãã¹ãŠã¯æ±ºå®è«çã§ãã
ãµãŒããŒããŒã¿ã¹ãã¬ãŒãžãšãµãŒããŒæé©åã®ææ§ãªãããã¯
ç§ã¯ã¯ã©ã€ã¢ã³ãã§ãããšããã«èªããŸãããæã ãããç¥ãããŠãããµãŒããŒãµãŒãŽã¡ã³ããããé ã«å¿ã³å¯ããªããããªã¢ã€ãã¢ãã¢ã«ãŽãªãºã ãèããããšããããŸãã ååãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãããçæ³çãªå Žåã«ãµãŒããŒãµã€ãã§èªåã®ã¢ãŒããã¯ãã£ãã©ã®ããã«æ©èœãããã«ã€ããŠã®å³ãäœæããŸããã ãã ããçŠå¿ããããŸããå°éã®ãµãŒããŒã«çžè«ããå¿ èŠããããŸãã
ãŸããããŒã¿ã¹ãã¬ãŒãžã«ã€ããŠã è¿œå ã®å¶éãããã®ã¯ãµãŒããŒåŽã§ãã ããšãã°ãéçãã£ãŒã«ãã®äœ¿çšãçŠæ¢ãããŠããå ŽåããããŸãã ããã«ãã³ãã³ããšã¢ãã«ã®ã³ãŒãã¯èªå移æ€å¯èœã§ãããã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ããããã£ã³ãŒãã¯äžèŽããå¿ èŠã¯ãããŸããã ããšãã°ãmemcacheããã®ãã£ãŒã«ãå€ã®é 延åæåãŸã§ããããããã®ãé衚瀺ã«ããããšãã§ããŸãã ããããã£ãã£ãŒã«ãã¯ããµãŒããŒã§äœ¿çšãããè¿œå ã®ãã©ã¡ãŒã¿ãŒãåãåãããšãã§ããŸãããã¯ã©ã€ã¢ã³ãã®æäœã«ã¯åœ±é¿ããŸããã
ãµãŒããŒã®æåã®åºæ¬çãªéãïŒãã£ãŒã«ãã¯ã·ãªã¢ã«åããã³éã·ãªã¢ã«åãããŸãã åççãªè§£æ±ºçã¯ãç¶æ ããªãŒã®ã»ãšãã©ã1ã€ã®å·šå€§ãªãã€ããªãŸãã¯jsonãã£ãŒã«ãã«ã·ãªã¢ã«åãããããšã§ãã åæã«ãããã€ãã®ãã£ãŒã«ãã¯ããŒãã«ããååŸãããŸãã ãã¬ã€ã€ãŒéã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãµãŒãã¹ãæ©èœããããã«ã¯ãäžéšã®ãã£ãŒã«ãã®å€ãåžžã«å¿ èŠã«ãªãããããããå¿ èŠã§ãã ããšãã°ãã¢ã€ã³ã³ãšã¬ãã«ã¯ããŸããŸãªäººã ã«ãã£ãŠçµ¶ãéãªãåããŠããŸãã ãããã¯éåžžã®ããŒã¿ããŒã¹ã«ä¿åããã®ãæé©ã§ãã 誰ããèªåã®é åã調ã¹ãããšã決ããå Žåããã®äººã®å®å šãªãŸãã¯éšåçãªãããã詳现ãªç¶æ ãå¿ èŠã«ãªãããšã¯ã»ãšãã©ãããŸããã
ããã«ãããŒã¹ãããã£ãŒã«ããäžåºŠã«1ã€ãã€åŒãåºãã®ã¯äžäŸ¿ã§ãããé·æéãã¹ãŠããã©ãã°ããããšãã§ããŸãã ç§ãã¡ã®ã¢ãŒããã¯ãã£ã§ã®ã¿å©çšå¯èœãªéåžžã«éæšæºçãªãœãªã¥ãŒã·ã§ã³ã¯ãã¯ã©ã€ã¢ã³ããã³ãã³ããå®è¡ãããšãã«ãã²ãã¿ãŒãã¿ããããããŒãã«ã«åå¥ã«ä¿åããããã¹ãŠã®ãã£ãŒã«ãã«é¢ããæ å ±ãåéãããµãŒããŒããã®ãã£ãŒã«ãã®ã°ã«ãŒããäžããããšãã§ããããã«ã³ãã³ãã«ãã®æ å ±ãè¿œå ããããšã§æ§æãããŸãããŒã¿ããŒã¹ãžã®1ã€ã®ãªã¯ãšã¹ãã ãã¡ããããã¹ãŠãäžæ³šæã«è§Šããå©ãè ã®ããããã°ã©ããŒã«èµ·å ããDDOSãè«ãããšã®ãªãããã«ãåççãªå¶éããããŸãã
ãã®ãããªå¥åã®ã¹ãã¬ãŒãžã§ã¯ããããã¬ãŒã€ãŒãå¥ã®ãã¬ãŒã€ãŒã®ããŒã¿ã«ã¯ããŒã«ãããšããããšãã°åœŒãããéãçããšãããã©ã³ã¶ã¯ã·ã§ã³æ§ã®ã¡ã«ããºã ãèæ ®ããå¿ èŠããããŸãã ããããäžè¬çãªã±ãŒã¹ã§ã¯ãéç¥ã«ãã£ãŠãããè¡ããŸãã ã€ãŸããæ³¥æ£ã¯ããã«ãéãåãåãã奪ããã人ã¯ããã®ããšã«ãªããšãéãåãæ¶ãããæ瀺ããéç¥ãåãåããŸãã
ããŒã ããµãŒããŒéã§åå²ããæ¹æ³
ãµãŒããŒã«ãšã£ãŠ2çªç®ã®éèŠãªç¬éã§ãã 2ã€ã®ã¢ãããŒãããããŸãã æåã«ãèŠæ±ïŒãŸãã¯èŠæ±ã®ãã±ããïŒãåŠçããããã«ãç¶æ å šäœãããŒã¿ããŒã¹ãŸãã¯ãã£ãã·ã¥ããã¡ã¢ãªã«äžããããåŠçãããåŸãããŒã¿ããŒã¹ã«è¿ãããŸãã æäœã¯ãå€æ°ã®ç°ãªãå®è¡ãµãŒããŒã§ã¢ãããã¯ã«å®è¡ãããå ±éã®ããŒã¹ã®ã¿ãæã¡ãåžžã«ããã§ã¯ãããŸããã ã¯ã©ã€ã¢ã³ããšããŠãåããŒã ã«ç¶æ å šäœãäžããããšã¯è¡æçã§ãããã©ã®ããã«æ©èœããéåžžã«ä¿¡é Œæ§ãé«ãã¹ã±ãŒã©ãã«ã«æ©èœããããèŠãŸããã 2çªç®ã®ãªãã·ã§ã³ã¯ãç¶æ ãã¡ã¢ãªå ã§ãã£ããäžæããã¯ã©ã€ã¢ã³ããçŸåšã®ç¶æ ãããŒã¿ããŒã¹ã«æã è¿œå ããã ãã§èœã¡ããŸã§ããã«ååšããããšã§ããç§ã¯ããã®æ¹æ³ãŸãã¯ãã®æ¹æ³ã®é·æãšçæãããªãã«äŒããããšãã§ããŸãããã³ã¡ã³ãã®èª°ããç§ã«æåã®äººãäžè¬ã«çåœã«å¯Ÿããæš©å©ãæã£ãŠããçç±ã説æããŠããããšè¯ãã§ãããã 2çªç®ã®ãªãã·ã§ã³ã§ã¯ãå¶ç¶å¥ã®ãµãŒããŒã§ã¬ã€ãºãããããšãå€æãããã¬ãŒã€ãŒéã®å¯Ÿè©±æ¹æ³ã«ã€ããŠã®è³ªåãçºçããŸããããã¯ãããšãã°ãè€æ°ã®ã¯ã©ã³ã¡ã³ããŒãå ±åæ»æãéå§ããæºåãããŠããå Žåã«éèŠã«ãªãããšããããŸãã 10ã»ãŒãã®é 延ã§ã圌ã®ããŒãã£ãŒã¡ã³ããŒã®ç¶æ ãä»ã®äººã«ç€ºãããšã¯ã§ããŸãããæ®å¿µãªãããããã§éãããšã¯ã§ããŸãããäžèšã®éç¥ãä»ããããåãããããµãŒããŒããå¥ã®ãµãŒããŒãžã®ã³ãã³ã-çŸæç¹ã§ã¯ãããã§çºçãããã¬ãŒã€ãŒã®çŸåšã®ç¶æ ãä¿åããããšã¯ã§ããŸããããµãŒããŒãç°ãªãå Žæããåãã¬ãã«ã®å¯çšæ§ãåããŠããå ŽåããããŠããã©ã³ãµãŒã管çã§ããã®ã§ããããµãŒããŒããå¥ã®ãµãŒããŒã«ãã¬ã€ã€ãŒãéãã«éãã«è»¢éããããšãã§ããŸãã解決çãããç¥ã£ãŠããå Žåã¯ãã³ã¡ã³ãã«å¿ ãèšèŒããŠãã ããã
æéããããŠèžã
質åããå§ããŸããããç§ã¯ã€ã³ã¿ãã¥ãŒã§äººã ãåŒãä»ããã®ãæ¬åœã«å¥œãã§ããããã«ã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒããããããããã«ããªãæ£ç¢ºãªæèšããããŸããããããã©ã®çšåºŠç°ãªããã調ã¹ãæ¹æ³ããããã³ã®ã³ãŒããŒã·ã§ããã§ãã®åé¡ã解決ããããšãããšãããã°ã©ããŒã®æé«ã®å質ãšææªã®å質ãæããã«ãªããŸããäºå®ã¯ãåé¡ã«ã¯æ£åŒãªæ°åŠçã«æ£ãã解決çããªãããšã§ããããããã€ã³ã¿ãã¥ãŒãåãã人ã¯ããããç¥ã£ãŠããã®ã§ãååãšããŠãäž»èŠãªè³ªåã®åŸã§ã®ã¿ã5çªç®ã«å°ãæéãããããŸãããããŠã圌ãã©ã®ããã«ãã®ã€ã³ã¹ãã¬ãŒã·ã§ã³ã«åºäŒãã圌ã次ã«äœãããã-圌ã®ãã£ã©ã¯ã¿ãŒã§æãéèŠãªããš-ãã®äººãããªãã®ãããžã§ã¯ãã§å®éã®åé¡ãå§ãŸã£ããšãã«äœããããã«ã€ããŠå€ããèªã£ãŠããŸãã
ç§ãç¥ã£ãŠããæè¯ã®è§£æ±ºçã§ã¯ãæ£ç¢ºãªéããèŠã€ããããšã¯ã§ããŸããããã¯ã©ã€ã¢ã³ããããµãŒããŒã«å®è¡ãããæé©ãªãã±ããã®æéãŸã§ã®å€ãã®èŠæ±-å¿çãšããµãŒããŒããã¯ã©ã€ã¢ã³ãã«å®è¡ãããæè¯ã®ãã±ããã®æéãŸã§ã®ç¯å²ãæ確ã«ããããšã¯ã§ããŸãããåèšãããšãããã«ããæ°åããªç§ã®ç²ŸåºŠãåŸãããŸããããã¯ãã¢ãã€ã«ã²ãŒã ã®ã¡ã¿ã²ãŒã ã«å¿ èŠãªãã®ãããäœåãåªããŠããŸããããã§ã¯VRãã«ããã¬ã€ã€ãŒãCSã¯ãããŸããããã¯ããã¯åæã®é£ããã®èŠæš¡ãšæ§è³ªãè¡šçŸããããšã¯ããã°ã©ãã«ãšã£ãŠã¯ãŸã è¯ãããšã§ããæãå¯èœæ§ãé«ãã®ã¯ã30ïŒ ãè¶ ããåå·®ã®ã«ãããªãã䜿çšããŠãé·ãéãpingãšããŠå®è¡ãããå¹³åé 延ãç¥ãããšã§ååã§ãã
ééããå¯èœæ§ã®ãã2çªç®ã®ã¯ãŒã«ãªç¶æ³ã¯ãã¹ãªããã²ãŒã ã®ã¹ããŒãžã³ã°ãšãæºåž¯é»è©±ã§ã®ã¯ããã¯ã®è»¢éã§ããã©ã¡ãã®å Žåããã¢ããªã±ãŒã·ã§ã³ã®æéã¯åçã«æ¥æ¿ã«å€åããããããããæ£ãã解決ããå¿ èŠããããŸããå°ãªããšãã²ãŒã ã¯åèµ·åããŸããããã¡ãããåã¹ãªããã®åŸã«åèµ·åããªãæ¹ãè¯ãã®ã§ãã¢ããªã±ãŒã·ã§ã³ã®èµ·å以éã«çµéããæéã䜿çšããããšã¯ã§ããŸããã
第äžã«ãç¶æ³ã¯äœããã®çç±ã§ãäžéšã®ããã°ã©ããŒã«ãšã£ãŠç解ããããåé¡ã§ãããããã«å¯Ÿããæ£ãã解決çããããŸãïŒæäœã¯ãµãŒããŒæéã§ã¯çµ¶å¯Ÿã«å®è¡ã§ããŸãããããšãã°ãçç£ã®èŠæ±ããµãŒããŒã«å°çãããšãã«ååã®çç£ãéå§ããŸãããããªããã°ã決å®è«ã«å¥ããåããè³ãã¯ãªãã¯ããããšãæ¢ã«å¯èœãã©ããã«ã€ããŠã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ç°ãªãæèŠã«ãã£ãŠåŒãèµ·ãããã1æ¥ããã35,000ã®éåæããã£ããããŸããæ£ãã決å®ã¯ãããŒã ãå®è¡ãããæéã«é¢ããæ å ±ãèšé²ããããšã§ãããµãŒããŒã¯ãçŸåšã®ãµãŒããŒæéãšã³ãã³ãå ã®æéãšã®æå·®ãèš±å¯ãããééå ã«åãŸã£ãŠãããã©ããã確èªãã蚱容ç¯å²å ã«ããå Žåã¯ãã¯ã©ã€ã¢ã³ãã宣èšããæéã䜿çšããŠäžéšã§ã³ãã³ããå®è¡ããŸãã
ã€ã³ã¿ãã¥ãŒã®å¥ã®ã¿ã¹ã¯ïŒã¯ã©ã€ã¢ã³ããåèµ·åãè©Šã¿ãã¿ã€ã ã¢ãŠã-30ç§ã蚱容ããããµãŒããŒæéå·®ã®å¶éã¯äœã§ããïŒãã³ãïŒ1ïŒééã¯å¯Ÿç§°ã§ã¯ãããŸããããã³ã2ïŒãã®ã»ã¯ã·ã§ã³ã®æåã®æ®µèœãããäžåºŠèªã¿çŽãããšããžå¹æã§1æ¥ããã3000ãšã©ãŒããã£ããããªãããã«ééã延é·ããæ¹æ³ãæå®ããŸãã
ãããçŸããæ£ããåäœããããã«ã¯ãã³ãã³ãåŒã³åºããã©ã¡ãŒã¿ãŒã«è¿œå ã®ãã©ã¡ãŒã¿ãŒãã€ãŸãåŒã³åºãæéãè¿œå ããããšããå§ãããŸãããã®ãããªãã®ïŒ
public interface Command { void Apply(ModelRoot root, long time); }
ã¡ãªã¿ã«ãç§ã®ã¢ããã€ã¹ã¯ãã¢ãã«ã®æéã«ãã€ãã£ãã®Unityã¿ã€ãã䜿çšããªãã§ãã ããã UnixTimeããµãŒããŒæéã«ä¿åããåžžã«äŸ¿å©ãªå€æã¡ãœãããçšæããå¿ èŠãããå ŽåãPValue <long>ãšã¯ç°ãªãç¹å¥ãªPTimeãã£ãŒã«ãã«ã¢ãã«ã«ä¿åããããšããå§ãããŸããJSONã«ãšã¯ã¹ããŒãããå Žåã¯ã importïŒäººéãèªãã圢åŒã®æéãããªãã¯ç§ã«åŸãããšãã§ããŸãããç§ã¯ããªãã«èŠåããŸããã
第4ã®ç¶æ³ïŒã²ãŒã ã®ç¶æ ã§ã¯ããã¬ãŒã€ãŒã®åå ãªãã«ããŒã ãéå§ããªããã°ãªããªãç¶æ³ããããŸããããšãã°ããšãã«ã®ãŒã®å埩ãªã©ã§ããå®éãéåžžã«äžè¬çãªç¶æ³ãç§ã¯ãã£ãŒã«ããæã¡ãããããã¯äŸ¿å©ã«ç·Žç¿ããŠããŸããããšãã°ãPTimeOutã§ã¯ãã³ãã³ããäœæããŠå®è¡ããå¿ èŠãããæç¹ãèšé²ã§ããŸããã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã
public class MyModel : Model { public static PTimeOut RESTORE_ENERGY = new PTimeOut() {command = (model, property) => new RestoreEnergyCommand() { model = model}} public long restoreEnergy { get { return RESTORE_ENERGY.Get(this); } set { RESTORE_ENERGY.Set(this, value); }} }
ãã¡ããããã¬ãŒã€ãŒã®åæããŒãäžã«ããµãŒããŒã¯æåã«ããããã¹ãŠã®ã³ãã³ãã®äœæãšå®è¡ãåŒãèµ·ããããããããã¬ãŒã€ãŒã«ç¶æ ãäžããå¿ èŠããããŸããããã§ã®èœãšãç©Žã¯ããã®ãã¹ãŠããã®éã«ãã¬ãŒã€ãŒãåãåãå¯èœæ§ã®ããéç¥ã劚害ããããšã§æåã§ãããããã£ãŠãã³ãã³ãã®æãåæã«ãã«ããå¿ èŠãããå Žåã¯ãæåã®éç¥ã®æå»ã®åã«ãŸãæéãç·©ãã次ã«éç¥èªäœããã³ãã³ããäœæãã次ã®éç¥ãŸã§æéãç·©ããŠããããå®è¡ããå¿ èŠããããŸãããã®å šäœã®äŒæ¥ããµãŒããŒã®ã¿ã€ã ã¢ãŠãã«åãŸããªãå Žåãããã³ãã¬ãŒã€ãŒãéç¥ã§ãã£ã±ãã«ãªã£ãå Žåã«ãããå¯èœã§ããã°ãçŸåšã®ç¶æ ãã¡ã¢ãªããããŒã¿ããŒã¹ã«æžã蟌ã¿ã代ããã«ã¯ã©ã€ã¢ã³ãã«åæ¥ç¶ããã³ãã³ãã§å¿çããŸãã
ãããã®ã³ãã³ãã¯ãã¹ãŠãäœæããŠå®è¡ã«å¿ èŠãªãã®ã«ã€ããŠäœããã®æ¹æ³ã§åŠç¿ããå¿ èŠããããŸããç§ã®å°ãæŸèæã§ããã䟿å©ãªè§£æ±ºçã¯ãã¢ãã«ã«ãã1ã€ã®èª²é¡ãããããšã§ããããã¯ãã¢ãã«ã®éå±€å šäœã移åããåã³ãã³ããå®è¡ãããåŸãã¿ã€ããŒã§ãäœåããŸãããã¡ãããããã¯ã»ãšãã©æŽæ°ã§ããªãŒãæ©ãåãäœåãªãªãŒããŒãããã§ãã代ããã«ããã®ãã£ãŒã«ããå€æŽãããã³ã«ã²ãŒã ç¶æ ããçªãåºãcurrentTimeã€ãã³ãããµãã¹ã¯ã©ã€ããŸãã¯ãµãã¹ã¯ã©ã€ã解é€ã§ããŸãã
public partial class Model { public void SetCurrentTime(long time); } vs public partial class RootModel { public event Action<long> setCurrentTime; }
ããã¯è¯ãããšã§ãããåé¡ã¯ãã¢ãã«ããªãŒããæ°žä¹ ã«åé€ããããã®ãããªãã£ãŒã«ããå«ãã¢ãã«ã¯ãã®ã€ãã³ãã«ãµãã¹ã¯ã©ã€ãããããŸãŸã§ãããæ£ããåäœããå¿ èŠãããããšã§ããã³ãã³ããéä¿¡ããåã«ããããããŸã ããªãŒå ã«ããããã®ã€ãã³ããŸãã¯å¶åŸ¡ã®å転ã«åŒ±ããªã³ã¯ãæã£ãŠãããã©ããã確èªããŸããããã«ãããGCã«ã¢ã¯ã»ã¹ã§ããªããªãããšã¯ãããŸããã
ä»é²1ãå®ç掻ããåãããå žåçãªã±ãŒã¹
ã³ã¡ã³ãããæåã®éšåã«ç§»ããŸããããã¡ãã§ã¯ãéåžžã«å€ãã®å Žåãã¢ãã«ãžã®ã³ãã³ãã®çŽåŸã§ã¯ãªããäœããã®ã¢ãã¡ãŒã·ã§ã³ã®æåŸã«ããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ãããŸããç§ãã¡ã®å®è·µã§ã¯ããã¹ããªãŒããã¯ã¹ãéããããªã±ãŒã¹ããããŸããããã¡ãããã¢ãã¡ãŒã·ã§ã³ãæåŸãŸã§åçããããšãã«ã®ã¿ãéãå€ããã¯ãã§ããç§ãã¡ã®éçºè ã®1人ã¯ã圌ã®äººçãç°¡çŽ åããããšã決å®ããã³ãã³ãã§å€ãå€æŽããããµãŒããŒã«åœŒãå€æŽããããšãäŒããã¢ãã¡ãŒã·ã§ã³ã®æåŸã«ã³ãŒã«ããã¯ãå®è¡ããã¢ãã«ã®å€ãç®çã®å€ã«ä¿®æ£ããŸããäžèšã§èšãã°ãããã§ããŸããã圌ã¯2é±éãããã®äžæè°ãªç®±ãäœãããã®åŸã圌ã®æŽ»åã®çµæãšããŠè¡šé¢åãã3ã€ã®ãã£ãããã«ãããã¹ãèŠã€ããŸããããããŠããéåžžã®æžãæããã®æéã¯ãã¡ããã§ããã誰ã匷調ã§ããŸããã§ãããããããé®®ããã«ç¶ãçµè«ã¯ãæåãããã¹ãŠãéåžžã®åå¿æ§ã§è¡ãæ¹ãè¯ããšããããšã ãšæããŸãã
ã ãããç§ã®æ±ºå®ã¯ãã®ãããªãã®ã§ãããã¡ããããéã¯å¥ã®ãã£ãŒã«ãã«ããã®ã§ã¯ãªããã€ã³ãã³ããªèŸæžã®ãªããžã§ã¯ãã®1ã€ã§ãããããã¯ä»ã®ãšããããã»ã©éèŠã§ã¯ãããŸãããã¢ãã«ã«ã¯ããµãŒããŒã«ãã£ãŠãã§ãã¯ãããããã«åºã¥ããŠããžãã¹ããžãã¯ãæ©èœããéšåãšãã¯ã©ã€ã¢ã³ãäžã«ã®ã¿ååšããéšåããããŸããã¡ã€ã³ã¢ãã«ã®ãéã¯ã決å®ãè¡ããããšããã«çºçãããé 延衚瀺ããªã¹ãã®2çªç®ã®éšåã§ã¯ããã®å€èŠ³ã®äºå®ã«ãã£ãŠã¢ãã¡ãŒã·ã§ã³ãéå§ããã®ãšåãéã®èŠçŽ ãäœæãããã¢ãã¡ãŒã·ã§ã³ãçµäºãããšããã®èŠçŽ ãåé€ããã³ãã³ããèµ·åãããŸãããã®ãããªçŽç²ãªã¯ã©ã€ã¢ã³ãã®ã¡ã¢ã¯ãããŸã ãã®éé¡ã衚瀺ããŸããããŸããå®éã®ãã£ãŒã«ãã§ã¯ããã£ãŒã«ãã®å€ã ãã§ãªãããã£ãŒã«ãã®å€ãããã¹ãŠã®ã¯ã©ã€ã¢ã³ã延æãå·®ãåŒããå€ã衚瀺ãããŸããã¡ããã©ãã®ãããª2ã€ã®ããŒã ãžã®åå²ãè¡ãããã®ã¯ãã¯ã©ã€ã¢ã³ããæåã®ããŒã ã®åŸã§ãªããŒããã2çªç®ã®ããŒã ã®åã«ãã¬ãŒã€ãŒãåãåã£ããã¹ãŠã®ãéãããŒã¯ãäŸå€ãªãã§åœŒã®ã¢ã«ãŠã³ãã«å ¥ãã°ã©ããªãã§ãããã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã
public class OpenMisterBox : Command { public BoxItemModel item; public int slot; // , . public override void Apply(GameState state) { state.inventory[item.revardKey] += item.revardCount; } // . public override void Apply(GameState state) { var cause = state.NewPersistent<WaitForCommand>(); cause.key = item.key; cause.value = item.value; state.ui.delayedInventoryVisualization.Add(cause); state.ui.mysteryBoxScreen.animations.Add(new Animation() {cause = item, slot = slot})); } } public class MysteryBoxView : View { /* ... */ public override void ConnectModel(MysteryBoxScreenModel model, List<Control> c) { model.Get(c, MysteryBoxScreenModel.ANIMATIONS) .Control(c, onAdd = item => animationFactory(item, OnComleteOrAbort => { AsincQueue(new RemoveAnimation() {cause = item.cause, animation = item}) }), onRemove = item => {} ) } } public class InventoryView : View<InventoryItem> { public Text text; public override void ConnectModel(InventoryItem model, List<Control> c) { model.GameState.ui.Get(c, UIModel.DELAYED_INVENTORY_VISUALIZATION). .Where(c, item => item.key == model.key) .Expression(c, onChange = (IList<InventoryItem> list) => { int sum = 0; for (int i = 0; i < list.Count; i++) sum += list[i].value; return sum; }, onAdd = null, onRemove = null ) // .Join (c, model.GameState.Get(GameState.INVENTORY).ItemByKey(model.key)) .Expression(c, (delay, count) => count - delay) .SetText(c, text); // , , , , , , : model.inventory.CreateVisibleInventoryItemCount(c, model.key).SetText(c, text); } } public class RemoveDelayedInventoryVisualization : Command { public DelayCauseModel cause; public override void Apply(GameState state) { state.ui.delayedInventoryVisualization.Remove(cause); } } public class RemoveAnimation : RemoveDelayedInventoryVisualization { public Animation animation public override void Apply(GameState state) { base.Apply(state); state.ui.mysteryBoxScreen.animations.Remove(animation); } }
æåŸã«äœããããŸããïŒ 2ã€ã®ãã¥ãŒãããããã®ãã¡ã®1ã€ã§ããã€ãã®ã¢ãã¡ãŒã·ã§ã³ãåçããããã®çµããã¯ãéãå®å šã«ç°ãªããã¥ãŒã§è¡šç€ºãããã®ãåŸ ã£ãŠããŸãããã¹ãŠãåå¿çã§ãããã€ã§ãGameStateã®å®å šãªç¶æ ãã²ãŒã ã«èªã¿èŸŒãããšãã§ããã¢ãã¡ãŒã·ã§ã³ã®éå§ãå«ããäžæãããšããããæ£ç¢ºã«ãã¬ã€ãéå§ããŸããã¢ãã¡ãŒã·ã§ã³ã¹ããŒãžã¯æ¶å»ããªããããçå®ã¯æåããå§ãŸããŸãããæ¬åœã«å¿ èŠãªå Žåã¯æ¶å»ããããšãã§ããŸãã
åèš
ã¢ãã«ãã³ãã³ããéçãã¡ã€ã«ãã«ãŒã«ã§ã²ãŒã ã®ããžãã¹ããžãã¯ãäœæããçŸãã詳现ã§èªåçæããããã°ã§ããããã©ããããæ°ããæ©èœãèŠãããã°ã©ããŒãç¯ããå€ãã®å žåçãªãã¹ã®æçãªå®è¡ãå²ã¿ãŸããçœãå ãããã¯ãæ°ããæ©èœãæ°åéãç»é²ã§ããããã§ããæ°ããæ©èœã®ããŠã³ããŒããšãããã°ãç°¡åãªå Žåãã²ãŒã ãã¶ã€ããŒã¯åãããã°ã©ããŒã䜿çšããŠã²ãŒã ãã¶ã€ã³ã®å®éšãæ°åè¡ãããšãã§ãããããããã¯éåžžã«éèŠã§ããç§ãã¡ã®ä»äºã«æ¬æãæã£ãŠãã²ãŒã ã倱æãããã©ããã¯ç§ãã¡æ¬¡ç¬¬ã§ããããããå°æãããã©ããã¯gamedismsã«äŸåããå®éšã®ããã«ã¹ããŒã¹ãäžããå¿ èŠããããŸãã
ãããŠä»ãç§ã«ãšã£ãŠéåžžã«éèŠãªè³ªåã«çãããããé¡ãããŸããããªããç§ãäžæã«ããããšãããæ¹æ³ã«ã€ããŠã®ã¢ã€ãã¢ãæã£ãŠããããç§ã®çãã«ã³ã¡ã³ããããå Žåãç§ã¯ã³ã¡ã³ãã§ããªããåŸ ã£ãŠããŸããå€æ°ã®æ§æãšã©ãŒã«é¢ããååãšæ瀺ã®ææ¡ã¯ãPMã§ãé¡ãããŸãã