SlideShare a Scribd company logo
1 of 66
Download to read offline
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

What's hot

Built for performance: the UIElements Renderer – Unite Copenhagen 2019
Built for performance: the UIElements Renderer – Unite Copenhagen 2019Built for performance: the UIElements Renderer – Unite Copenhagen 2019
Built for performance: the UIElements Renderer – Unite Copenhagen 2019Unity Technologies
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1Hong-Gi Joe
 
Scene Graphs & Component Based Game Engines
Scene Graphs & Component Based Game EnginesScene Graphs & Component Based Game Engines
Scene Graphs & Component Based Game EnginesBryan Duggan
 
2 D게임 프로그래밍 발표 자료
2 D게임 프로그래밍 발표 자료2 D게임 프로그래밍 발표 자료
2 D게임 프로그래밍 발표 자료Lee Jungmin
 
【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門Unity Technologies Japan K.K.
 
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box대영 노
 
Ui in unity
Ui in unityUi in unity
Ui in unityNoam Gat
 
검은사막 역기획서 - UI편집기
검은사막 역기획서 - UI편집기검은사막 역기획서 - UI편집기
검은사막 역기획서 - UI편집기SeungminBaik1
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013영욱 오
 
Bethesda's Iterative Level Design Process for Skyrim and Fallout 3
Bethesda's Iterative Level Design Process for Skyrim and Fallout 3Bethesda's Iterative Level Design Process for Skyrim and Fallout 3
Bethesda's Iterative Level Design Process for Skyrim and Fallout 3Joel Burgess
 
同人ゲーム開発者が直面する法律問題
同人ゲーム開発者が直面する法律問題同人ゲーム開発者が直面する法律問題
同人ゲーム開発者が直面する法律問題IGDA Japan
 
Qt test framework
Qt test frameworkQt test framework
Qt test frameworkICS
 
Game Programming 02 - Component-Based Entity Systems
Game Programming 02 - Component-Based Entity SystemsGame Programming 02 - Component-Based Entity Systems
Game Programming 02 - Component-Based Entity SystemsNick Pruehs
 
ビジュアルスクリプティングシステムBoltを使ってみよう 1回目
ビジュアルスクリプティングシステムBoltを使ってみよう 1回目ビジュアルスクリプティングシステムBoltを使ってみよう 1回目
ビジュアルスクリプティングシステムBoltを使ってみよう 1回目Unity Technologies Japan K.K.
 
West Coast DevCon 2014: The Slate UI Framework (Part 1) - Introduction
West Coast DevCon 2014: The Slate UI Framework (Part 1) - IntroductionWest Coast DevCon 2014: The Slate UI Framework (Part 1) - Introduction
West Coast DevCon 2014: The Slate UI Framework (Part 1) - IntroductionGerke Max Preussner
 

What's hot (20)

Built for performance: the UIElements Renderer – Unite Copenhagen 2019
Built for performance: the UIElements Renderer – Unite Copenhagen 2019Built for performance: the UIElements Renderer – Unite Copenhagen 2019
Built for performance: the UIElements Renderer – Unite Copenhagen 2019
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1
 
Scene Graphs & Component Based Game Engines
Scene Graphs & Component Based Game EnginesScene Graphs & Component Based Game Engines
Scene Graphs & Component Based Game Engines
 
2 D게임 프로그래밍 발표 자료
2 D게임 프로그래밍 발표 자료2 D게임 프로그래밍 발표 자료
2 D게임 프로그래밍 발표 자료
 
【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門
 
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box
 
Ui in unity
Ui in unityUi in unity
Ui in unity
 
검은사막 역기획서 - UI편집기
검은사막 역기획서 - UI편집기검은사막 역기획서 - UI편집기
검은사막 역기획서 - UI편집기
 
Unity - Game Engine
Unity - Game EngineUnity - Game Engine
Unity - Game Engine
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
 
Bethesda's Iterative Level Design Process for Skyrim and Fallout 3
Bethesda's Iterative Level Design Process for Skyrim and Fallout 3Bethesda's Iterative Level Design Process for Skyrim and Fallout 3
Bethesda's Iterative Level Design Process for Skyrim and Fallout 3
 
同人ゲーム開発者が直面する法律問題
同人ゲーム開発者が直面する法律問題同人ゲーム開発者が直面する法律問題
同人ゲーム開発者が直面する法律問題
 
God Of War : post mortem
God Of War : post mortemGod Of War : post mortem
God Of War : post mortem
 
Qt test framework
Qt test frameworkQt test framework
Qt test framework
 
Game Programming 02 - Component-Based Entity Systems
Game Programming 02 - Component-Based Entity SystemsGame Programming 02 - Component-Based Entity Systems
Game Programming 02 - Component-Based Entity Systems
 
ビジュアルスクリプティングシステムBoltを使ってみよう 1回目
ビジュアルスクリプティングシステムBoltを使ってみよう 1回目ビジュアルスクリプティングシステムBoltを使ってみよう 1回目
ビジュアルスクリプティングシステムBoltを使ってみよう 1回目
 
West Coast DevCon 2014: The Slate UI Framework (Part 1) - Introduction
West Coast DevCon 2014: The Slate UI Framework (Part 1) - IntroductionWest Coast DevCon 2014: The Slate UI Framework (Part 1) - Introduction
West Coast DevCon 2014: The Slate UI Framework (Part 1) - Introduction
 
Unity
UnityUnity
Unity
 

Similar to 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 to 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
 

More from 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 11 - Game Physics
Game Programming 11 - Game PhysicsGame Programming 11 - Game Physics
Game Programming 11 - Game PhysicsNick 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 07 - Procedural Content Generation
Game Programming 07 - Procedural Content GenerationGame Programming 07 - Procedural Content Generation
Game Programming 07 - Procedural Content GenerationNick 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
 

More from 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 11 - Game Physics
Game Programming 11 - Game PhysicsGame Programming 11 - Game Physics
Game Programming 11 - Game Physics
 
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 07 - Procedural Content Generation
Game Programming 07 - Procedural Content GenerationGame Programming 07 - Procedural Content Generation
Game Programming 07 - Procedural Content Generation
 
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
 

Recently uploaded

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
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
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
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
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
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
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 

Recently uploaded (20)

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
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
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
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
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
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!
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 

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