SlideShare a Scribd company logo
Developing a Multiplayer RTS with the Unreal Engine 3
Marcel Köhler, Nick Prühs
Faculty of Design, Media and Information
Hamburg University of Applied Sciences
January 17, 2011
Outline
1.
2.
3.
4.
5.
6.
7.

Unreal Engine Basics
Controller & Pawn
Camera
Unit Selection & Orders
Weapon Fire
Network
Minimap & Fog of War
Unreal Engine Basics
• Core
– C++
– Rendering, Sound, Gameloop, Collision, Physics,
Threading, Low Level Network

• Virtual Machine
– Runs in Core
– Executes Unreal Script
Unreal Engine Basics
• Unreal Script
– Similar to C++ and Java
– High-level object-oriented language
– Bytecode based (platform independent)
– Pointerless environment with automatic garbage
collection
– Simple single-inheritance class graph
– Strong compile-time type checking
– Safe client-side execution "sandbox"
Controller & Pawn
Controller & Pawn
Controller & Pawn
Controller & Pawn
Controller & Pawn
Controller & Pawn
Unit Selection & Orders
Short left click
• < 15 ms
• Single unit selection
• Unit order

Long left click
• >= 15 ms
• Multiple unit selection (selection box) on release
Weapon Fire
Weapon Fire
Weapon Fire
Weapon Fire
Weapon Fire
Weapon Fire
Weapon Fire
Weapon Fire
Weapon Fire
Weapon Fire
Weapon Fire
Weapon Fire
Network
„Unreal views the general problem of
coordinating a reasonable approximation of a
shared reality between the server and clients as
a problem of replication.
That is, a problem of determining a set of data
and commands that flow between the client and
server in order to achieve that approximate
shared reality. “
- Tim Sweeney, Epic Games Inc.
Network
• Generalized Client-Server Model
– Authoritative server (Dedicated, Listen)
– Predicting and simulating clients
– Decoupling of Network and Gamelogic facilitates
extensibility
• The Network code can coordinate any game which can be
described by the language
• Network is controlled on language level through keywords &
variables
• Low level network (Serialization, Reliable UDP) done by Core

– “Hybrid” Code
• Client and Server execute same code on approximately the same
data -> minimizes traffic
Network - Basic Terminology
• Actor
– Object that can move and interact with other
actors

• Level
– Object which contains a set of actors

• Game State
– The complete set of all actors that exist in a level
– The current values of all actor variables
Network – Update Loop
1. if (server)
Send(Gamestate) to all clients
2. if (client)
Send(RequestedMovement) to server
Receive(Gamestate) from server
Render(ApproximateWorldView) to screen
3. if (server || client)
Tick(DeltaTime) to update Gamestate
Update(Actors)
Execute(Physics)
Receive(GameEvents)
Execute(ScriptCode)
Actor Roles
• Describes how much control the machine
(server or client) has over an actor
• Controls the actors function call permissions
// Net variables.
enum ENetRole
{
ROLE_None,
ROLE_SimulatedProxy,
ROLE_AutonomousProxy,
ROLE_Authority,
};

//
//
//
//

No role at all.
Locally simulated proxy of this actor.
Locally autonomous proxy of this actor.
Authoritative control over the actor.

var ENetRole RemoteRole, Role;

Source: Actor.uc.
Bandwidth Optimization: Actor Relevancy
• Eight prioritized rules
• An actor is relevant, if…
– Actor.RemoteRole != None
– Actor.bAlwaysRelevant == true
– Actor.Owner == Player
– the Actor is visible according to a line-of-sight
check between the actor's Location and the
player's Location
Bandwidth Optimization: Actor Relevancy
• Eight prioritized rules
• An actor is relevant, if…
– Actor.RemoteRole != None
– Actor.bAlwaysRelevant == true
– Actor.Owner == Player
– the Actor is visible according to a line-of-sight
check between the actor's Location and the
player's Location
Bandwidth Optimization: Actor Relevancy
• Eight prioritized rules
• An actor is relevant, if…
– Actor.RemoteRole != None
– Actor.bAlwaysRelevant == true
– Actor.Owner == Player
– the Actor is visible according to a line-of-sight
check between the actor's Location and the
player's Location
Bandwidth Optimization: Prioritization
• Actor.NetPriority
– Regulates share of the bandwidth based on how
important the Actor is to gameplay
– Always relative to all other Actors NetPriority
Replication
• Actor Replication
– Only Location, Rotation valid on spawn

