User Guide

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 15

DownloadUser Guide
Open PDF In BrowserView PDF
Fog of War

User Guide
v1.17

Overview
The definitive Fog of War package empowers you to fog up your 2D or 3D game, hiding secret
elements from the player. FogOfWar is highly modular, customizable and lightening fast to meet the
needs of any RTS, MOBA or adventure game that needs a thick shroud of mist around it.
Features:
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●

Supports Legacy, LWRP and HDRP
Works with 2D and 3D
Varying map size
Chunking system for infinite maps in all 3 dimensions
Different color, texture, filter and blurring options
Queue-friendly tools
Great performance (including multithreading)
Line of Sight (occluding objects)
View cones (using angles)
Clear Fog (ie see through to background)
See-through ground
Works for both Orthographic and Perspective cameras
Render to multiple cameras
Save and load fog between plays
Option for manual fog updates for turn-based games
Compatible with all devices, including mobile and VR
All source code provided
In active development and fast email support

Updates
v1.18
●
v1.17

Fix shader build error preventing fog from being seen

●
●
●
●
●
●
v1.16

This release will break existing setups. Please read the migration section in the user guide!
Added support for Postprocessing Stack v2!
Split FogOfWarTeam from visual side to make new post processing tech easier to migrate to
Better multi-camera support
Optimised clear fog
Improved sample scenes to work across multiple render pipelines

●
●
●
●
●

Fixed _CameraWS shader error
Removed dependency on SV_VertexID
Exposed raycasts count for line of sight
Added gizmos for line of sight raycasts
Removed all general runtime GC!

2

●
●
●
●
●
●
●
●
●
v1.15

Improved performance, memory for clear fog and test GUI
Optimised fading when updateUnits is turned off
Fixed bug where FogOfWar.SetFog() and FogOfWar.SetAll() wouldn't increase the fog
Fixed some misleading comments in FogOfWar script
Fixed bug with cell based when map resolution and size are not 1:1
Fixed screen being upside down on some graphics APIs
Set min thread count to 2
Fixed threads not setting count immediately
Fixed a bunch of warnings that can pop up during play

●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
v1.14

Added an array size check when setting FogOfWar.fogValues
Fixed flickering when switching chunks with the chunk manager in multithreaded mode
Fixed flickering when performing a manual update in multithreaded mode
Made tree materials more diffuse in sample scenes
Turned off UI by default in sample scenes
Fade speed now affects fade in and out speeds
Added boolean to stop unit information from being updated
Changed manual updates to a updateAutomatically boolean value
Changed texture shapes to always use the Alpha8 texture format to save memory usage
Made it so Partial Fog Amount can be changed without destructively affecting the fog map
Added VR support
Fixed a bunch of bugs with shape offset
Added Reinitialize button to FogOfWar component when playing in the editor
Added rectangular box and texture shapes
Merged box and texture unit shapes
Added pixel perfect toggle for screen texture
Changed filter mode to point filtering toggle
Fixed major performance issue with clear fog
Changed fade speed to fade duration (in seconds)
Made texture shapes not cause errors with multithreading
Fixed some weird behaviour that can happen when not fogging the far plane

●
●
●
●
●

●

Hopefully fixed all of the line ending warnings
Fixed flickering when switching chunks with the chunk manager in single threaded mode
Made fog color texture work in world space with options to adjust it
Made Reinitialize() accessible through the FogOfWar context menu
Added updateAutomatically and ManualUpdate() to FogOfWar that lets you manually
update the fog which is useful for turn-based games or to save on performance when the fog
isn’t being updated
Added warning for when there isn’t a team for the team specified in HideInFog

v1.13
●
●

Added missing unfog methods
Fixed wrong projection with Direct3D 9 renderers
3

●
●
●
●
●

Made it so you can use just one thread for multithreading
Made penetration depth work for cell based fog
Fixed line of sight for 3D physics on XY plane
Made FogOfWarUnity.rotateToForward work for XY and YZ planes
Made it so multiple teams can be handled on the same device

