SlideShare una empresa de Scribd logo
1 de 66
Descargar para leer sin conexión
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

Más contenido relacionado

La actualidad más candente

Unreal Engine Basics 01 - Game Framework
Unreal Engine Basics 01 - Game FrameworkUnreal Engine Basics 01 - Game Framework
Unreal Engine Basics 01 - Game FrameworkNick Pruehs
 
T is for Transmedia: Learning through Transmedia Play
T is for Transmedia: Learning through Transmedia PlayT is for Transmedia: Learning through Transmedia Play
T is for Transmedia: Learning through Transmedia PlayErin Brockette Reilly
 
Game Programming 03 - Git Flow
Game Programming 03 - Git FlowGame Programming 03 - Git Flow
Game Programming 03 - Git FlowNick Pruehs
 
모바일 게임 개발
모바일 게임 개발모바일 게임 개발
모바일 게임 개발hong sanghyun
 
[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리KyeongWon Koo
 
Game development pipeline
Game development pipelineGame development pipeline
Game development pipelineGAME Studios
 
2 D게임 프로그래밍 발표 자료
2 D게임 프로그래밍 발표 자료2 D게임 프로그래밍 발표 자료
2 D게임 프로그래밍 발표 자료Lee Jungmin
 
LAFS Game Mechanics - Narrative Elements
LAFS Game Mechanics - Narrative ElementsLAFS Game Mechanics - Narrative Elements
LAFS Game Mechanics - Narrative ElementsDavid Mullich
 
06. Game Architecture
06. Game Architecture06. Game Architecture
06. Game ArchitectureAmin Babadi
 
C# Game Server
C# Game ServerC# Game Server
C# Game Serverlactrious
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버준철 박
 
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회ChangHyun Won
 
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법스케일폼(Scaleform) ue4에 통합 및 간단한 사용법
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법Kiyoung Moon
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉iFunFactory Inc.
 
[2012 대학특강] 아티스트 + 프로그래머
[2012 대학특강] 아티스트 + 프로그래머[2012 대학특강] 아티스트 + 프로그래머
[2012 대학특강] 아티스트 + 프로그래머포프 김
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기Sumin Byeon
 
Multiplayer Networking Game
Multiplayer Networking GameMultiplayer Networking Game
Multiplayer Networking GameTanmay Krishna
 

La actualidad más candente (20)

Unreal Engine Basics 01 - Game Framework
Unreal Engine Basics 01 - Game FrameworkUnreal Engine Basics 01 - Game Framework
Unreal Engine Basics 01 - Game Framework
 
T is for Transmedia: Learning through Transmedia Play
T is for Transmedia: Learning through Transmedia PlayT is for Transmedia: Learning through Transmedia Play
T is for Transmedia: Learning through Transmedia Play
 
Game Programming 03 - Git Flow
Game Programming 03 - Git FlowGame Programming 03 - Git Flow
Game Programming 03 - Git Flow
 
모바일 게임 개발
모바일 게임 개발모바일 게임 개발
모바일 게임 개발
 
[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리
 
Game development pipeline
Game development pipelineGame development pipeline
Game development pipeline
 
2 D게임 프로그래밍 발표 자료
2 D게임 프로그래밍 발표 자료2 D게임 프로그래밍 발표 자료
2 D게임 프로그래밍 발표 자료
 
Various Topics on Game Design
Various Topics on Game DesignVarious Topics on Game Design
Various Topics on Game Design
 
LAFS Game Mechanics - Narrative Elements
LAFS Game Mechanics - Narrative ElementsLAFS Game Mechanics - Narrative Elements
LAFS Game Mechanics - Narrative Elements
 
06. Game Architecture
06. Game Architecture06. Game Architecture
06. Game Architecture
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
Phases of game development
Phases of game developmentPhases of game development
Phases of game development
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
 
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
 
Ndc12 2
Ndc12 2Ndc12 2
Ndc12 2
 
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법스케일폼(Scaleform) ue4에 통합 및 간단한 사용법
스케일폼(Scaleform) ue4에 통합 및 간단한 사용법
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
 
[2012 대학특강] 아티스트 + 프로그래머
[2012 대학특강] 아티스트 + 프로그래머[2012 대학특강] 아티스트 + 프로그래머
[2012 대학특강] 아티스트 + 프로그래머
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
 
Multiplayer Networking Game
Multiplayer Networking GameMultiplayer Networking Game
Multiplayer Networking Game
 

Similar a Developing a Multiplayer RTS with the Unreal Engine 3

Introduction to the Unreal Development Kit
Introduction to the Unreal Development KitIntroduction to the Unreal Development Kit
Introduction to the Unreal Development KitNick Pruehs
 
Visibility Optimization for Games
Visibility Optimization for GamesVisibility Optimization for Games
Visibility Optimization for GamesUmbra
 
Visibility Optimization for Games
Visibility Optimization for GamesVisibility Optimization for Games
Visibility Optimization for GamesSampo Lappalainen
 
Silverlight as a Gaming Platform
Silverlight as a Gaming PlatformSilverlight as a Gaming Platform
Silverlight as a Gaming Platformgoodfriday
 
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptProgscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptJohn Stevenson
 
Above the clouds: introducing Akka
Above the clouds: introducing AkkaAbove the clouds: introducing Akka
Above the clouds: introducing Akkanartamonov
 
Using React, Redux and Saga with Lottoland APIs
Using React, Redux and Saga with Lottoland APIsUsing React, Redux and Saga with Lottoland APIs
Using React, Redux and Saga with Lottoland APIsMihail Gaberov
 
Go Reactive: Event-Driven, Scalable, Resilient & Responsive Systems
Go Reactive: Event-Driven, Scalable, Resilient & Responsive SystemsGo Reactive: Event-Driven, Scalable, Resilient & Responsive Systems
Go Reactive: Event-Driven, Scalable, Resilient & Responsive SystemsJonas Bonér
 
Chapter ii(coding)
Chapter ii(coding)Chapter ii(coding)
Chapter ii(coding)Chhom Karath
 
Productionizing your Streaming Jobs
Productionizing your Streaming JobsProductionizing your Streaming Jobs
Productionizing your Streaming JobsDatabricks
 
Terraform infraestructura como código
Terraform infraestructura como códigoTerraform infraestructura como código
Terraform infraestructura como códigoVictor Adsuar
 
Apache YARN Federation and Tez at Microsoft, Anupam Upadhyay, Adrian Nicoara,...
Apache YARN Federation and Tez at Microsoft, Anupam Upadhyay, Adrian Nicoara,...Apache YARN Federation and Tez at Microsoft, Anupam Upadhyay, Adrian Nicoara,...
Apache YARN Federation and Tez at Microsoft, Anupam Upadhyay, Adrian Nicoara,...Yahoo Developer Network
 
Velocity 2018 preetha appan final
Velocity 2018   preetha appan finalVelocity 2018   preetha appan final
Velocity 2018 preetha appan finalpreethaappan
 
Communicating State Machines
Communicating State MachinesCommunicating State Machines
Communicating State Machinessrirammalhar
 
Game server development in node.js in jsconf eu
Game server development in node.js in jsconf euGame server development in node.js in jsconf eu
Game server development in node.js in jsconf euXie ChengChao
 
My network functions are virtualized, but are they cloud-ready
My network functions are virtualized, but are they cloud-readyMy network functions are virtualized, but are they cloud-ready
My network functions are virtualized, but are they cloud-readyOPNFV
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysManuel Bernhardt
 
Gdc gameplay replication in acu with videos
Gdc   gameplay replication in acu with videosGdc   gameplay replication in acu with videos
Gdc gameplay replication in acu with videosCharles Lefebvre
 
Apache REEF - stdlib for big data
Apache REEF - stdlib for big dataApache REEF - stdlib for big data
Apache REEF - stdlib for big dataSergiy Matusevych
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the wayOleg Podsechin
 

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

Introduction to the Unreal Development Kit
Introduction to the Unreal Development KitIntroduction to the Unreal Development Kit
Introduction to the Unreal Development Kit
 
Visibility Optimization for Games
Visibility Optimization for GamesVisibility Optimization for Games
Visibility Optimization for Games
 
Visibility Optimization for Games
Visibility Optimization for GamesVisibility Optimization for Games
Visibility Optimization for Games
 
Silverlight as a Gaming Platform
Silverlight as a Gaming PlatformSilverlight as a Gaming Platform
Silverlight as a Gaming Platform
 
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptProgscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
 
Above the clouds: introducing Akka
Above the clouds: introducing AkkaAbove the clouds: introducing Akka
Above the clouds: introducing Akka
 
Using React, Redux and Saga with Lottoland APIs
Using React, Redux and Saga with Lottoland APIsUsing React, Redux and Saga with Lottoland APIs
Using React, Redux and Saga with Lottoland APIs
 
Go Reactive: Event-Driven, Scalable, Resilient & Responsive Systems
Go Reactive: Event-Driven, Scalable, Resilient & Responsive SystemsGo Reactive: Event-Driven, Scalable, Resilient & Responsive Systems
Go Reactive: Event-Driven, Scalable, Resilient & Responsive Systems
 
Chapter ii(coding)
Chapter ii(coding)Chapter ii(coding)
Chapter ii(coding)
 
Productionizing your Streaming Jobs
Productionizing your Streaming JobsProductionizing your Streaming Jobs
Productionizing your Streaming Jobs
 
Terraform infraestructura como código
Terraform infraestructura como códigoTerraform infraestructura como código
Terraform infraestructura como código
 
Apache YARN Federation and Tez at Microsoft, Anupam Upadhyay, Adrian Nicoara,...
Apache YARN Federation and Tez at Microsoft, Anupam Upadhyay, Adrian Nicoara,...Apache YARN Federation and Tez at Microsoft, Anupam Upadhyay, Adrian Nicoara,...
Apache YARN Federation and Tez at Microsoft, Anupam Upadhyay, Adrian Nicoara,...
 
Velocity 2018 preetha appan final
Velocity 2018   preetha appan finalVelocity 2018   preetha appan final
Velocity 2018 preetha appan final
 
Communicating State Machines
Communicating State MachinesCommunicating State Machines
Communicating State Machines
 
Game server development in node.js in jsconf eu
Game server development in node.js in jsconf euGame server development in node.js in jsconf eu
Game server development in node.js in jsconf eu
 
My network functions are virtualized, but are they cloud-ready
My network functions are virtualized, but are they cloud-readyMy network functions are virtualized, but are they cloud-ready
My network functions are virtualized, but are they cloud-ready
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDays
 
Gdc gameplay replication in acu with videos
Gdc   gameplay replication in acu with videosGdc   gameplay replication in acu with videos
Gdc gameplay replication in acu with videos
 
Apache REEF - stdlib for big data
Apache REEF - stdlib for big dataApache REEF - stdlib for big data
Apache REEF - stdlib for big data
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the way
 

Más de Nick Pruehs

Unreal Engine Basics 06 - Animation, Audio, Visual Effects
Unreal Engine Basics 06 - Animation, Audio, Visual EffectsUnreal Engine Basics 06 - Animation, Audio, Visual Effects
Unreal Engine Basics 06 - Animation, Audio, Visual EffectsNick Pruehs
 
Game Programming - Cloud Development
Game Programming - Cloud DevelopmentGame Programming - Cloud Development
Game Programming - Cloud DevelopmentNick Pruehs
 
Game Programming - Git
Game Programming - GitGame Programming - Git
Game Programming - GitNick Pruehs
 
Eight Rules for Making Your First Great Game
Eight Rules for Making Your First Great GameEight Rules for Making Your First Great Game
Eight Rules for Making Your First Great GameNick Pruehs
 
Designing an actor model game architecture with Pony
Designing an actor model game architecture with PonyDesigning an actor model game architecture with Pony
Designing an actor model game architecture with PonyNick Pruehs
 
Game Programming 13 - Debugging & Performance Optimization
Game Programming 13 - Debugging & Performance OptimizationGame Programming 13 - Debugging & Performance Optimization
Game Programming 13 - Debugging & Performance OptimizationNick Pruehs
 
Scrum - but... Agile Game Development in Small Teams
Scrum - but... Agile Game Development in Small TeamsScrum - but... Agile Game Development in Small Teams
Scrum - but... Agile Game Development in Small TeamsNick Pruehs
 
What Would Blizzard Do
What Would Blizzard DoWhat Would Blizzard Do
What Would Blizzard DoNick Pruehs
 
School For Games 2015 - Unity Engine Basics
School For Games 2015 - Unity Engine BasicsSchool For Games 2015 - Unity Engine Basics
School For Games 2015 - Unity Engine BasicsNick Pruehs
 
Tool Development A - Git
Tool Development A - GitTool Development A - Git
Tool Development A - GitNick Pruehs
 
Game Programming 12 - Shaders
Game Programming 12 - ShadersGame Programming 12 - Shaders
Game Programming 12 - ShadersNick Pruehs
 
Game Programming 10 - Localization
Game Programming 10 - LocalizationGame Programming 10 - Localization
Game Programming 10 - LocalizationNick Pruehs
 
Game Programming 09 - AI
Game Programming 09 - AIGame Programming 09 - AI
Game Programming 09 - AINick Pruehs
 
Game Development Challenges
Game Development ChallengesGame Development Challenges
Game Development ChallengesNick Pruehs
 
Game Programming 08 - Tool Development
Game Programming 08 - Tool DevelopmentGame Programming 08 - Tool Development
Game Programming 08 - Tool DevelopmentNick Pruehs
 
Game Programming 06 - Automated Testing
Game Programming 06 - Automated TestingGame Programming 06 - Automated Testing
Game Programming 06 - Automated TestingNick Pruehs
 
Game Programming 05 - Development Tools
Game Programming 05 - Development ToolsGame Programming 05 - Development Tools
Game Programming 05 - Development ToolsNick Pruehs
 
Game Programming 04 - Style & Design Principles
Game Programming 04 - Style & Design PrinciplesGame Programming 04 - Style & Design Principles
Game Programming 04 - Style & Design PrinciplesNick Pruehs
 
Game Programming 01 - Introduction
Game Programming 01 - IntroductionGame Programming 01 - Introduction
Game Programming 01 - IntroductionNick Pruehs
 
Game Programming 00 - Exams
Game Programming 00 - ExamsGame Programming 00 - Exams
Game Programming 00 - ExamsNick Pruehs
 

Más de Nick Pruehs (20)

Unreal Engine Basics 06 - Animation, Audio, Visual Effects
Unreal Engine Basics 06 - Animation, Audio, Visual EffectsUnreal Engine Basics 06 - Animation, Audio, Visual Effects
Unreal Engine Basics 06 - Animation, Audio, Visual Effects
 
Game Programming - Cloud Development
Game Programming - Cloud DevelopmentGame Programming - Cloud Development
Game Programming - Cloud Development
 
Game Programming - Git
Game Programming - GitGame Programming - Git
Game Programming - Git
 
Eight Rules for Making Your First Great Game
Eight Rules for Making Your First Great GameEight Rules for Making Your First Great Game
Eight Rules for Making Your First Great Game
 
Designing an actor model game architecture with Pony
Designing an actor model game architecture with PonyDesigning an actor model game architecture with Pony
Designing an actor model game architecture with Pony
 
Game Programming 13 - Debugging & Performance Optimization
Game Programming 13 - Debugging & Performance OptimizationGame Programming 13 - Debugging & Performance Optimization
Game Programming 13 - Debugging & Performance Optimization
 
Scrum - but... Agile Game Development in Small Teams
Scrum - but... Agile Game Development in Small TeamsScrum - but... Agile Game Development in Small Teams
Scrum - but... Agile Game Development in Small Teams
 
What Would Blizzard Do
What Would Blizzard DoWhat Would Blizzard Do
What Would Blizzard Do
 
School For Games 2015 - Unity Engine Basics
School For Games 2015 - Unity Engine BasicsSchool For Games 2015 - Unity Engine Basics
School For Games 2015 - Unity Engine Basics
 
Tool Development A - Git
Tool Development A - GitTool Development A - Git
Tool Development A - Git
 
Game Programming 12 - Shaders
Game Programming 12 - ShadersGame Programming 12 - Shaders
Game Programming 12 - Shaders
 
Game Programming 10 - Localization
Game Programming 10 - LocalizationGame Programming 10 - Localization
Game Programming 10 - Localization
 
Game Programming 09 - AI
Game Programming 09 - AIGame Programming 09 - AI
Game Programming 09 - AI
 
Game Development Challenges
Game Development ChallengesGame Development Challenges
Game Development Challenges
 
Game Programming 08 - Tool Development
Game Programming 08 - Tool DevelopmentGame Programming 08 - Tool Development
Game Programming 08 - Tool Development
 
Game Programming 06 - Automated Testing
Game Programming 06 - Automated TestingGame Programming 06 - Automated Testing
Game Programming 06 - Automated Testing
 
Game Programming 05 - Development Tools
Game Programming 05 - Development ToolsGame Programming 05 - Development Tools
Game Programming 05 - Development Tools
 
Game Programming 04 - Style & Design Principles
Game Programming 04 - Style & Design PrinciplesGame Programming 04 - Style & Design Principles
Game Programming 04 - Style & Design Principles
 
Game Programming 01 - Introduction
Game Programming 01 - IntroductionGame Programming 01 - Introduction
Game Programming 01 - Introduction
 
Game Programming 00 - Exams
Game Programming 00 - ExamsGame Programming 00 - Exams
Game Programming 00 - Exams
 

Último

"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 

Último (20)

"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 

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