• Variable Replication
–
–
–
–
–

Regulated by condition in Class Replication Statement
Server to Client only
Always reliable
Subject to bandwidth optimization
Keyword: repnotify
replication
{
// replicate if server
if (Role == ROLE_Authority && (bNetInitial || bNetDirty))
Armor, Range, AttackDamage;
}

Source: HWPawn.uc.
Where‘s Waldo?
simulated event ReplicatedEvent(name VarName)
{
if (VarName == 'TeamIndex')
{
ChangeColor(TeamIndex);
}
}

Source: HWSelectable.uc, before January 11, 2011.
Where‘s Waldo?
simulated event ReplicatedEvent(name VarName)
{
if (VarName == 'TeamIndex')
{
ChangeColor(TeamIndex);
}
else
{
super.ReplicatedEvent(VarName);
}
}

Source: HWSelectable.uc.

Never forget super calls when overloading engine class
functions!
Replication
• Function Call Replication
– Keywords:
• server, client
• reliable, unreliable

– Server -> Client: only to client who owns that
Actor
– Client -> Server: only on owned Actor
– Immediately sent, d1sregarding bandwidth
reliable server function ServerIssueAbilityOrder(HWAIController C, HWAbility Ability, HWSelectable Target)

Source: HWPlayerController.uc.
Fog of War
• hides any enemy units
that aren‘t within the
sight radius of a friendly
unit
• needs to be computed
efficiently

Fog of War in StarCraft II.
Visibility Mask

class HWVisibilityMask extends Object;
/** The tiles the map consists of. */
var array<bool> MapTiles;
/** The map this visibility mask is imposed on. */
var HWMapInfoActor Map;
/** The team this visibility mask manages the vision
of. */
var int Team;

Source: HWVisibilityMask.uc.

• is computed tile-based
to reduce the
perfomance impact
• map needs to tell us its
extents to translate
world space into tile
space
• one mask per team
Visibility Mask

class HWVisibilityMask extends Object;
/** The tiles the map consists of. */
var array<bool> MapTiles;
/** The map this visibility mask is imposed on. */
var HWMapInfoActor Map;
/** The team this visibility mask manages the vision
of. */
var int Team;

Source: HWVisibilityMask.uc.

• is computed tile-based
to reduce the
perfomance impact
• map needs to tell us its
extents to translate
world space into tile
space
• one mask per team

SrcHostileWorldsClassesHWVisibilityMask.uc(14) : Error, Bool arrays are not allowed
Failure - 1 error(s), 0 warning(s)
Visibility Mask

class HWVisibilityMask extends Object;
/** The tiles the map consists of. */
var array<byte> MapTiles;
/** The map this visibility mask is imposed on. */
var HWMapInfoActor Map;
/** The team this visibility mask manages the vision
of. */
var int Team;

Source: HWVisibilityMask.uc.

• is computed tile-based
to reduce the
perfomance impact
• map needs to tell us its
extents to translate
world space into tile
space
• one mask per team
Updating the Visibility Mask
/** Updates this visibility mask, re-computing the vision for
the team this mask belongs to. */
simulated function Update()
{
local HWSelectable s;
local IntPoint Tile;
local array<IntPoint> Tiles;
// reset visibility
foreach Map.DynamicActors(class'HWSelectable', s)
{
if (s.TeamIndex == Team)
{
HideMapTiles(s);
}
}
// compute new visibility
foreach Map.DynamicActors(class'HWSelectable', s)
{
if (s.TeamIndex == Team)
{
Tile = Map.GetMapTileFromLocation(s.Location);
Tiles = Map.GetListOfCircleTiles
(Tile, s.SightRadiusTiles);
RevealMapTiles(Tiles, s);
}
}
}