v1.12
●
●
●
●
●
●
●
●
●

Added chunking system for infinitely sized maps on all 3 axes
Made FogOfWar.Reinitialize() much faster
Added fix for clear fog
Added Canvas and Graphic hiding in HideUnitInFog script
Fixed pixel inaccuracy around map borders
Fixed pixel inaccuracy with line of sight
Added FogOfWar.VisibilityOfArea()
Added blurring and antialiasing options
Added antiflickering option for individual units

v1.11
●
●
●
●
●
●

Added multithreading
Fog color’s alpha will fade the fog in and out
New fog shapes including box and texture (with sample texture)
Anti-aliasing on field of view
Added team identification
New method for calculating line of sight which greatly reduces the number of raycasts

v1.10
●
●
●
●
●
●
●
●
●
●

Fixed shader bug in Unity 5.5.0 where depth buffer was inverted for orthographic cameras
Made fog collider rect optional with a tick box as it seems to be buggy with lower resolution
fog maps (a fix will be required for later releases!)
Fixed bug where fog wasn’t clearing on the border edges of the map
Added slider to specify the strength of fog outside of the map area
Added HideInFog component to automatically hide object when in the fog
Added FogOfWarEvents component to detect when an object enters or exits fog
Optimised fog of war shader by removing all branching
Placed all components into components menu
Added example 2D scene
Fixed bug on mobile devices where depth buffer was flipped

v1.9
●
●
●

Fixed bug where screen would go black when the unity editor loses focus
Improved performance by converting shader property ids to ints on initialization
Made fog values public

v1.8

4

●

Made fogValues setter public to enable manual setting of fog (for loading games)

v1.7
●
●
●
●
●
●

Improved test scenes with enemies, better trees and smoother movements
Put all code in FoW namespace
Added toggle for max fog distance
Made fog values publicly accessible via property
Added method to calculate explored percentage
Split fog planes and physics (ie 2D and 3D)

v1.6
●
●
●

Fixed bug where fog was rendering on camera’s far plane
Fog can have textures applied to them
Unit vision angles/cones

v1.5
●

Add Secondary FoW to allow for multiple cameras

v1.4
●

Added support for 2D (along the X and Y axes)

v1.3
●

Fog now works with orthographic cameras

v1.2
●
●

Added Clear Fog
Included TransparentShadowCaster (see-through ground) shader

v1.1
●
●
●
●
●
●

Implemented Line of Sight
Added new assets to demo
Demo minimap now displays units
Updated user guide considerably
Added new method: Unfog(Rect)
Camera zoomimg in the demo scene

v1.0
●
●

Basic Fog of War implemented
Basic demo

5

Components
FogOfWarTeam

FogOfWarTeam​ represents everything that a single team sees. There must be one of these for each
team. At least one needs to be in the scene.
You can see what area the map will cover by looking for the red box that will cover the scene in the
scene viewport.
To save and load the fog values, there is a ​fogValue​ (byte[]) property that stores the fog values. You
can get and set this at any time after the fog has been initialized.
When playing, a Reinitialize button will appear. Clicking this will reset the fog and completely start
the fog process again, which can help to debug issues.
Map
Map Resolution

Map Size

The resolution of the texture used to render the fog. Setting this to a high
value can have a significant performance impact, so try to keep it as low as
possible. It is recommended to always be a power of 2. If using chunking, this
must always be square.
The size of the map that the fog will cover in world coordinates. If using
chunking, this should be the smallest maximum area that the player can see if
the player is in the center of the map.

6

Map Offset
Plane
Physics
Visuals
Point Filtering

Blur Amount
Blur Iterations
Blur Type
Behaviour
Team
Update Units
Update
Automatically
Partial Fog
Amount
Fade Duration
Multithreading
Multithreading
Threads
Max Milliseconds
Per Frame

