SlideShare uma empresa Scribd logo
1 de 66
Baixar para ler 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

Mais conteúdo relacionado

Mais procurados

빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
KyeongWon Koo
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
Esun Kim
 

Mais procurados (20)

빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
 
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
졸업작품을 앞둔 게임 기획/프로그래밍 전공 교류회
 
Game using Java
Game using JavaGame using Java
Game using Java
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
 
Romero Blueprint Compendium
Romero Blueprint CompendiumRomero Blueprint Compendium
Romero Blueprint Compendium
 
Introduction to Flutter
Introduction to FlutterIntroduction to Flutter
Introduction to Flutter
 
Unreal Engine Basics 02 - Unreal Editor
Unreal Engine Basics 02 - Unreal EditorUnreal Engine Basics 02 - Unreal Editor
Unreal Engine Basics 02 - Unreal Editor
 
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
[IGC2018] 펄어비스 강건우 - 펄어비스에서 기획자가 일하는 방법
 
게임회사 실무용어 완전정복! 쿡앱스 용어정리집
게임회사 실무용어 완전정복! 쿡앱스 용어정리집 게임회사 실무용어 완전정복! 쿡앱스 용어정리집
게임회사 실무용어 완전정복! 쿡앱스 용어정리집
 
위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점
 
게임제작개론 : #6 게임 시스템 구조에 대한 이해
게임제작개론 : #6 게임 시스템 구조에 대한 이해게임제작개론 : #6 게임 시스템 구조에 대한 이해
게임제작개론 : #6 게임 시스템 구조에 대한 이해
 
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ
 
Kotlin coroutine - behind the scenes
Kotlin coroutine - behind the scenesKotlin coroutine - behind the scenes
Kotlin coroutine - behind the scenes
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
 
임건호 시간의 마녀(2 d)
임건호 시간의 마녀(2 d)임건호 시간의 마녀(2 d)
임건호 시간의 마녀(2 d)
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box
 
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング
【Unity道場 2017】PlayMakerによる初めてのUnityプログラミング
 
Twinmotion 最新情報(初学者のためのTwinmotionオンラインセミナー 2020/6/13)
Twinmotion 最新情報(初学者のためのTwinmotionオンラインセミナー 2020/6/13)Twinmotion 最新情報(初学者のためのTwinmotionオンラインセミナー 2020/6/13)
Twinmotion 最新情報(初学者のためのTwinmotionオンラインセミナー 2020/6/13)
 
NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기NDC 2015 삼시세끼 빌드만들기
NDC 2015 삼시세끼 빌드만들기
 
ビジュアルスクリプティングシステムBoltを使ってみよう 1回目
ビジュアルスクリプティングシステムBoltを使ってみよう 1回目ビジュアルスクリプティングシステムBoltを使ってみよう 1回目
ビジュアルスクリプティングシステムBoltを使ってみよう 1回目
 

Semelhante a Developing a Multiplayer RTS with the Unreal Engine 3

Semelhante 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
 

Mais de Nick Pruehs

Mais 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
 
Component-Based Entity Systems (Demo)
Component-Based Entity Systems (Demo)Component-Based Entity Systems (Demo)
Component-Based Entity Systems (Demo)
 
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
 

Último

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 

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