Source: HWVisibilityMask.uc

1. reset mask
–

no memset in Unreal:
units remember the
tiles they can see

2. compute new mask
1. iterate team‘s units
2. translate their positions
into tile space
3. compute sight circle
4. reveal tiles
Updating the Visibility Mask
• …is done less frequently than the frame-rate
– whenever an own unit moves, spawns, dies or has
its sight radius changed
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

Maybe we should take a closer look…
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

• in
– position of an object in world
space
– position of the map center in
world space
– width and height of the map,
in UU
– width and height of the map,
in tiles

• out
– position of the object in tile
space
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

• in
– position of an object in world
space
– position of the map center in
world space
– width and height of the map,
in UU
– width and height of the map,
in tiles

• out
– position of the object in tile
space
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

• in
– position of an object in world
space
– position of the map center in
world space
– width and height of the map,
in UU
– width and height of the map,
in tiles

• out
– position of the object in tile
space
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

• in
– position of an object in world
space
– position of the map center in
world space
– width and height of the map,
in UU
– width and height of the map,
in tiles

• out
– position of the object in tile
space
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

• in
– position of an object in world
space
– position of the map center in
world space
– width and height of the map,
in UU
– width and height of the map,
in tiles

• out
– position of the object in tile
space
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

Step 1:
Compute the object‘s
offset from the map
center.

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

Step 2:
Transform the object‘s
position into offset space.
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

Step 3:
Normalize the object‘s
offset by dividing by the
map dimension.
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

Step 3:
Normalize the object‘s
offset by dividing by the
map dimension.
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