If the map is not centered at the origin (0, 0) you can offset it with this. This
should be left to zero when using chunking.
Which plane the fog will be rendered to. 3D is usually XZ and 2D is usually XY
What physics will be used for raycasting and collision detection. This is Unity’s
built-in 2D or 3D.
If unticked, bilinear filter will be used, and point filtering will be used if ticked.
Bilinear Filtering will have a smoother look, Point Filtering will have a pixelated
feel to it.
How far the blur will spread. This is measured in pixels of the fog texture. If
this is zero, no blurring will be applied.
How many time the blur will be applied. If this is zero, not blurring will be
applied.
The blurring algorithm that will be used. Gaussian 3 is slightly faster but
usually doesn’t give as good results as Gaussian 5.
The index of which team this fog will clear for. All units that have the same
team index will have the fog cleared.
If turned off, units will not update. This saves a lot of performance if doing a
turn-based game.
When set to true, the fog will be updated automatically every frame. If false,
you will need to call ​FogOfWar.ManualUpdate()​ from code to update the fog.
This is useful for turn-based games.
When a unit moves, the old visible areas will be partially fogged by this
amount. This should probably not be changed at runtime.
How long it will take to go from fully fogged to fully unfogged (in seconds). If
zero, there will be no fading transition.
If true, multithreading will be enabled.
The total number of threads to be used on Fog of War. If Multithreading is not
ticked, this will do nothing.
The maximum number of milliseconds that Fog Of War will spend on each
frame. This applies to both single threaded and multithreaded Fog Of War. A
higher value will slow performance but reduce stuttering.

Useful Functions
static FogOfWarTeam GetTeam(int teamID)

Returns the FogOfWarTeam for a particular
team.
Reinitializes fog texture. Call this if you have
changed the mapSize, mapResolution or
mapOffset during runtime. This will also reset
the fog. You can manually call this from the
editor by right-clicking the FogOfWar
component.
Forces the fog to update. This should only be
called when updateAutomatically is true. You
can manually call this from the editor by
right-clicking the FogOfWar component.

void Reinitialize()

void ManualUpdate(float timeSinceLastUpdate)

7

float ExploredArea(int skip = 1)

Returns how much of the map has been
explored/unfogged, where 0 is 0% and 1 is
100%. Increase the skip value to improve
performance but sacrifice accuracy.
Sets the fog value for the entire map. 0 is fully
unfogged and 1 if fully fogged.
Converts a world position to a fog pixel position.
Values will be between 0 and mapResolution.
Returns the fog amount at a particular world
position. 0 is fully unfogged and 1 if fully fogged.
Set the fog for a square area of the map.
Positions are all in world coordinates.
Checks the visibility of an area. 0 is fully
unfogged and 1 if fully fogged.

void SetAll(byte value)
Vector2i WorldPositionToFogPosition(Vector3
position)
byte GetFogValue(Vector3 position)
SetFog(Bounds bounds)
VisibilityOfArea(Bounds worldbounds, byte
value)

FogOfWar Display

Depending on which post processing technology you are using, you will need to set this up
differently.
FogOfWarLegacy

Postprocessing Stack v2

Legacy

✓

✓

LWRP

✗

✓

HDRP (pre 2019)

✗

✓

HDRP (2019+)

✗

✗

FogOfWarLegacy​ must be placed on the cameras you want to display the fog of war. This will use
Unity’s ​OnRenderImage()​ calls.
Unity’s ​Postprocessing Stack v2​ is required for LWRP and HDRP. You may need to ​install​ it in your
project if it isn’t already. On your post processing volume, click on ​Add Effect…​ and pick ​FogOfWar.​
8

HDRP in Unity 2019.1 (using their volume system) doesn’t yet allow for custom post processing
effects, but should be available in 2019.2. FogOfWar will support this when it is ready.
Map
Team
Fog Far Plane

Outside Fog
Strength
Point Filtering

Color
Fog Color
Fog Color Texture
Fog Texture
Screen Space
Fog Color Texture
Scale
Fog Color Texture
Height
Clear Fog
Clear Fog
Clear Fog Mask

