ããã«ã¡ã¯ãç§ã¯ Pixonic ã®ãµãŒããŒéçºè
ãNikita Brizhak ã§ãã ä»æ¥ã¯ã¢ãã€ã«ãã«ããã¬ã€ã€ãŒã«ãããã©ã°ã®è£æ£ã«ã€ããŠã話ããããšæããŸãã
ãµãŒããŒã©ã°ã®è£åã«ã€ããŠã¯ããã·ã¢èªãå«ãå€ãã®èšäºãæžãããŠããŸãã ãã®ãã¯ãããžãŒã¯ 90 幎代åŸåãããã«ããã¬ã€ã€ãŒ FPS ã®äœæã«ç©æ¥µçã«äœ¿çšãããŠãããããããã¯é©ãã¹ãããšã§ã¯ãããŸããã ããšãã°ãæåã«äœ¿çšãããã®ã® XNUMX ã€ã§ãã QuakeWorld MOD ãæãåºãããšãã§ããŸãã
ã¢ãã€ã« ãã«ããã¬ã€ã€ãŒ ã·ã¥ãŒã¿ãŒ Dino Squad ã§ã䜿çšããŠããŸãã
ãã®èšäºã§ã®ç§ã®ç®æšã¯ããã§ã«äœååãæžãããŠããããšãç¹°ãè¿ãããšã§ã¯ãªãããã¯ãããžãŒ ã¹ã¿ãã¯ãšã³ã¢ ã²ãŒã ãã¬ã€æ©èœãèæ
®ããŠãã²ãŒã ã«ã©ã°è£æ£ãã©ã®ããã«å®è£
ãããã説æããããšã§ãã
ç§ãã¡ã®å€§è³ç®è³ªãšãã¯ãããžãŒã«ã€ããŠå°ãã話ããŸãã
Dino Squad ã¯ãããã¯ãŒã¯ ã¢ãã€ã« PvP ã·ã¥ãŒãã£ã³ã° ã²ãŒã ã§ãã ãã¬ã€ã€ãŒã¯ããŸããŸãªæŠåšãè£ åããæç«ãæäœãã6察6ã®ããŒã ã§æŠããŸãã
ã¯ã©ã€ã¢ã³ããšãµãŒããŒã¯äž¡æ¹ãšã Unity ã«åºã¥ããŠããŸãã ã¢ãŒããã¯ãã£ã¯ã·ã¥ãŒãã£ã³ã°ã²ãŒã ã«ãšã£ãŠéåžžã«å€å žçã§ãããµãŒããŒã¯æš©åšäž»çŸ©çã§ãã¯ã©ã€ã¢ã³ãäºæž¬ã¯ã¯ã©ã€ã¢ã³ãäžã§æ©èœããŸãã ã²ãŒã ã·ãã¥ã¬ãŒã·ã§ã³ã¯ç€Ÿå ECS ã䜿çšããŠäœæããããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ã§äœ¿çšãããŸãã
ã©ã°è£æ£ã«ã€ããŠåããŠèããå Žåã¯ããã®åé¡ã«ã€ããŠç°¡åã«èª¬æããŸãã
ãã«ããã¬ã€ã€ãŒ FPS ã²ãŒã ã§ã¯ãéåžžãè©Šåã¯ãªã¢ãŒã ãµãŒããŒäžã§ã·ãã¥ã¬ãŒããããŸãã ãã¬ã€ã€ãŒã¯å ¥å (æŒãããããŒã«é¢ããæ å ±) ããµãŒããŒã«éä¿¡ããããã«å¿çããŠãµãŒããŒã¯ãåä¿¡ããããŒã¿ãèæ ®ããŠæŽæ°ãããã²ãŒã ç¶æ ããã¬ã€ã€ãŒã«éä¿¡ããŸãã ãã®ã€ã³ã¿ã©ã¯ã·ã§ã³ ã¹ããŒã ã§ã¯ãåé²ããŒãæŒããŠãããã¬ã€ã€ãŒ ãã£ã©ã¯ã¿ãŒãç»é¢äžã§ç§»åããç¬éãŸã§ã®é 延ã¯åžžã« ping ãã倧ãããªããŸãã
ããŒã«ã« ãããã¯ãŒã¯ã§ã¯ããã®é 延 (äžè¬ã«å ¥åã©ã°ãšåŒã°ããŸã) ã¯ç®ç«ããªããããããŸããããã€ã³ã¿ãŒãããçµç±ã§ãã¬ã€ããå Žåããã£ã©ã¯ã¿ãŒãå¶åŸ¡ãããšãã«ãæ°·ã®äžãæ»ã£ãŠããããããªæèŠãçããŸãã ãã®åé¡ã¯ã¢ãã€ã« ãããã¯ãŒã¯ã«ãäºéã«é¢ä¿ããŠããããã¬ãŒã€ãŒã® ping ã 200 ããªç§ã®å Žåã§ãäŸç¶ãšããŠåªããæ¥ç¶ãšã¿ãªãããŸãã å€ãã®å Žåãping 㯠350ã500ããŸã㯠1000 ããªç§ã«ãªããŸãã ãããªããšãå ¥åã©ã°ã®ããé«éã·ã¥ãŒãã£ã³ã°ã²ãŒã ããã¬ã€ããããšã¯ã»ãšãã©äžå¯èœã«ãªããŸãã
ãã®åé¡ã®è§£æ±ºçã¯ãã¯ã©ã€ã¢ã³ãåŽã®ã·ãã¥ã¬ãŒã·ã§ã³äºæž¬ã§ãã ããã§ã¯ããµãŒããŒããã®å¿çãåŸ ããã«ãã¯ã©ã€ã¢ã³ãèªäœãå ¥åããã¬ã€ã€ãŒ ãã£ã©ã¯ã¿ãŒã«é©çšããŸãã ãããŠãçããåãåããšãåçŽã«çµæãæ¯èŒããçžæã®äœçœ®ãæŽæ°ããŸãã ãã®å ŽåãããŒãæŒããŠããçµæãç»é¢ã«è¡šç€ºããããŸã§ã®é 延ã¯æå°éã§ãã
ããã§ã®ãã¥ã¢ã³ã¹ãç解ããããšãéèŠã§ããã¯ã©ã€ã¢ã³ãã¯åžžã«æåŸã®å
¥åã«åŸã£ãŠèªåèªèº«ãæç»ãããµãŒããŒããã®ããŒã¿ã®ä»¥åã®ç¶æ
ã«åŸã£ãŠãããã¯ãŒã¯é
延ã䌎ã£ãŠæµãæç»ããŸãã ã€ãŸããæµãæã€ãšãããã¬ã€ã€ãŒã¯èªåèªèº«ãšæ¯èŒããŠéå»ã®æµãèŠãããšã«ãªããŸãã ã¯ã©ã€ã¢ã³ãäºæž¬ã®è©³çŽ°
ãããã£ãŠãã¯ã©ã€ã¢ã³ãäºæž¬ã¯ XNUMX ã€ã®åé¡ã解決ããŸãããå¥ã®åé¡ãçºçããŸãããã¬ã€ã€ãŒãéå»ã«æµãããå°ç¹ã§å°æããå ŽåããµãŒããŒäžã§åãå°ç¹ã§å°æãããšãæµã¯ãã®å Žæã«ããªãå¯èœæ§ããããŸãã ãµãŒããŒé 延è£æ£ã¯ããã®åé¡ã®è§£æ±ºãè©Šã¿ãŸãã æŠåšãçºç ²ããããšããµãŒããŒã¯ãã¬ã€ã€ãŒãçºç ²æã«ããŒã«ã«ã§èŠãã²ãŒã ç¶æ ã埩å ããæ¬åœã«æµã«åœäžã§ãããã©ããã確èªããŸãã çãããã¯ããã®å Žåããã®æç¹ã§æµããµãŒããŒäžã«ããªãå Žåã§ãããããã¯ã«ãŠã³ããããŸãã
ãã®ç¥èãããšã«ãç§ãã¡ã¯ Dino Squad ã§ãµãŒããŒã©ã°è£æ£ã®å®è£ ãéå§ããŸããã ãŸã第äžã«ãã¯ã©ã€ã¢ã³ããèŠããã®ããµãŒããŒäžã§åŸ©å ããæ¹æ³ãç解ããå¿ èŠããããŸããã ãããŠãå ·äœçã«äœã埩å ããå¿ èŠãããã®ã§ãããã? ç§ãã¡ã®ã²ãŒã ã§ã¯ãæŠåšãã¢ããªãã£ããã®ãããã¯ã¬ã€ãã£ã¹ããšãªãŒããŒã¬ã€ãã€ãŸãæµã®ç©ççãªã³ã©ã€ããŒãšã®çžäºäœçšãéããŠèšç®ãããŸãã ãããã£ãŠããã¬ã€ã€ãŒãããŒã«ã«ã§ãèŠãããããã®ã³ã©ã€ããŒã®äœçœ®ããµãŒããŒäžã§åçŸããå¿ èŠããããŸããã åœæ㯠Unity ããŒãžã§ã³ 2018.x ã䜿çšããŠããŸããã ããã§ã®ç©ç API ã¯éçã§ãããç©çäžçã¯åäžã®ã³ããŒã®äžã«ååšããŸãã ç¶æ ãä¿åããŠãç®±ãã埩å ããæ¹æ³ã¯ãããŸããã ãããäœãããã°ããã®ïŒ
解決çã¯è¡šé¢äžã«ããããã®ãã¹ãŠã®èŠçŽ ã¯ä»ã®åé¡ã解決ããããã«ãã§ã«äœ¿çšãããŠããŸããã
- åã¯ã©ã€ã¢ã³ãã«ã€ããŠãããŒãæŒãããšãã«å¯ŸæŠçžæãèŠãæå»ãç¥ãå¿ èŠããããŸãã ãã®æ å ±ã¯ãã§ã«å ¥åããã±ãŒãžã«æžã蟌ãŸããŠãããããã䜿çšããŠã¯ã©ã€ã¢ã³ãã®äºæž¬ã調æŽããŠããŸãã
- ã²ãŒã ç¶æ
ã®å±¥æŽãä¿åã§ããå¿
èŠããããŸãã ãã®äžã§ãç§ãã¡ã¯å¯ŸæŠçžæïŒãããã£ãŠåœŒãã®è¡çªè
ïŒã®äœçœ®ãä¿æããŸãã ãµãŒããŒäžã«ã¯ãã§ã«ç¶æ
å±¥æŽããããããã䜿çšããŠãã«ãããŸãã
ãã«ã¿ ã é©åãªææãç¥ãããšã§ãæŽå²ã®äžã§é©åãªç¶æ ãç°¡åã«èŠã€ããããšãã§ããŸãã - å±¥æŽããã²ãŒã ã®ç¶æ ãååŸããã®ã§ããã¬ãŒã€ãŒã®ããŒã¿ãç©çäžçã®ç¶æ ãšåæã§ããããã«ããå¿ èŠããããŸãã æ¢åã®ã³ã©ã€ã㌠- 移åãäžè¶³ããŠããã³ã©ã€ã㌠- äœæãäžèŠãªã³ã©ã€ã㌠- ç Žå£ã ãã®ããžãã¯ããã§ã«äœæãããŠãããããã€ãã® ECS ã·ã¹ãã ã§æ§æãããŠããŸãã ããã䜿çšããŠãXNUMX ã€ã® Unity ããã»ã¹ã§è€æ°ã®ã²ãŒã ã«ãŒã ãä¿æããŸããã ãŸããç©çäžçã¯ããã»ã¹ããšã« XNUMX ã€ã§ãããããéšå±éã§åå©çšããå¿ èŠããããŸããã ã·ãã¥ã¬ãŒã·ã§ã³ã®åãã£ãã¯ã®åã«ãç©çäžçã®ç¶æ ãããªã»ãããããçŸåšã®ã«ãŒã ã®ããŒã¿ã§ååæåããè³¢ãããŒãªã³ã° ã·ã¹ãã ãéã㊠Unity ã²ãŒã ãªããžã§ã¯ããå¯èœãªéãåå©çšããããšããŸããã æ®ã£ãŠããã®ã¯ãéå»ã®ã²ãŒã ç¶æ ã«å¯ŸããŠåãããžãã¯ãåŒã³åºãããšã ãã§ãã
ããããã¹ãŠã®èŠçŽ ãçµã¿åãããããšã§ãç©çäžçã®ç¶æ ãé©åãªç¬éã«ããŒã«ããã¯ã§ãããã¿ã€ã ãã·ã³ããå®æããŸããã ã³ãŒãã¯åçŽã§ããããšãããããŸããã
public class TimeMachine : ITimeMachine
{
//ÐÑÑПÑÐžÑ ÐžÐ³ÑПвÑÑ
ÑПÑÑПÑМОй
private readonly IGameStateHistory _history;
//ТекÑÑее ОгÑПвПе ÑПÑÑПÑМОе Ма ÑеÑвеÑе
private readonly ExecutableSystem[] _systems;
//ÐÐ°Ð±ÐŸÑ ÑОÑÑеЌ, ÑаÑÑÑавлÑÑÑОÑ
кПллайЎеÑÑ Ð² ÑОзОÑеÑкПЌ ЌОÑе
//пП ЎаММÑÐŒ Оз ОгÑПвПгП ÑПÑÑПÑМОÑ
private readonly GameState _presentState;
public TimeMachine(IGameStateHistory history, GameState presentState, ExecutableSystem[] timeInitSystems)
{
_history = history;
_presentState = presentState;
_systems = timeInitSystems;
}
public GameState TravelToTime(int tick)
{
var pastState = tick == _presentState.Time ? _presentState : _history.Get(tick);
foreach (var system in _systems)
{
system.Execute(pastState);
}
return pastState;
}
}
æ®ã£ãŠããã®ã¯ããã®ãã·ã³ã䜿çšããŠã·ã§ãããšèœåãç°¡åã«è£ãæ¹æ³ãèŠã€ããããšã ãã§ããã
æãåçŽãªã±ãŒã¹ã§ã¯ãã¡ã«ããºã ã XNUMX åã®ãããã¹ãã£ã³ã«åºã¥ããŠããå Žåããã¹ãŠãæ確ã§ããããã«èŠããŸãããã¬ã€ã€ãŒã¯å°æããåã«ãç©çäžçãæãŸããç¶æ ã«ããŒã«ããã¯ããã¬ã€ãã£ã¹ããå®è¡ããããããŸãã¯ãã¹ãã«ãŠã³ãããå¿ èŠããããŸããäžçãåæç¶æ ã«æ»ãã
ããããDino Squad ã«ã¯ãã®ãããªã¡ã«ããã¯ã¯ã»ãšãã©ããŸããã ã²ãŒã å ã®ã»ãšãã©ã®æŠåšã¯çºå°äœãã€ãŸãã·ãã¥ã¬ãŒã·ã§ã³æ°ãã£ã㯠(å Žåã«ãã£ãŠã¯æ°åãã£ãã¯) ã®éé£è¡ããé·å¯¿åœã®åŒŸäžžãäœæããŸãã 圌ããã©ãããããäœæã«é£è¡æ©ã«ä¹ãã¹ããïŒ
Ð
ç§ãã¡ã«ã¯ãã®ãªãã·ã§ã³ã¯ãããŸããã§ãããçºå°ç©ããŒã¹ã®æŠåšã¯ã²ãŒã ãã¶ã€ã³ã®éèŠãªç¹åŸŽã§ããã ããã§ãäœããèãåºãå¿ èŠããããŸããã ãã¬ãŒã³ã¹ããŒãã³ã°ãè¡ã£ãåŸãæ©èœãããšæããã XNUMX ã€ã®ãªãã·ã§ã³ãçå®ããŸããã
1. çºå°ç©ãããããäœæãããã¬ã€ã€ãŒã®æéã«é¢é£ä»ããŸãã ãµãŒã㌠ã·ãã¥ã¬ãŒã·ã§ã³ã®ãã£ãã¯ããšããã¹ãŠã®ãã¬ãŒã€ãŒã®åŒŸäžžããšã«ãç©çäžçãã¯ã©ã€ã¢ã³ãç¶æ ã«ããŒã«ããã¯ããå¿ èŠãªèšç®ãå®è¡ããŸãã ãã®ã¢ãããŒãã«ããããµãŒããŒäžã®è² è·ãåæ£ããçºå°äœã®é£è¡æéãäºæž¬ã§ããããã«ãªããŸããã æµã®çºå°ç©ãå«ããã¹ãŠã®çºå°ç©ãã¯ã©ã€ã¢ã³ãäžã§äºæž¬ããããããäºæž¬å¯èœæ§ã¯ç§ãã¡ã«ãšã£ãŠç¹ã«éèŠã§ããã
ãã®å³ã§ã¯ããã£ã㯠30 ã®ãã¬ã€ã€ãŒã¯ãäºæž¬ããŠããµã€ã«ãçºå°ããŸãã圌ã¯ãæµãã©ã®æ¹åã«èµ°ã£ãŠãããã確èªããããµã€ã«ã®ããããã®é床ãç¥ã£ãŠããŸãã ããŒã«ã«ã§ã¯ã33 ãã£ãã¯ç®ã«ã¿ãŒã²ããã«å°éããããšãããããŸãã ã©ã°è£æ£ã®ãããã§ãµãŒããŒäžã«ã衚瀺ãããŸã
2. æåã®ãªãã·ã§ã³ãšåãããã«ãã¹ãŠãè¡ããŸããã匟䞞ã·ãã¥ã¬ãŒã·ã§ã³ã® XNUMX ãã£ãã¯ãæ°ããåŸãåæ¢ãããåããµãŒã㌠ãã£ãã¯å ã§é£è¡ã®ã·ãã¥ã¬ãŒã·ã§ã³ãç¶ç¶ãããã®ãã³ã«æéããµãŒããŒã«è¿ã¥ããŸãã XNUMX ã€ãã€ãã£ãã¯ããŠã³ã©ã€ããŒã®äœçœ®ãæŽæ°ããŸãã 次㮠XNUMX ã€ã®ãããããèµ·ãããŸã§ãããç¹°ãè¿ããŸãã
- 匟䞞ã®æå¹æéãåããŸããã ããã¯ãèšç®ãçµäºãããã¹ãŸãã¯ããããã«ãŠã³ãã§ããããšãæå³ããŸãã ãããŠããã¯ãã·ã§ãããçºå°ãããã®ãšåããã£ãã¯ã§ãã ç§ãã¡ã«ãšã£ãŠãããã¯ãã©ã¹ã§ããããã€ãã¹ã§ããããŸããã ãã©ã¹ã®ç¹ã¯ãå°æãã¬ã€ã€ãŒã«ãšã£ãŠãåœäžããŠããæµã®äœåãæžå°ãããŸã§ã®é 延ãå€§å¹ ã«ççž®ãããããã§ãã æ¬ ç¹ã¯ãæµããã¬ã€ã€ãŒã«çºç ²ãããšãã«ãåãå¹æã芳å¯ãããããšã§ããæµã¯é ããã±ãã匟ãçºç ²ããã ãã§ããã¡ãŒãžã¯ãã§ã«ã«ãŠã³ããããŠããããã«èŠããŸãã
- 匟䞞ã¯ãµãŒããŒæéã«éããŸããã ãã®å Žåãã·ãã¥ã¬ãŒã·ã§ã³ã¯é 延è£æ£ãªãã§æ¬¡ã®ãµãŒã㌠ãã£ãã¯ã§ç¶è¡ãããŸãã é ãçºå°äœã®å Žåãçè«çã«ã¯ãæåã®ãªãã·ã§ã³ãšæ¯èŒããŠç©çããŒã«ããã¯ã®æ°ãæžããããšãã§ããŸãã åæã«ãã·ãã¥ã¬ãŒã·ã§ã³ã«å¯Ÿããäžåäžãªè² è·ãå¢å ããŸããããµãŒããŒãã¢ã€ãã«ç¶æ ã§ãããããµãŒã㌠XNUMX ãã£ãã¯ã§æ°åã®åŒŸäžžã«å¯Ÿã㊠XNUMX ã®ã·ãã¥ã¬ãŒã·ã§ã³ ãã£ãã¯ãèšç®ããŠããŸããã
åã®å³ãšåãã·ããªãªã§ããã31 çªç®ã®ã¹ããŒã ã«åŸã£ãŠèšç®ãããŸãã ããµã€ã«ã¯çºå°ãšåããã£ãã¯ã§ãµãŒããŒæéã«ãè¿œãã€ããããããã¯æ¬¡ã®ãã£ãã¯ã§ã«ãŠã³ããããŸãã ãã®å ŽåãXNUMX ãã£ãã¯ç®ã§ã¯ãã©ã°è£æ£ã¯é©çšãããªããªããŸãã
ç§ãã¡ã®å®è£ ã§ã¯ãããã XNUMX ã€ã®ã¢ãããŒãã®éãã¯ãããæ°è¡ã®ã³ãŒãã§ãã£ããããäž¡æ¹ãäœæããé·ãé䞊è¡ããŠååšããŠããŸããã æŠåšã®ä»çµã¿ãšåŒŸäžžã®é床ã«å¿ããŠãæç«ããšã« XNUMX ã€ãŸãã¯å¥ã®ãªãã·ã§ã³ãéžæããŸããã ããã§ã®ã¿ãŒãã³ã°ãã€ã³ããšãªã£ãã®ãããââæéã«äœåºŠãæµãæ»æãããšââããŒãã¹ãããããããšãã£ãä»çµã¿ãã²ãŒã å ã«ç»å Žããããšã ã ãã¬ã€ã€ãŒãæµãæ»æããæéãéèŠãªåœ¹å²ãæããã¡ã«ããºã ã¯ãXNUMX çªç®ã®ã¢ãããŒãã§ã¯æ©èœããŸããã§ããã ãããã£ãŠãæçµçã«æåã®ãªãã·ã§ã³ãéžæããããšã«ãªãããããã²ãŒã å ã®ãã¹ãŠã®æŠåšãšãã¹ãŠã®ã¢ã¯ãã£ããªèœåã«é©çšãããããã«ãªããŸããã
ãããšã¯å¥ã«ãããã©ãŒãã³ã¹ã®åé¡ãæèµ·ãã䟡å€ããããŸãã ããã ãã§ç©äºãé ããªãã®ã§ã¯ãªãããšæã£ãŠãããªããç§ã¯ããçããŸãã Unity ã¯ãã³ã©ã€ããŒã®ç§»åããªã³/ãªãã®åãæ¿ããéåžžã«é ãã§ãã Dino Squad ã§ã¯ããææªã®ãå ŽåãæŠéäžã«æ°çŸã®çºå°äœãåæã«ååšããå¯èœæ§ããããŸãã ã³ã©ã€ããŒã移åããŠåçºå°äœãåå¥ã«ã«ãŠã³ãããã®ã¯ãæã®å±ããªãèŽ æ²¢ã§ãã ãããã£ãŠãç©ççãªãããŒã«ããã¯ãã®æ°ãæå°éã«æããããšã絶察ã«å¿ èŠã§ããã ãããè¡ãããã«ããã¬ãŒã€ãŒã®æéãèšé²ããå¥ã®ã³ã³ããŒãã³ãã ECS ã«äœæããŸããã ã©ã°è£æ£ãå¿ èŠãšãããã¹ãŠã®ãšã³ãã£ã㣠(çºå°ç©ãèœåãªã©) ã«è¿œå ããŸããã ãã®ãããªãšã³ãã£ãã£ã®åŠçãéå§ããåã«ããã®æç¹ãŸã§ã«ãšã³ãã£ãã£ãã¯ã©ã¹ã¿åããŠäžç·ã«åŠçããã¯ã©ã¹ã¿ããšã«ç©çäžçã XNUMX åããŒã«ããã¯ããŸãã
ãã®æ®µéã§ã¯ãã·ã¹ãã ã¯ã»ãŒåäœããããã«ãªããŸããã è¥å¹²ç°¡ç¥åãã圢åŒã®ã³ãŒã:
public sealed class LagCompensationSystemGroup : ExecutableSystem
{
//ÐаÑОМа вÑеЌеМО
private readonly ITimeMachine _timeMachine;
//ÐÐ°Ð±ÐŸÑ ÑОÑÑеЌ лагкПЌпеМÑаÑОО
private readonly LagCompensationSystem[] _systems;
//ÐаÑа ÑеалОзаÑÐžÑ ÐºÐ»Ð°ÑÑеÑОзаÑПÑа
private readonly TimeTravelMap _travelMap = new TimeTravelMap();
public LagCompensationSystemGroup(ITimeMachine timeMachine,
LagCompensationSystem[] lagCompensationSystems)
{
_timeMachine = timeMachine;
_systems = lagCompensationSystems;
}
public override void Execute(GameState gs)
{
//Ðа вÑ
ПЎ клаÑÑеÑОзаÑÐŸÑ Ð¿ÑÐžÐœÐžÐŒÐ°ÐµÑ ÑекÑÑее ОгÑПвПе ÑПÑÑПÑМОе,
//а Ма вÑÑ
ПЎ вÑÐŽÐ°ÐµÑ ÐœÐ°Ð±ÐŸÑ Â«ÐºÐŸÑзОМ». РкажЎПй кПÑзОМе Ð»ÐµÐ¶Ð°Ñ ÑÐœÑОÑО,
//кПÑПÑÑÐŒ ÐŽÐ»Ñ Ð»Ð°Ð³ÐºÐŸÐŒÐ¿ÐµÐœÑаÑОО ÐœÑжМП ПЎМП О ÑП же вÑÐµÐŒÑ ÐžÐ· ОÑÑПÑОО.
var buckets = _travelMap.RefillBuckets(gs);
for (int bucketIndex = 0; bucketIndex < buckets.Count; bucketIndex++)
{
ProcessBucket(gs, buckets[bucketIndex]);
}
//РкПМÑе лагкПЌпеМÑаÑОО ÐŒÑ Ð²ÐŸÑÑÑаМавлОваеЌ ÑОзОÑеÑкОй ЌОÑ
//в ОÑÑ
ПЎМПе ÑПÑÑПÑМОе
_timeMachine.TravelToTime(gs.Time);
}
private void ProcessBucket(GameState presentState, TimeTravelMap.Bucket bucket)
{
//ÐÑкаÑÑваеЌ вÑÐµÐŒÑ ÐŸÐŽÐžÐœ Ñаз ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ¹ кПÑзОМÑ
var pastState = _timeMachine.TravelToTime(bucket.Time);
foreach (var system in _systems)
{
system.PastState = pastState;
system.PresentState = presentState;
foreach (var entity in bucket)
{
system.Execute(entity);
}
}
}
}
æ®ã£ãŠããã®ã¯è©³çŽ°ãèšå®ããããšã ãã§ãã
1. æéå ã§ã®æ倧移åè·é¢ãã©ã®çšåºŠå¶éããããç解ããŸãã
ã¢ãã€ã« ãããã¯ãŒã¯ã貧匱ãªç¶æ³ã§ãã²ãŒã ã«ã§ããã ãã¢ã¯ã»ã¹ããããããã«ããããšãéèŠã ã£ãã®ã§ãããŒãžã³ã 30 ãã£ã㯠(ãã£ã㯠ã¬ãŒã㯠20 Hz) ãšããŠã¹ããŒãªãŒãå¶éããŸããã ããã«ããããã¬ã€ã€ãŒã¯éåžžã«é«ã ping ã§ã察æŠçžæãæ»æããããšãã§ããŸãã
2. ã©ã®ãªããžã§ã¯ããæéå ã«ç§»åã§ããããã©ã®ãªããžã§ã¯ãã移åã§ããªãããå€æããŸãã
ãã¡ãããç§ãã¡ã¯æµãåãããŠããŸãã ããããããšãã°ãèšçœ®å¯èœãªãšãã«ã®ãŒã·ãŒã«ãã¯ããã§ã¯ãããŸããã ãªã³ã©ã€ã³ã·ã¥ãŒãã£ã³ã°ã§ããããããã«ãé²åŸ¡åãåªå ããæ¹ãè¯ããšå€æããŸããã ãã¬ã€ã€ãŒãçŸåšãã§ã«ã·ãŒã«ããé 眮ããŠããå Žåãã©ã°è£æ£ãããéå»ã®åŒŸäžžãã·ãŒã«ããééããããšã¯ãããŸããã
3. åã¿ã€ãã尻尟æ»æãªã©ãæç«ã®èœåãè£ãå¿ èŠããããã©ããã決å®ããŸããå¿ èŠãªãã®ã決å®ãã匟䞞ãšåãã«ãŒã«ã«åŸã£ãŠåŠçããŸãã
4. ã©ã°è£æ£ãå®è¡ãããŠãããã¬ãŒã€ãŒã®ã³ã©ã€ããŒãã©ããããã決å®ããŸãã è¯ãæå³ã§ããã¬ã€ã€ãŒã®ç«å Žã¯éå»ã«ç§»ãã¹ãã§ã¯ãããŸããããã¬ã€ã€ãŒã¯ãçŸåšãµãŒããŒã«ããã®ãšåãæéã§èªåèªèº«ãèŠãå¿ èŠããããŸãã ãã ããå°æãã¬ã€ã€ãŒã®ã³ã©ã€ããŒãããŒã«ããã¯ããŸããããã«ã¯ããã€ãã®çç±ããããŸãã
ãŸããã¯ã©ã¹ã¿ãªã³ã°ãæ¹åãããŸããping ãè¿ããã¹ãŠã®ãã¬ãŒã€ãŒã«åãç©çç¶æ ã䜿çšã§ããŸãã
次ã«ããã¹ãŠã®ã¬ã€ãã£ã¹ããšãªãŒããŒã©ããã§ã¯ãã¢ããªãã£ãŸãã¯çºå°ç©ãææãããã¬ã€ã€ãŒã®ã³ã©ã€ããŒãåžžã«é€å€ããŸãã Dino Squad ã§ã¯ããã¬ã€ã€ãŒã¯æç«ãæäœããŸããæç«ã¯ãã·ã¥ãŒãã£ã³ã°ã²ãŒã ã®åºæºãããããšããªãéæšæºçãªåœ¢ç¶ãããŠããŸãã ããšããã¬ã€ã€ãŒãç°åžžãªè§åºŠã§å°æãã匟䞞ã®è»éããã¬ã€ã€ãŒã®æç«ã³ã©ã€ããŒãééãããšããŠãã匟䞞ã¯ãããç¡èŠããŸãã
第äžã«ãã©ã°è£æ£ãéå§ãããåã§ãã£ãŠããECS ããã®ããŒã¿ã䜿çšããŠæç«ã®æŠåšã®äœçœ®ãèœåã®é©çšç¹ãèšç®ããŸãã
ãã®çµæãã©ã°ãè£æ£ããããã¬ãŒã€ãŒã®ã³ã©ã€ããŒã®å®éã®äœçœ®ã¯ç§ãã¡ã«ãšã£ãŠéèŠã§ã¯ãªããããããçç£çã§ãããšåæã«ããåçŽãªæ¹æ³ãæ¡çšããŸããã
ãããã¯ãŒã¯é 延ã¯åçŽã«é€å»ããããšã¯ã§ããããã¹ã¯ããããšããã§ããŸããã ä»ã®åœè£ æ¹æ³ãšåæ§ããµãŒããŒã©ã°ã®è£åã«ããã¬ãŒããªãããããŸãã æããããã¬ã€ã€ãŒãç ç²ã«ããŠãæã€ãã¬ã€ã€ãŒã®ã²ãŒã äœéšãåäžãããŸãã ããããDino Squad ã«ãšã£ãŠãããã§ã®éžæã¯æçœã§ããã
ãã¡ãããããã°ã©ããŒãšã²ãŒã ãã¶ã€ããŒã®äž¡æ¹ã«ãšã£ãŠããµãŒã㌠ã³ãŒãå šäœã®è€éãã®å¢å€§ã«ãã£ãŠãããããã¹ãŠã®ä»£åãæ¯æããªããã°ãªããŸããã§ããã 以åã®ã·ãã¥ã¬ãŒã·ã§ã³ãã·ã¹ãã ã®åçŽãªé£ç¶åŒã³åºãã§ãã£ãå Žåãã©ã°è£æ£ã«ãããå ¥ãåã«ãªã£ãã«ãŒããšåå²ãã·ãã¥ã¬ãŒã·ã§ã³ã«è¡šç€ºãããŸãã ãŸããæäœã䟿å©ã«ããããã«å€å€§ãªåŽåãè²»ãããŸããã
2019 ããŒãžã§ã³ (ããããããããå°ãå) ã§ã¯ãUnity ã¯ç¬ç«ããç©çã·ãŒã³ã®å®å šãªãµããŒããè¿œå ããŸããã ãã¹ãŠã®éšå±ã«å ±éããç©ççãªäžçãããã«åé€ãããã£ããããã¢ããããŒãã®ã»ãŒçŽåŸã«ãããããµãŒããŒã«å®è£ ããŸããã
åã²ãŒã ã«ãŒã ã«ç¬èªã®ç©çã·ãŒã³ãäžãããããã·ãã¥ã¬ãŒã·ã§ã³ãèšç®ããåã«é£æ¥ããéšå±ã®ããŒã¿ããã·ãŒã³ããã¯ãªã¢ãããå¿ èŠããªããªããŸããã ãŸããçç£æ§ãå€§å¹ ã«åäžããŸããã 第 XNUMX ã«ãæ°ããã²ãŒã èŠçŽ ãè¿œå ãããšãã«ããã°ã©ããŒãã·ãŒã³ ã¯ãªãŒã³ã¢ãã ã³ãŒãã§ãšã©ãŒãç¯ããå Žåã«çºçãããããããçš®é¡ã®ãã°ãåãé€ãããšãå¯èœã«ãªããŸããã ãã®ãããªãšã©ãŒã¯ãããã°ãé£ãããå€ãã®å Žåãããéšå±ã®ã·ãŒã³å ã®ç©çãªããžã§ã¯ãã®ç¶æ ãå¥ã®éšå±ã«ãæµã蟌ãããšããçµæã«ãªããŸããã
ããã«ãç©çã·ãŒã³ãç©çäžçã®æŽå²ã®ä¿åã«äœ¿çšã§ãããã©ããã«ã€ããŠããã€ãã®èª¿æ»ãè¡ããŸããã ã€ãŸããæ¡ä»¶ä»ãã§ãåéšå±ã« 30 ã€ã®ã·ãŒã³ã§ã¯ãªã XNUMX ã®ã·ãŒã³ãå²ãåœãŠãããããã埪ç°ãããã¡ãŒãäœæããããã«ã¹ããŒãªãŒãä¿åããŸãã äžè¬ã«ããã®ãªãã·ã§ã³ã¯æ©èœããããšãå€æããŸããããç§ãã¡ã¯ãããå®è£
ããŸããã§ãããçç£æ§ã®å€§å¹
ãªåäžã¯ç€ºãããŸããã§ããããããªãå±éºãªå€æŽãå¿
èŠã§ããã éåžžã«å€ãã®ã·ãŒã³ã§é·æéäœæ¥ããå ŽåããµãŒããŒãã©ã®ããã«åäœããããäºæž¬ããã®ã¯å°é£ã§ããã ãããã£ãŠãç§ãã¡ã¯æ¬¡ã®ã«ãŒã«ã«åŸããŸãããå£ããŠããªãå Žåã¯ä¿®æ£ããªãã§ãã ãã'ã
åºæïŒ habr.com