Дар ин мақола, ҳадафи ман на такрор кардани он чизе, ки аллакай ҳазорон маротиба навишта шудааст, балки гуфтан аст, ки чӣ гуна мо ҷуброни ақибмондаро дар бозии худ бо дарназардошти стеки технологияи худ ва хусусиятҳои асосии бозии худ татбиқ кардем.
Якчанд сухан дар бораи кортекс ва технологияи мо.
Dino Squad як тирандози мобилии PvP мебошад. Бозингарон динозаврҳои бо силоҳҳои гуногун муҷаҳҳазшударо назорат мекунанд ва дар дастаҳои 6v6 бо ҳамдигар меҷанганд.
Ҳам муштарӣ ва ҳам сервер ба Unity асос ёфтаанд. Меъморӣ барои тирандозҳо хеле классикӣ аст: сервер авторитарист ва пешгӯии муштарӣ ба мизоҷон кор мекунад. Моделсозии бозӣ бо истифода аз ECS-и дохилӣ навишта шудааст ва ҳам дар сервер ва ҳам дар муштарӣ истифода мешавад.
В мақолаи қадим дар бораи стек шабакаи Half-Life, бачаҳо аз Valve ҳамин саволро доданд ва ҷавоби онҳо ин буд: ҷуброни ақибмонии снаряд мушкил аст ва беҳтараш аз он канорагирӣ кунед.
Мо ин имконро надоштем: аслиҳаи снарядӣ хусусияти асосии тарроҳии бозӣ буд. Аз ин рӯ, мо маҷбур шудем, ки чизе бифаҳмем. Пас аз як ҳамлаи ақл, мо ду вариантро таҳия кардем, ки ба назар чунин менамуданд:
1. Мо снарядро ба вақти бозигаре, ки онро офаридааст, мепайвандем. Ҳар як аломати симулятсияи сервер, барои ҳар як тири ҳар як бозигар, мо ҷаҳони физикиро ба ҳолати муштарӣ бармегардонем ва ҳисобҳои заруриро иҷро мекунем. Ин равиш имкон дод, ки сарбории тақсимшуда ба сервер ва вақти пешбинишавандаи парвози снарядҳо дошта бошад. Пешгӯӣ барои мо махсусан муҳим буд, зеро мо ҳама снарядҳо, аз ҷумла снарядҳои душманро дар муштарӣ пешгӯӣ кардаем.
Дар сурат бозингари тикаи 30 бо интизорй мушак парронда истодааст: вай мебинад, ки душман ба кадом самт давида истодааст ва суръати тахминии ракетаро медонад. Дар махалхо вай мебинад, ки вай ба нишони 33-юм зарба зад. Бо шарофати ҷуброни ақибмонӣ, он инчунин дар сервер пайдо мешавад
2. Мо ҳама чизро ҳамон тавре ки дар варианти аввал иҷро мекунем, аммо бо ҳисоб кардани як аломати симулятсияи тир, мо қатъ намекунем, балки тақлид кардани парвози онро дар дохили як аломати сервер идома медиҳем ва ҳар дафъа вақти онро ба сервер наздик мекунем. як ба як ишора ва нав кардани мавқеъҳои коллайдер. Мо ин корро то яке аз ду чиз рӯй надиҳад:
Мӯҳлати тир гузаштааст. Ин маънои онро дорад, ки ҳисобҳо ба охир расидаанд, мо метавонем як мисс ё зарбаро ҳисоб кунем. Ва ин дар ҳамон сатрест, ки дар он тир парронда шудааст! Барои мо ин ҳам як плюс ва ҳам манфӣ буд. Плюс - зеро барои бозигари тирандозӣ ин таъхир байни зарба ва коҳиши саломатии душманро ба таври назаррас коҳиш дод. Камбудиаш дар он аст, ки ҳамон таъсир ҳангоми тирпарронии рақибон ба плеер мушоҳида мешуд: душман, аз афташ, танҳо як мушаки сустро паррондааст ва зарар аллакай ҳисоб карда шудааст.
Ҳангоми татбиқи мо, ин ду равиш танҳо дар як чанд сатри код фарқ мекарданд, аз ин рӯ мо ҳардуро эҷод кардем ва муддати тӯлонӣ онҳо дар мувозӣ вуҷуд доштанд. Вобаста ба механикаи силоҳ ва суръати тир, мо барои ҳар як динозавр ин ё он вариантро интихоб кардем. Нуктаи гардиши ин чо дар бозии механикон пайдо шудани «агар дар фалон вакт ба душман чанд маротиба зарба занед, фалон мукофот гиред» буд. Ҳар як механик, ки дар он лаҳзае, ки плеер ба душман нақши муҳим дошт, аз кор кардан бо усули дуюм даст кашид. Ҳамин тавр, мо бо интихоби аввал гузаштем ва он ҳоло ба ҳама силоҳҳо ва ҳама қобилиятҳои фаъол дар бозӣ дахл дорад.
Алохида, масъалаи ичрои корро ба миён гузоштан меарзад. Агар шумо фикр мекардед, ки ҳамаи ин корҳоро суст мекунад, ман ҷавоб медиҳам: ин аст. Ягонагӣ дар ҳаракати коллайдерҳо ва фурӯзон ва хомӯш кардани онҳо хеле суст аст. Дар Dino Squad, дар ҳолати "бадтарин", метавонад якчанд сад снарядҳо дар як вақт дар ҷанг мавҷуд бошанд. Гузаронидани коллайдерҳо барои ҳисоб кардани ҳар як снаряд як ҳашамати бебаҳост. Аз ин рӯ, ба мо комилан зарур буд, ки шумораи "бозгаштҳои" физикаро ба ҳадди ақалл кам кунем. Барои ин, мо дар ECS як ҷузъи алоҳидае сохтем, ки дар он вақти плеерро сабт мекунем. Мо онро ба ҳама субъектҳое илова кардем, ки ҷуброни таъхирро талаб мекунанд (снарядҳо, қобилиятҳо ва ғайра). Пеш аз он ки мо коркарди ин гуна объектҳоро оғоз кунем, мо онҳоро то ин вақт кластер мекунем ва якҷоя коркард мекунем, ҷаҳони физикиро барои ҳар як кластер як маротиба бармегардонем.
Дар ин марҳила мо як системаи умумии кор. Рамзи он дар шакли каме соддакардашуда:
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);
}
}
}
}
Танҳо он чизе, ки боқӣ монд, танзим кардани тафсилот буд:
Албатта, ҳамаи ин бояд аз ҳисоби мураккабии афзояндаи коди сервер дар маҷмӯъ пардохт карда шавад - ҳам барои барномасозон ва ҳам тарроҳони бозӣ. Агар пештар симулятсия занги оддии пайдарпайи системаҳо бошад, пас бо ҷуброни ақибмонӣ дар он ҳалқаҳо ва шохаҳои лона пайдо шуданд. Барои он ки барои кор бо он қулай бошад, мо низ кӯшиши зиёд сарф кардем.