The index of which team will be displayed. This will be the same index as is set
on the ​FogOfWarTeam​ component.
If true, anything at the camera’s far plane will have fog rendered over it. If you
want to see the skybox, set this to false. It is slightly better for performance to
have this turned on.
Specifies how strong the fog will be outside of the fog map area. 1 = fully
fogged, 0 = no fog.
If unticked, bilinear filter will be used, and point filtering will be used if ticked.
Bilinear Filtering will have a smoother look, Point Filtering will have a pixelated
feel to it.
The color of the fog. When using clear fog, the alpha value will determine how
transparent the fogged area will be (you usually want the alpha to be zero).
A texture that can be applied over the top of the fog.
If true, the displayed texture will be in screen space. ​fogColorTextureScale​ and
fogColorTextureHeight​ will not be used.
The size that the fog color texture appears to be in world space.
The illusion of height that the fog color texture is at.

If true, a secondary camera will render the background content using the clear
fog mask (see the Clear Fog section).
Determines which objects will be rendered in the clear fog (see the Clear Fog
section).

FogOfWarChunkManager

FogOfWarChunkManager​ will automatically move the map to center on the player. This allows for an
infinite map that can run infinitely in all directions without a huge performance impact. The chunk
manager also allows for vertical chunks. This is useful for games that cover multiple floors.
This component must be attached to the same GameObject as the FogOfWarTeam component!
If you are making an RTS or a game where the whole scene must be updated at once, you should ​not
use the chunk manager. The chunk manager works best with games where you control only one
character through a large environment.

9

There are some important things to note when using the chunk manager:
●
●

●

The map resolution needs to be square and divisible by 2. It is recommended to use a power
of 2.
The map size is the size of the map that will be visible at any one time. This means that it
should not cover the entire scene. It should be the maximum distance that the player can
see at any time.
The map offset has no effect when the chunk manager is enabled

Follow Transform
Remember Fog
Vertical Chunk
Size
Vertical Chunk
Offset

The game object that the fog should follow. This is usually the player.
If false, the chunk manager will completely discard all fog information once a
chunk is left.
The size of a floor before the next vertical chunk is loaded. This should be the
distance from one floor to another.
The offset from zero where the first vertical chunk is.

FogOfWarUnit

FogOfWarUnit​ should be placed on every gameobject that will reveal areas in the fog.
When using textures on Box shapes, the textures ​must​ be a single channel texture with the Alpha8
format.
Team
Brightness
Shape
Shape Type
Absolute Offset
Offset
Box Size

The index of the team that this unit is a part of. This must match the Team
value on the Fog of War component for the fog to be cleared.
The maximum amount that this unit can reveal the fog. This should usually be
set to 1, unless you want to do some sort of lighting effects with it.
Can be Circle or Box.
If false, the value if Offset will be relative to the unit’s rotation. If true, the
value will be in world space (along the fog plane).
The offset from the unit’s position where the shape’s center will be.
The size of the box. Only applicable for Box shapes.
10

Radius
Inner Radius
Angle
Texture

Rotate To Forward

Line of Sight
Line Of Sight Mask

Line Of Sight
Raycast Count
Line Of Sight
Penetration
Cell Based

Anti Flicker

How far the unit can see. Only applicable to Circle shapes.
How smooth the edge of the circle is. Only applicable to Circle shapes.
View cone angle. 180 degrees is full vision, 0 degrees is no vision. The forward
direction will always be Y+ for 2D and Z+ for 3D.
The texture that will be used to generate the shape. This only applies to Box
shapes. This must be a black and white texture where white is visible, and
black is fogged. Make sure you set the texture to readable in the import
settings!
This only applies to texture shapes. If true, the texture will always face the
same direction as the unit. If false, the texture will always be oriented to the
world.
A layer mask that specifies which objects will occlude the unit’s vision. Be sure
that the occluding objects have a collider on it and that they are at the same
vertical height as the unit to be properly occluded. Enabling this can have a
significant impact on performance with large radii.
The number of rays cast from the unit’s center to calculate the visible area of
the unit. Keep this number as low as possible for best performance.
How far through objects that the unit’s vision will penetrate through.
Enable this if you are doing a tile-based game where one tile is the same size
as one pixel on the fog map. This will make line of sight check collision
properly. You would generally want to leave ​Line Of Sight Penetration​ to zero
if this is enabled.
Enable this if flickering is occurring when using line of sight. This will snap the
unit’s position to the nearest fog pixel. The downside to this is that
movements will become more jarring with slower movements with lower
resolution maps. You can minimize this by applying a blur/antialiasing.

