Emil SundmanEnglish

Boarding Party

Ett tactical systems-case som kombinerar planeringsdriven speldesign med substantiellt arbete inom tactical AI, kamerasystem, spatiala algoritmer och NavMesh-navigation.

Gameplay från Boarding Party med en squad, motståndare och köade taktiska orders ombord på ett rymdskepp.

Översikt

Boarding Party är en tactical squad- och strategiprototyp i Unity och C#, utvecklad av ett mindre team. Spelaren planerar och köar taktiska actions innan planen exekveras, vilket flyttar fokus från real-time micromanagement till player intent, taktisk planering och systemtänkande.

Jag hade starkt ownership av den ursprungliga core game- och systemdesignen och implementerade flera substantiella tekniska subsystem. Projektet är pausat på prototypstadiet, och implementationen av spelet som helhet var ett delat ansvar.

Core Design — Planering före exekvering

Jag designade den centrala loopen från planering till exekvering och de omgivande gameplay-systemen. Orders, taktisk information, squad behaviour och exekvering behövde fungera som en sammanhängande modell: spelaren skulle tydligt kunna uttrycka en plan och sedan se sin squad utföra den utan ständig detaljstyrning.

Tekniska höjdpunkter

Hierarkisk tactical AI

Jag designade den hierarkiska uppdelningen mellan AI på squad- och minion-nivå och definierade merparten av gameplay-facing goals, actions och sensors. När AI-arkitekturen utvecklades från en ursprungligen planerad FSM-only-lösning bidrog jag till beslutet att kombinera GOAP-planering med FSM-beteenden för att göra systemet enklare att bygga ut. Arkitektur och implementation var delade ansvarsområden, inte enbart mina.

Boarding Partys GOAP Graph Viewer med sammankopplade goals och actions i en AI-planeringskonfiguration.
En konfiguration i Boarding Partys GOAP Graph Viewer, visad som delad teknisk kontext.

Multi-mode-kamera med Cinemachine

Jag designade samtliga kameralägen och var primär implementerare av kamerasystemet. Jag migrerade det till Cinemachine 3 och utvecklade det från en låst top-down-vy till ett system med free movement, mouse-look, orbit runt en unit eller squad, strategic mode och cinematics.

Arbetet omfattade smoothing, scroll movement, cursor states, crosshairs, byten mellan lägen under runtime, större omskrivningar och korrigeringar av transition-buggar. Utmaningen var inte bara att lägga till vyer, utan att få flera kontrollmodeller att växla förutsägbart under taktiskt gameplay.

Riktad tactical threat-map-prototyp

Jag designade och implementerade en spatial threat-map-prototyp med åtta riktade sektorer per grid-cell. Implementation använde fyrabitars threat-värden, bit packing, direction quantization, distansberäkningar, raycast-baserade obstruction checks och debug-visualisering.

Prototypen var avsedd att senare påverka val av cover, navigation och mer avancerade orders. Den gameplay-integrationen slutfördes inte, och det tillgängliga underlaget visar inte att AI eller pathfinding konsumerade threat-värdena.

Geometry-aware NavMesh-targeting

Stora interactable objects kunde ha en transform origin som var onåbar, olämplig för interaktion eller till och med på andra sidan en vägg. Jag designade och implementerade GetBestPosition för att inspektera objektets geometri, sampla kandidatpositioner runt det, projicera dem mot NavMesh, validera kompletta paths, jämföra path distance och välja ett nåbart interaktionsmål.

Sampling i intervall om 20 grader var en medveten avvägning mellan precision och prestanda. Cachning av geometri och resultat gjorde upprepade beräkningar betydligt billigare efter den första utvärderingen.

Stödjande system och tooling

Jag designade asymmetrisk environment knowledge så att olika teams eller spelare kunde ha olika bilder av traversability och world state. Jag bidrog till den första teamspecifika implementationen; senare integration och refaktorering var delad.

Jag implementerade också lättviktig runtime performance-tooling: en FPS-räknare med current-, minimum-, maximum- och average-mätvärden över en rullande historik, en overlay som kunde slås på via tangentbordet samt verktyg för artificiell CPU/GPU-load för att testa spelets beteende vid försämrad prestanda. Unity Profiler användes separat för root-cause analysis.

Boarding Party använde Zenject för dependency injection och hade både EditMode- och PlayMode-tester.

Unity Test Runner i Boarding Party som visar EditMode-testsviten och Zenject-tester.
Unity-testkontext från Boarding Party, med EditMode-sviten och Zenject-tester.

Ansvarsgränser

Mitt starkaste ownership låg i core game- och systemdesignen, kameran, threat-map-prototypen och GetBestPosition.

Planeringsloopen och tactical AI kombinerade starkt design ownership med blandad eller delad implementation. En annan teammedlem implementerade huvudsakligen squad agent, order distribution, blackboard, formations, tactical order framework och en stor del av det senare GOAP-arbetet; mina bidrag låg främst inom arkitektur, gameplay-definitioner, iteration och debugging.

Andra utforskningar förblev tydligt avgränsade. Partiella NavMesh-rebakes under runtime blev inte en färdig optimerad lösning, och destructible eller rebuildable environment-arbetet förblev partiellt och experimentellt. Jag bidrog till algoritmdesignen för patrol points, men den planerade avancerade LOS-baserade room clearing-lösningen slutfördes inte. Jag designade weapon-systemet, men underlaget räcker inte för ett brett claim om att jag implementerade hela systemet.

Teamets arbetssätt

Teamet arbetade enligt Scrum med sprintplanering, daily stand-ups, reviews, retrospectives och backlog-hantering i Jira, med projekt- och designdokumentation i Confluence. Vi använde Unity Version Control (tidigare Plastic SCM) med ett trunk-based development-arbetssätt. Planeringen tog även viss inspiration från SAFe, specifikt genom PI Planning.

Produktionslärdomar

Projektet utvecklade också mitt produktionsomdöme. Dess scope växte sig för stort, samtidigt som 3D introducerade beroenden som var svåra att hantera utan en technical artist och gjorde animation till en flaskhals. I dag skulle jag börja med en fokuserad vertical slice eller MVP och minska beroendena i presentationen — potentiellt genom 2D — för att bevisa planerings- och exekveringsloopen innan resten av spelet byggs ut.