Step 4:
Translate the coordinate
system by moving the
origin to the upper left
corner of the map.
Translating World Space into Tile Space
𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = (

𝑃𝑜𝑠

− 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟
+ 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠
𝑀𝑎𝑝𝐷𝑖𝑚

𝑊𝑜𝑟𝑙𝑑

Step 5:
Compute the position in
tile space by multiplying
with the number of tiles,
rounding down.
Applying Fog of War Logic
• iterate all units not belonging to the own team
– translate their position into tile space
– check whether the tile is visible in the visibility
mask

• hide and deselect all enemy units that get
hidden by fog of war
• cancel all orders of the own team targeting
these units
• do server-side checks for all orders or abilities
Next Steps
• consider high ground
– discretize the z-axis, too, defining different height
levels
– units can only see tiles on their own height level
or below

• render fog of war in 3D space
– render the visibility mask to an off-screen texture
– use this texture as lightmap for everything in the
game
Minimap

The minimap of StarCraft II.

• gives the player an
overview of the entire
map at a glance
• allows issuing orders
targeting locations
outside the current
view frustrum
Minimap
• consists of three layers:
1. landscape layer
2. fog of war layer
3. unit layer

The minimap of StarCraft II.

• all are rendered to
different textures that
are blended together
Minimap: Landscape Layer
• orthogonal rendering of
the terrain without any
camera culling
• updated when the
terrain itself changes
only
Minimap: Fog of War Layer
• visibility mask is
rendered to an offscreen texture
• updated whenever the
visibility is updated
Minimap: Unit Layer
• shows the positions and
owners of all visible
units and game objects
• updated whenever a
unit moves from one
map tile to another
Minimap: View Frustum
• shows the player which part of the map he or
she is looking at
• can be drawn as follows:
– cast a ray from the eye of the camera to each of
the frustum corners in the far plane
– translate the point of their intersection with the
terrain from world space to minimap space
– draw lines between the four corners on the
minimap
Minimap Interaction
• requires converting the location on the
minimap to a location in world space
• can be used for…
– scrolling: just set the camera focus to the world
location
– issuing orders
Bibliography
1. Carl Granberg. Programming an RTS Game
with Direct3D. Charles River Media, pages
265-307, 2007.
2. http://udn.epicgames.com/Three/UDKProgra
mmingHome.html
3. Unreal Development Kit (August 2010)
Source Code
Thank you for your attention!

www.hostile-worlds.com

More Related Content

PDF
Unreal Engine Basics 03 - Gameplay
PDF
NHN NEXT 게임 전공 소개
PPTX
Node js overview
PPTX
Virtualization concept slideshare
PPTX
Performance Testing from Scratch + JMeter intro
ODP
Kvm virtualization platform
PDF
Interrupts
PDF
Rootlinux17: Hypervisors on ARM - Overview and Design Choices by Julien Grall...
Unreal Engine Basics 03 - Gameplay
NHN NEXT 게임 전공 소개
Node js overview
Virtualization concept slideshare
Performance Testing from Scratch + JMeter intro
Kvm virtualization platform
Interrupts
Rootlinux17: Hypervisors on ARM - Overview and Design Choices by Julien Grall...

What's hot (20)

PPTX
Azure automation
PDF
Robot framework 을 이용한 기능 테스트 자동화
PPTX
Windows Automation with Ansible
PPTX
Angular Unit Testing
PDF
How to go about testing in React?
PPTX
Jenkins tutorial for beginners
PDF
Unit testing on embedded target with C++Test
PPT
Load testing using_neoload by kc
PPT
Oсобенности тестирования игр
PDF
톰캣 운영 노하우
PDF
Testing Angular
PDF
Trusted firmware deep_dive_v1.0_
PDF
Integration Testing with a Citrus twist
PDF
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
ODP
The e820 trap of Linux kernel hibernation
PDF
使ってみよう PowerShell
PDF
What is JUnit? | Edureka
PDF
Linux Internals - Part II
PPTX
Unit Testing And Mocking
PPTX
Test automation using selenium
Azure automation
Robot framework 을 이용한 기능 테스트 자동화
Windows Automation with Ansible
Angular Unit Testing
How to go about testing in React?
Jenkins tutorial for beginners
Unit testing on embedded target with C++Test
Load testing using_neoload by kc
Oсобенности тестирования игр
톰캣 운영 노하우
Testing Angular
Trusted firmware deep_dive_v1.0_
Integration Testing with a Citrus twist
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
The e820 trap of Linux kernel hibernation
使ってみよう PowerShell
What is JUnit? | Edureka
Linux Internals - Part II
Unit Testing And Mocking
Test automation using selenium
Ad

Similar to Developing a Multiplayer RTS with the Unreal Engine 3 (20)

PDF
Introduction to the Unreal Development Kit
PDF
Jan Hloušek, Keen Software House
PDF
Unreal Engine Basics 01 - Game Framework
PPTX
East Coast DevCon 2014: Game Programming in UE4 - Game Framework & Sample Pro...
PPTX
Developing Multiplayer Games in Unity3D
PPTX
West Coast DevCon 2014: Game Programming in UE4 - Game Framework & Sample Pro...
PPTX
Game Networking for Online games
PPTX
Intro to unreal with framework and vr
PPTX
GDC Europe 2014: Unreal Engine 4 for Programmers - Lessons Learned & Things t...
PDF
Unreal Engine Basics 02 - Unreal Editor
PPTX
Hadean: How We Tackled A Gaming World Record
PPTX
Unity workshop
PPT
Realtime html5 multiplayer_games_with_node_js
PDF
Moving pixels on someone else's screen: introduction to Unity networking
PDF
38199728 multi-player-tutorial
PDF
Unreal Ahmedabad Meetup Hosted by 300Minds.pdf
PDF
Introduction to Game Programming: Using C# and Unity 3D - Chapter 6 (Preview)
PPT
NetRacer for the Commodore 64
PDF
PDF
Deterministic Simulation - What modern online games can learn from the Game B...
Introduction to the Unreal Development Kit
Jan Hloušek, Keen Software House
Unreal Engine Basics 01 - Game Framework
East Coast DevCon 2014: Game Programming in UE4 - Game Framework & Sample Pro...
Developing Multiplayer Games in Unity3D
West Coast DevCon 2014: Game Programming in UE4 - Game Framework & Sample Pro...
Game Networking for Online games
Intro to unreal with framework and vr
GDC Europe 2014: Unreal Engine 4 for Programmers - Lessons Learned & Things t...
Unreal Engine Basics 02 - Unreal Editor
Hadean: How We Tackled A Gaming World Record
Unity workshop
Realtime html5 multiplayer_games_with_node_js
Moving pixels on someone else's screen: introduction to Unity networking
38199728 multi-player-tutorial
Unreal Ahmedabad Meetup Hosted by 300Minds.pdf
Introduction to Game Programming: Using C# and Unity 3D - Chapter 6 (Preview)
NetRacer for the Commodore 64
Deterministic Simulation - What modern online games can learn from the Game B...
Ad

More from Nick Pruehs (20)

PDF
Unreal Engine Basics 06 - Animation, Audio, Visual Effects
PDF
Unreal Engine Basics 05 - User Interface
PDF
Unreal Engine Basics 04 - Behavior Trees
PDF
Game Programming - Cloud Development
PDF
Game Programming - Git
PDF
Eight Rules for Making Your First Great Game
PDF
Designing an actor model game architecture with Pony
PDF
Game Programming 13 - Debugging & Performance Optimization
PDF
Scrum - but... Agile Game Development in Small Teams
PDF
Component-Based Entity Systems (Demo)
PDF
What Would Blizzard Do
PDF
School For Games 2015 - Unity Engine Basics
PDF
Tool Development A - Git
PDF
Game Programming 12 - Shaders
PDF
Game Programming 11 - Game Physics
PDF
Game Programming 10 - Localization
PDF
Game Programming 09 - AI
PDF
Game Development Challenges
PDF
Game Programming 08 - Tool Development
PDF
Game Programming 07 - Procedural Content Generation
Unreal Engine Basics 06 - Animation, Audio, Visual Effects
Unreal Engine Basics 05 - User Interface
Unreal Engine Basics 04 - Behavior Trees
Game Programming - Cloud Development
Game Programming - Git
Eight Rules for Making Your First Great Game
Designing an actor model game architecture with Pony
Game Programming 13 - Debugging & Performance Optimization
Scrum - but... Agile Game Development in Small Teams
Component-Based Entity Systems (Demo)
What Would Blizzard Do
School For Games 2015 - Unity Engine Basics
Tool Development A - Git
Game Programming 12 - Shaders
Game Programming 11 - Game Physics
Game Programming 10 - Localization
Game Programming 09 - AI
Game Development Challenges
Game Programming 08 - Tool Development
Game Programming 07 - Procedural Content Generation

Recently uploaded (20)

PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPT
Teaching material agriculture food technology
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Approach and Philosophy of On baking technology
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Electronic commerce courselecture one. Pdf
PPTX
Spectroscopy.pptx food analysis technology
PDF
KodekX | Application Modernization Development
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
Building Integrated photovoltaic BIPV_UPV.pdf
The Rise and Fall of 3GPP – Time for a Sabbatical?
Teaching material agriculture food technology
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Understanding_Digital_Forensics_Presentation.pptx
20250228 LYD VKU AI Blended-Learning.pptx
Programs and apps: productivity, graphics, security and other tools
MYSQL Presentation for SQL database connectivity
Approach and Philosophy of On baking technology
Spectral efficient network and resource selection model in 5G networks
Unlocking AI with Model Context Protocol (MCP)
Diabetes mellitus diagnosis method based random forest with bat algorithm
MIND Revenue Release Quarter 2 2025 Press Release
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Electronic commerce courselecture one. Pdf
Spectroscopy.pptx food analysis technology
KodekX | Application Modernization Development
Digital-Transformation-Roadmap-for-Companies.pptx

Developing a Multiplayer RTS with the Unreal Engine 3

  • 1. Developing a Multiplayer RTS with the Unreal Engine 3 Marcel Köhler, Nick Prühs Faculty of Design, Media and Information Hamburg University of Applied Sciences January 17, 2011
  • 2. Outline 1. 2. 3. 4. 5. 6. 7. Unreal Engine Basics Controller & Pawn Camera Unit Selection & Orders Weapon Fire Network Minimap & Fog of War
  • 3. Unreal Engine Basics • Core – C++ – Rendering, Sound, Gameloop, Collision, Physics, Threading, Low Level Network • Virtual Machine – Runs in Core – Executes Unreal Script
  • 4. Unreal Engine Basics • Unreal Script – Similar to C++ and Java – High-level object-oriented language – Bytecode based (platform independent) – Pointerless environment with automatic garbage collection – Simple single-inheritance class graph – Strong compile-time type checking – Safe client-side execution "sandbox"
  • 11. Unit Selection & Orders Short left click • < 15 ms • Single unit selection • Unit order Long left click • >= 15 ms • Multiple unit selection (selection box) on release
  • 24. Network „Unreal views the general problem of coordinating a reasonable approximation of a shared reality between the server and clients as a problem of replication. That is, a problem of determining a set of data and commands that flow between the client and server in order to achieve that approximate shared reality. “ - Tim Sweeney, Epic Games Inc.
  • 25. Network • Generalized Client-Server Model – Authoritative server (Dedicated, Listen) – Predicting and simulating clients – Decoupling of Network and Gamelogic facilitates extensibility • The Network code can coordinate any game which can be described by the language • Network is controlled on language level through keywords & variables • Low level network (Serialization, Reliable UDP) done by Core – “Hybrid” Code • Client and Server execute same code on approximately the same data -> minimizes traffic
  • 26. Network - Basic Terminology • Actor – Object that can move and interact with other actors • Level – Object which contains a set of actors • Game State – The complete set of all actors that exist in a level – The current values of all actor variables
  • 27. Network – Update Loop 1. if (server) Send(Gamestate) to all clients 2. if (client) Send(RequestedMovement) to server Receive(Gamestate) from server Render(ApproximateWorldView) to screen 3. if (server || client) Tick(DeltaTime) to update Gamestate Update(Actors) Execute(Physics) Receive(GameEvents) Execute(ScriptCode)
  • 28. Actor Roles • Describes how much control the machine (server or client) has over an actor • Controls the actors function call permissions // Net variables. enum ENetRole { ROLE_None, ROLE_SimulatedProxy, ROLE_AutonomousProxy, ROLE_Authority, }; // // // // No role at all. Locally simulated proxy of this actor. Locally autonomous proxy of this actor. Authoritative control over the actor. var ENetRole RemoteRole, Role; Source: Actor.uc.
  • 29. Bandwidth Optimization: Actor Relevancy • Eight prioritized rules • An actor is relevant, if… – Actor.RemoteRole != None – Actor.bAlwaysRelevant == true – Actor.Owner == Player – the Actor is visible according to a line-of-sight check between the actor's Location and the player's Location
  • 30. Bandwidth Optimization: Actor Relevancy • Eight prioritized rules • An actor is relevant, if… – Actor.RemoteRole != None – Actor.bAlwaysRelevant == true – Actor.Owner == Player – the Actor is visible according to a line-of-sight check between the actor's Location and the player's Location
  • 31. Bandwidth Optimization: Actor Relevancy • Eight prioritized rules • An actor is relevant, if… – Actor.RemoteRole != None – Actor.bAlwaysRelevant == true – Actor.Owner == Player – the Actor is visible according to a line-of-sight check between the actor's Location and the player's Location
  • 32. Bandwidth Optimization: Prioritization • Actor.NetPriority – Regulates share of the bandwidth based on how important the Actor is to gameplay – Always relative to all other Actors NetPriority
  • 33. Replication • Actor Replication – Only Location, Rotation valid on spawn • Variable Replication – – – – – Regulated by condition in Class Replication Statement Server to Client only Always reliable Subject to bandwidth optimization Keyword: repnotify replication { // replicate if server if (Role == ROLE_Authority && (bNetInitial || bNetDirty)) Armor, Range, AttackDamage; } Source: HWPawn.uc.
  • 34. Where‘s Waldo? simulated event ReplicatedEvent(name VarName) { if (VarName == 'TeamIndex') { ChangeColor(TeamIndex); } } Source: HWSelectable.uc, before January 11, 2011.
  • 35. Where‘s Waldo? simulated event ReplicatedEvent(name VarName) { if (VarName == 'TeamIndex') { ChangeColor(TeamIndex); } else { super.ReplicatedEvent(VarName); } } Source: HWSelectable.uc. Never forget super calls when overloading engine class functions!
  • 36. Replication • Function Call Replication – Keywords: • server, client • reliable, unreliable – Server -> Client: only to client who owns that Actor – Client -> Server: only on owned Actor – Immediately sent, d1sregarding bandwidth reliable server function ServerIssueAbilityOrder(HWAIController C, HWAbility Ability, HWSelectable Target) Source: HWPlayerController.uc.
  • 37. Fog of War • hides any enemy units that aren‘t within the sight radius of a friendly unit • needs to be computed efficiently Fog of War in StarCraft II.
  • 38. Visibility Mask class HWVisibilityMask extends Object; /** The tiles the map consists of. */ var array<bool> MapTiles; /** The map this visibility mask is imposed on. */ var HWMapInfoActor Map; /** The team this visibility mask manages the vision of. */ var int Team; Source: HWVisibilityMask.uc. • is computed tile-based to reduce the perfomance impact • map needs to tell us its extents to translate world space into tile space • one mask per team
  • 39. Visibility Mask class HWVisibilityMask extends Object; /** The tiles the map consists of. */ var array<bool> MapTiles; /** The map this visibility mask is imposed on. */ var HWMapInfoActor Map; /** The team this visibility mask manages the vision of. */ var int Team; Source: HWVisibilityMask.uc. • is computed tile-based to reduce the perfomance impact • map needs to tell us its extents to translate world space into tile space • one mask per team SrcHostileWorldsClassesHWVisibilityMask.uc(14) : Error, Bool arrays are not allowed Failure - 1 error(s), 0 warning(s)
  • 40. Visibility Mask class HWVisibilityMask extends Object; /** The tiles the map consists of. */ var array<byte> MapTiles; /** The map this visibility mask is imposed on. */ var HWMapInfoActor Map; /** The team this visibility mask manages the vision of. */ var int Team; Source: HWVisibilityMask.uc. • is computed tile-based to reduce the perfomance impact • map needs to tell us its extents to translate world space into tile space • one mask per team
  • 41. Updating the Visibility Mask /** Updates this visibility mask, re-computing the vision for the team this mask belongs to. */ simulated function Update() { local HWSelectable s; local IntPoint Tile; local array<IntPoint> Tiles; // reset visibility foreach Map.DynamicActors(class'HWSelectable', s) { if (s.TeamIndex == Team) { HideMapTiles(s); } } // compute new visibility foreach Map.DynamicActors(class'HWSelectable', s) { if (s.TeamIndex == Team) { Tile = Map.GetMapTileFromLocation(s.Location); Tiles = Map.GetListOfCircleTiles (Tile, s.SightRadiusTiles); RevealMapTiles(Tiles, s); } } } Source: HWVisibilityMask.uc 1. reset mask – no memset in Unreal: units remember the tiles they can see 2. compute new mask 1. iterate team‘s units 2. translate their positions into tile space 3. compute sight circle 4. reveal tiles
  • 42. Updating the Visibility Mask • …is done less frequently than the frame-rate – whenever an own unit moves, spawns, dies or has its sight radius changed
  • 43. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑
  • 44. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 Maybe we should take a closer look…
  • 45. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 • in – position of an object in world space – position of the map center in world space – width and height of the map, in UU – width and height of the map, in tiles • out – position of the object in tile space
  • 46. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 • in – position of an object in world space – position of the map center in world space – width and height of the map, in UU – width and height of the map, in tiles • out – position of the object in tile space
  • 47. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 • in – position of an object in world space – position of the map center in world space – width and height of the map, in UU – width and height of the map, in tiles • out – position of the object in tile space
  • 48. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 • in – position of an object in world space – position of the map center in world space – width and height of the map, in UU – width and height of the map, in tiles • out – position of the object in tile space
  • 49. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 • in – position of an object in world space – position of the map center in world space – width and height of the map, in UU – width and height of the map, in tiles • out – position of the object in tile space
  • 50. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 Step 1: Compute the object‘s offset from the map center. − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑
  • 51. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 Step 2: Transform the object‘s position into offset space.
  • 52. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 Step 3: Normalize the object‘s offset by dividing by the map dimension.
  • 53. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 Step 3: Normalize the object‘s offset by dividing by the map dimension.
  • 54. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 Step 4: Translate the coordinate system by moving the origin to the upper left corner of the map.
  • 55. Translating World Space into Tile Space 𝑃𝑜𝑠 𝑇𝑖𝑙𝑒 = ( 𝑃𝑜𝑠 − 𝑀𝑎𝑝𝐶𝑒𝑛𝑡𝑒𝑟 + 0.5) ∙ 𝑇𝑖𝑙𝑒𝑠 𝑀𝑎𝑝𝐷𝑖𝑚 𝑊𝑜𝑟𝑙𝑑 Step 5: Compute the position in tile space by multiplying with the number of tiles, rounding down.
  • 56. Applying Fog of War Logic • iterate all units not belonging to the own team – translate their position into tile space – check whether the tile is visible in the visibility mask • hide and deselect all enemy units that get hidden by fog of war • cancel all orders of the own team targeting these units • do server-side checks for all orders or abilities
  • 57. Next Steps • consider high ground – discretize the z-axis, too, defining different height levels – units can only see tiles on their own height level or below • render fog of war in 3D space – render the visibility mask to an off-screen texture – use this texture as lightmap for everything in the game
  • 58. Minimap The minimap of StarCraft II. • gives the player an overview of the entire map at a glance • allows issuing orders targeting locations outside the current view frustrum
  • 59. Minimap • consists of three layers: 1. landscape layer 2. fog of war layer 3. unit layer The minimap of StarCraft II. • all are rendered to different textures that are blended together
  • 60. Minimap: Landscape Layer • orthogonal rendering of the terrain without any camera culling • updated when the terrain itself changes only
  • 61. Minimap: Fog of War Layer • visibility mask is rendered to an offscreen texture • updated whenever the visibility is updated
  • 62. Minimap: Unit Layer • shows the positions and owners of all visible units and game objects • updated whenever a unit moves from one map tile to another
  • 63. Minimap: View Frustum • shows the player which part of the map he or she is looking at • can be drawn as follows: – cast a ray from the eye of the camera to each of the frustum corners in the far plane – translate the point of their intersection with the terrain from world space to minimap space – draw lines between the four corners on the minimap
  • 64. Minimap Interaction • requires converting the location on the minimap to a location in world space • can be used for… – scrolling: just set the camera focus to the world location – issuing orders
  • 65. Bibliography 1. Carl Granberg. Programming an RTS Game with Direct3D. Charles River Media, pages 265-307, 2007. 2. http://udn.epicgames.com/Three/UDKProgra mmingHome.html 3. Unreal Development Kit (August 2010) Source Code
  • 66. Thank you for your attention! www.hostile-worlds.com