FogOfWarEvents

FogOfWarEvents​ allows you to set evens of what should happen when this GameObject enters or
exits the fog. The position is based off the GameObject’s Transform.
Team
Min Fog Strength
On Fog Enter

Which FogOfWar team will be tracked.
The minimum fog strength until the OnFogEnter is registered.
An event that is called when the object enters fog that is a greater strength
than MinFogStrength.
11

On FogExit

An event that is called when the object exits fog that is a greater strength than
MinFogStrength.

HideInFog

HideInFog​ will hide the object when it enters fog. The object will be made invisible by enabling and
disabling the Renderer, UI Canvas or UI Graphic attached to this GameObject.
Team
Min Fog Strength

Which FogOfWarTeam will be tracked.
The minimum fog strength until the object is made invisible.

Third-Party Support
RTS Engine
Created by SOUMIDELRIO
Asset Store Page: ​https://www.assetstore.unity3d.com/en/#!/content/79732
SOUMIDELRIO has kindly created a package to allow you to easily integrate Fog Of War into RTS
Engine. You can find information on it and download it here:
http://soumidelrio.com/docs/unity-rts-engine/third-party-support/fog-of-war/

Migrating From 1.16
FogOfWar 1.17 introduced big changes to how everything works. This is a checklist to ensure proper
migration:
●
●

●
●

A ​FogOfWarTeam​ component must be placed in the scene. There should be one for each
team.
Set up your camera depending on which post processing tech you are using:
○ Legacy Pipeline: Add the ​FogOfWarLegacy​ component to your camera.
○ Post Processing Stack v2: Add the ​FogOfWar​ effect to your post processing volume
and ensure that your camera has a ​PostProcessingLayer​ component on it.
FogOfWarSecondary no longer exists.
Any code that used ​FogOfWar.GetFogOfWarTeam()​ must be changed to
FogOfWarTeam.GetTeam()​.

12

FAQs
Why does the fog appear to update at a slow frame rate?
You can easily change the update frequency in the FogOfWarTeam component.
Updating the fog every frame for every unit can have a massive performance impact. To combat this,
units update the fog individually. After a set amount of time, the fog is rendered and then the loop
starts again.
If you only have a few units, updating the fog each frame may be viable. But if you have hundreds of
units, the frame rate will become unbearable.

What is Clear Fog and how do I get it to work?
Clear Fog enables you to replace the fog with a different background. This can be used to create
weird effects where the fog won’t be just a single color.
To get it to work, there are a few steps you must take:
1. Make sure the ​Clear Fog​ is set to true.
2. Set the F​ og Color​’s alpha to zero.
3. Set the C
​ lear Fog Mask​ to the objects that will appear in the background.

How can I improve performance for Clear Fog?
The main thing you want to do is make sure the ​Clear Fog Mask​ is set correctly. The mask should
ONLY contain objects that will appear in the background (ie in the fog). Also, the camera’s ​Culling
Mask​ should contain only the objects that are NOT in the background (ie not in the fog).
You don’t need to set the camera’s ​Clear Flags​ to skybox as the skybox will be automatically set on
the clear fog. This can help performance a tiny bit.

How can I have a see-through ground (ie a space scene)?
You need to have a surface for the fog to project on. But it is possible to make that surface
transparent. There is a shader in the FogOfWar folder called ​TransparentShadowCaster​ which will
allow you to do this. When applying it to a material, make sure that the alpha on the color is set to 0,
and that the ​Render Queue​ is set to 2500 or less.
One downside to this method is that objects in the background may not receive shadows.

How do I get Line of Sight working?
There are a few things you must do:
1.
2.
3.
4.

On each unit, make sure the Line of Sight Mask is set.
Make sure all occluding objects are of the same mask as set in step 1.
Make sure all occluding objects have a collider.
Make sure all occluding objects are level with the unit (ie they must be at the same height,
or the unit will see right through it).

13

5. (Optional) Tweak the Field of View Penetration variable on the Fog of War component so
that units can see the objects they are looking at.
6. (Optional) If you’re game is tile-based, you should tick the Cell Based toggle.

What can I do to improve performance?
There are a number of things:
●
●
●
●

●

If you have a team that is not being displayed, disable the FogOfWarTeam component.
Reduce the Map Resolution, the number of units, or each Unit’s vision radius. This should
always be the first port of call!
Try multithreading! There are many things that dictates performance with threads, so your
best bet is to open up Unity’s profiler and see what works best for you.
Blurring of large map resolutions can also have a significant impact on performance. To turn
it off, set the Blur Iterations to zero. Less iterations will reduce the performance impact. I
higher resolution map will also slow down the blurring process greatly.
If you’re using Line of Sight:
o Make sure the ground/terrain is not on the same layer as the unit’s Line of Sight
Mask.
o Make the Line Of Sight occlusion object’s colliders as small as possible and space out
the objects as much as possible. The more objects a single unit can see, the worse
performance will get.
o Consider setting the Field of View Penetration value to zero. An alternative to the
penetration is to let the occlusion objects clear the fog themselves as opposed to
letting the units do it.

How can I render things on top of the fog?
Fog of War renders the fog as an image effect. This means that anything that the camera renders will
be hidden by the fog. If you want to render anything on top, you can use Unity’s UI (both including
pre-4.6 UI).
For anything more complicated (such as 3D objects that are not affected by the fog) you can achieve
this by using an additional camera:
1. Put the objects you want to be affected on a different layer
2. Create a new camera and put it as a child of the main camera (make sure the transform is set
to zero and the camera component is identical to the main camera)
3. Set the camera’s depth to a higher value than the main camera.
4. Set the camera’s culling mask to render only the new layer
5. The objects should now be drawn on top of the fog!

How can I implement a minimap?
Fog of War will not generate a minimap for you, as there are many different aspects to a minimap.
But you can get the fog texture quite easily.
Fog is stored in a normal 2D texture with each pixel begin an 8-bit byte. A value of 0 means it is
unfogged, 255 means it is completely fogged. If you want to convert the fog map to something more
usable, you can find an example in the FogOfWarTestGUI.cs file (in the OnGUI() method).

14

How do I save/load the fog?
You can access all of the fog values by ​FoW.FogOfWarTeam.GetTeam(0).fogValues​. This is a byte
array and the size will depend on the ​mapResolution​ variable. You can read/write to this at any
time.

Why don’t my textures work on units?
Textures only work in single threaded mode and on Box-shaped units. To set the texture up, make
sure that you set the texture to be ​Single Channel​ with the ​Alpha8​ format in the texture import
settings for that texture.

Can I mix Unity’s 3D physics with 2D art?
Yes! Set the FogOfWarTeam plane to XY and physics to Physics3D.

Does FogOfWar work with tile-based games?
Yes! Just make sure to tick ​Cell Based​ on all units that use line of sight.

Contact
Support Email:​ ​stu_pidd_cow@hotmail.com
Be sure to check out my other assets here: ​https://assetstore.unity.com/publishers/9066

15



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.5
Linearized                      : Yes
Producer                        : Skia/PDF m75
Page Count                      : 15
EXIF Metadata provided by EXIF.tools

Navigation menu