From 895ebff762ed58aa61f9b7d698d89bff71f5debc Mon Sep 17 00:00:00 2001 From: Anton Vasserman Date: Sat, 9 Nov 2024 09:15:46 +0200 Subject: [PATCH 1/3] Sections and other Minor refactorings --- README.md | 695 +++++++++++++++++++++++++++--------------------------- 1 file changed, 350 insertions(+), 345 deletions(-) diff --git a/README.md b/README.md index b88e2b41..55443d2a 100644 --- a/README.md +++ b/README.md @@ -49,112 +49,112 @@ If you have made a notable fork or translation that is not suitable for a pull r - [0.3 Friends do not let friends have bad style](#0.3) - [0.4 A team without a style guide is no team of mine](#0.4) - [0.5 Don't Break The Law](#0.5) -- [00. Globally Enforced Opinions](#00) - - [00.1 Forbidden Characters](#00.1) - - [Identifiers](#identifiers) -- [1. Asset Naming Conventions](#anc) - - [1.1 Base Asset Name - `Prefix_BaseAssetName_Variant_Suffix`](#base-asset-name) - - [1.1 Examples](#1.1-examples) - - [1.2 Asset Name Modifiers](#asset-name-modifiers) - - [1.2.1 Most Common](#anc-common) - - [1.2.2 Animations](#anc-animations) - - [1.2.3 Artificial Intelligence](#anc-ai) - - [1.2.4 Blueprints](#anc-bp) - - [1.2.5 Materials](#anc-materials) - - [1.2.6 Textures](#anc-textures) - - [1.2.6.1 Texture Packing](#anc-textures-packing) - - [1.2.7 Miscellaneous](#anc-misc) - - [1.2.8 Paper 2D](#anc-paper2d) - - [1.2.9 Physics](#anc-physics) - - [1.2.10 Sounds](#anc-sounds) - - [1.2.11 User Interface](#anc-ui) - - [1.2.12 Effects](#anc-effects) -- [2. Content Directory Structure](#structure) - - [2e1 Example Project Content Structure](#2e1) - - [2.1 Folder Names](#structure-folder-names) - - [2.1.1 Always Use PascalCase](#2.1.1) - - [2.1.2 Never Use Spaces](#2.1.2) - - [2.1.3 Never Use Unicode Characters And Other Symbols](#2.1.3) - - [2.2 Use A Top Level Folder For Project Specific Assets](#structure-top-level) - - [2.2.1 No Global Assets](#2.2.1) - - [2.2.2 Reduce Migration Conflicts](#2.2.2) - - [2.2.2e1 Master Material Example](#2.2.2e1) - - [2.2.3 Samples, Templates, and Marketplace Content Are Risk-Free](#2.2.3) - - [2.2.4 DLC, Sub-Projects, and Patches Are Easily Maintained](#2.2.4) - - [2.3 Use Developers Folder For Local Testing](#structure-developers) - - [2.4 All Map* Files Belong In A Folder Called Maps](#structure-maps) - - [2.5 Use A `Core` Folder For Critical Blueprints And Other Assets](#structure-core) - - [2.6 Do Not Create Folders Called `Assets` or `AssetTypes`](#structure-assettypes) - - [2.6.1 Creating a folder named `Assets` is redundant](#2.6.1) - - [2.6.2 Creating a folder named `Meshes`, `Textures`, or `Materials` is redundant](#2.6.2) - - [2.7 Very Large Asset Sets Get Their Own Folder Layout](#structure-large-sets) - - [2.8 `MaterialLibrary`](#structure-material-library) - - [2.9 No Empty Folders](#structure-no-empty-folders) -- [3. Blueprints](#bp) - - [3.1 Compiling](#bp-compiling) - - [3.2 Variables](#bp-vars) - - [3.2.1 Naming](#bp-var-naming) - - [3.2.1.1 Nouns](#bp-var-naming-nouns) - - [3.2.1.2 PascalCase](#bp-var-naming-case) - - [3.2.1.2e Examples](#3.2.1.2e) - - [3.2.1.3 Boolean `b` Prefix](#bp-var-bool-prefix) - - [3.2.1.4 Boolean Names](#bp-var-bool-names) - - [3.2.1.4.1 General And Independent State Information](#3.2.1.4.1) - - [3.2.1.4.2 Complex States](#3.2.1.4.2) - - [3.2.1.5 Considered Context](#bp-vars-naming-context) - - [3.2.1.5e Examples](#3.2.1.5e) - - [3.2.1.6 Do _Not_ Include Atomic Type Names](#bp-vars-naming-atomic) - - [3.2.1.7 Do Include Non-Atomic Type Names](#bp-vars-naming-complex) - - [3.2.1.8 Arrays](#bp-vars-naming-arrays) - - [3.2.2 Editable Variables](#bp-vars-editable) - - [3.2.2.1 Tooltips](#bp-vars-editable-tooltips) - - [3.2.2.2 Slider And Value Ranges](#bp-vars-editable-ranges) - - [3.2.3 Categories](#bp-vars-categories) - - [3.2.4 Variable Access Level](#bp-vars-access) - - [3.2.4.1 Private Variables](#bp-vars-access-private) - - [3.2.5 Advanced Display](#bp-vars-advanced) - - [3.2.6 Transient Variables](#bp-vars-transient) - - [3.2.8 Config Variables](#bp-vars-config) - - [3.3 Functions, Events, and Event Dispatchers](#bp-functions) - - [3.3.1 Function Naming](#bp-funcs-naming) - - [3.3.1.1 All Functions Should Be Verbs](#bp-funcs-naming-verbs) - - [3.3.1.2 Property RepNotify Functions Always `OnRep_Variable`](#bp-funcs-naming-onrep) - - [3.3.1.3 Info Functions Returning Bool Should Ask Questions](#bp-funcs-naming-bool) - - [3.3.1.4 Event Handlers and Dispatchers Should Start With `On`](#bp-funcs-naming-eventhandlers) - - [3.3.1.5 Remote Procedure Calls Should Be Prefixed With Target](#bp-funcs-naming-rpcs) - - [3.3.2 All Functions Must Have Return Nodes](#bp-funcs-return) - - [3.3.3 No Function Should Have More Than 50 Nodes](#bp-graphs-funcs-node-limit) - - [3.3.4 All Public Functions Should Have A Description](#bp-graphs-funcs-description) - - [3.3.5 All Custom Static Plugin `BlueprintCallable` Functions Must Be Categorized By Plugin Name](#bp-graphs-funcs-plugin-category) - - [3.4 Blueprint Graphs](#bp-graphs) - - [3.4.1 No Spaghetti](#bp-graphs-spaghetti) - - [3.4.2 Align Wires Not Nodes](#bp-graphs-align-wires) - - [3.4.3 White Exec Lines Are Top Priority](#bp-graphs-exec-first-class) - - [3.4.4 Graphs Should Be Reasonably Commented](#bp-graphs-block-comments) - - [3.4.5 Graphs Should Handle Casting Errors Where Appropriate](#bp-graphs-cast-error-handling) - - [3.4.6 Graphs Should Not Have Any Dangling / Loose / Dead Nodes](#bp-graphs-dangling-nodes) -- [4. Static Meshes](#4) - - [4.1 Static Mesh UVs](#s-uvs) - - [4.1.1 All Meshes Must Have UVs](#s-uvs-no-missing) - - [4.1.2 All Meshes Must Not Have Overlapping UVs for Lightmaps](#s-uvs-no-overlapping) - - [4.2 LODs Should Be Set Up Correctly](#s-lods) - - [4.3 Modular Socketless Assets Should Snap To The Grid Cleanly](#s-modular-snapping) - - [4.4 All Meshes Must Have Collision](#s-collision) - - [4.5 All Meshes Should Be Scaled Correctly](#s-scaled) -- [5. Niagara](#Niagara) - - [5.1 No Spaces, Ever](#ng-rules) -- [6. Levels / Maps](#levels) - - [6.1 No Errors Or Warnings](#levels-no-errors-or-warnings) - - [6.2 Lighting Should Be Built](#levels-lighting-should-be-built) - - [6.3 No Player Visible Z Fighting](#levels-no-visible-z-fighting) - - [6.4 Marketplace Specific Rules](#levels-mp-rules) - - [6.4.1 Overview Level](#levels-mp-rules-overview) - - [6.4.2 Demo Level](#levels-mp-rules-demo) -- [7. Textures](#textures) - - [7.1 Dimensions Are Powers of 2](#textures-dimensions) - - [7.2 Texture Density Should Be Uniform](#textures-density) - - [7.3 Textures Should Be No Bigger than 8192](#textures-max-size) - - [7.4 Textures Should Be Grouped Correctly](#textures-group) +- [1. Globally Enforced Opinions](#1) + - [1.1 Forbidden Characters](#1.1) + - [1.1.1 Identifiers](#identifiers) +- [2. Asset Naming Conventions](#anc) + - [2.1 Base Asset Name - `Prefix_BaseAssetName_Variant_Suffix`](#base-asset-name) + - [2.1 Examples](#2.1-examples) + - [2.2 Asset Name Modifiers](#asset-name-modifiers) + - [2.2.1 Most Common](#anc-common) + - [2.2.2 Animations](#anc-animations) + - [2.2.3 Artificial Intelligence](#anc-ai) + - [2.2.4 Blueprints](#anc-bp) + - [2.2.5 Materials](#anc-materials) + - [2.2.6 Textures](#anc-textures) + - [2.2.6.1 Texture Packing](#anc-textures-packing) + - [2.2.7 Miscellaneous](#anc-misc) + - [2.2.8 Paper 2D](#anc-paper2d) + - [2.2.9 Physics](#anc-physics) + - [2.2.10 Sounds](#anc-sounds) + - [2.2.11 User Interface](#anc-ui) + - [2.2.12 Effects](#anc-effects) +- [3. Content Directory Structure](#structure) + - [3e1 Example Project Content Structure](#3e1) + - [3.1 Folder Names](#structure-folder-names) + - [3.1.1 Always Use PascalCase](#3.1.1) + - [3.1.2 Never Use Spaces](#3.1.2) + - [3.1.3 Never Use Unicode Characters And Other Symbols](#3.1.3) + - [3.2 Use A Top Level Folder For Project Specific Assets](#structure-top-level) + - [3.2.1 No Global Assets](#3.2.1) + - [3.2.2 Reduce Migration Conflicts](#3.2.2) + - [3.2.2e1 Master Material Example](#3.2.2e1) + - [3.2.3 Samples, Templates, and Marketplace Content Are Risk-Free](#3.2.3) + - [3.2.4 DLC, Sub-Projects, and Patches Are Easily Maintained](#3.2.4) + - [3.3 Use Developers Folder For Local Testing](#structure-developers) + - [3.4 All Map* Files Belong In A Folder Called Maps](#structure-maps) + - [3.5 Use A `Core` Folder For Critical Blueprints And Other Assets](#structure-core) + - [3.6 Do Not Create Folders Called `Assets` or `AssetTypes`](#structure-assettypes) + - [3.6.1 Creating a folder named `Assets` is redundant](#3.6.1) + - [3.6.2 Creating a folder named `Meshes`, `Textures`, or `Materials` is redundant](#3.6.2) + - [3.7 Very Large Asset Sets Get Their Own Folder Layout](#structure-large-sets) + - [3.8 `MaterialLibrary`](#structure-material-library) + - [3.9 No Empty Folders](#structure-no-empty-folders) +- [4. Blueprints](#bp) + - [4.1 Compiling](#bp-compiling) + - [4.2 Variables](#bp-vars) + - [4.2.1 Naming](#bp-var-naming) + - [4.2.1.1 Nouns](#bp-var-naming-nouns) + - [4.2.1.2 PascalCase](#bp-var-naming-case) + - [4.2.1.2e Examples](#4.2.1.2e) + - [4.2.1.3 Boolean `b` Prefix](#bp-var-bool-prefix) + - [4.2.1.4 Boolean Names](#bp-var-bool-names) + - [4.2.1.4.1 General And Independent State Information](#4.2.1.4.1) + - [4.2.1.4.2 Complex States](#4.2.1.4.2) + - [4.2.1.5 Considered Context](#bp-vars-naming-context) + - [4.2.1.5e Examples](#4.2.1.5e) + - [4.2.1.6 Do _Not_ Include Atomic Type Names](#bp-vars-naming-atomic) + - [4.2.1.7 Do Include Non-Atomic Type Names](#bp-vars-naming-complex) + - [4.2.1.8 Arrays](#bp-vars-naming-arrays) + - [4.2.2 Editable Variables](#bp-vars-editable) + - [4.2.2.1 Tooltips](#bp-vars-editable-tooltips) + - [4.2.2.2 Slider And Value Ranges](#bp-vars-editable-ranges) + - [4.2.3 Categories](#bp-vars-categories) + - [4.2.4 Variable Access Level](#bp-vars-access) + - [4.2.4.1 Private Variables](#bp-vars-access-private) + - [4.2.5 Advanced Display](#bp-vars-advanced) + - [4.2.6 Transient Variables](#bp-vars-transient) + - [4.2.8 Config Variables](#bp-vars-config) + - [4.3 Functions, Events, and Event Dispatchers](#bp-functions) + - [4.3.1 Function Naming](#bp-funcs-naming) + - [4.3.1.1 All Functions Should Be Verbs](#bp-funcs-naming-verbs) + - [4.3.1.2 Property RepNotify Functions Always `OnRep_Variable`](#bp-funcs-naming-onrep) + - [4.3.1.3 Info Functions Returning Bool Should Ask Questions](#bp-funcs-naming-bool) + - [4.3.1.4 Event Handlers and Dispatchers Should Start With `On`](#bp-funcs-naming-eventhandlers) + - [4.3.1.5 Remote Procedure Calls Should Be Prefixed With Target](#bp-funcs-naming-rpcs) + - [4.3.2 All Functions Must Have Return Nodes](#bp-funcs-return) + - [4.3.3 No Function Should Have More Than 50 Nodes](#bp-graphs-funcs-node-limit) + - [4.3.4 All Public Functions Should Have A Description](#bp-graphs-funcs-description) + - [4.3.5 All Custom Static Plugin `BlueprintCallable` Functions Must Be Categorized By Plugin Name](#bp-graphs-funcs-plugin-category) + - [4.4 Blueprint Graphs](#bp-graphs) + - [4.4.1 No Spaghetti](#bp-graphs-spaghetti) + - [4.4.2 Align Wires Not Nodes](#bp-graphs-align-wires) + - [4.4.3 White Exec Lines Are Top Priority](#bp-graphs-exec-first-class) + - [4.4.4 Graphs Should Be Reasonably Commented](#bp-graphs-block-comments) + - [4.4.5 Graphs Should Handle Casting Errors Where Appropriate](#bp-graphs-cast-error-handling) + - [4.4.6 Graphs Should Not Have Any Dangling / Loose / Dead Nodes](#bp-graphs-dangling-nodes) +- [5. Static Meshes](#5) + - [5.1 Static Mesh UVs](#s-uvs) + - [5.1.1 All Meshes Must Have UVs](#s-uvs-no-missing) + - [5.1.2 All Meshes Must Not Have Overlapping UVs for Lightmaps](#s-uvs-no-overlapping) + - [5.2 LODs Should Be Set Up Correctly](#s-lods) + - [5.3 Modular Socketless Assets Should Snap To The Grid Cleanly](#s-modular-snapping) + - [5.4 All Meshes Must Have Collision](#s-collision) + - [5.5 All Meshes Should Be Scaled Correctly](#s-scaled) +- [6. Niagara](#Niagara) + - [6.1 No Spaces, Ever](#ng-rules) +- [7. Levels / Maps](#levels) + - [7.1 No Errors Or Warnings](#levels-no-errors-or-warnings) + - [7.2 Lighting Should Be Built](#levels-lighting-should-be-built) + - [7.3 No Player Visible Z Fighting](#levels-no-visible-z-fighting) + - [7.4 Marketplace Specific Rules](#levels-mp-rules) + - [7.4.1 Overview Level](#levels-mp-rules-overview) + - [7.4.2 Demo Level](#levels-mp-rules-demo) +- [8. Textures](#textures) + - [8.1 Dimensions Are Powers of 2](#textures-dimensions) + - [8.2 Texture Density Should Be Uniform](#textures-density) + - [8.3 Textures Should Be No Bigger than 8192](#textures-max-size) + - [8.4 Textures Should Be Grouped Correctly](#textures-group) ## Important Terminology @@ -247,15 +247,17 @@ Gamemakin LLC is not a lawyer, but please don't introduce illegal actions and be * Don't steal content * Follow licensing restrictions on content, e.g. attribute when attributions are needed - -## 00. Globally Enforced Opinions +**[⬆ Back to Top](#table-of-contents)** -@TODO: Make this section 1 and update this document accordingly. Or maybe we don't? - -### 00.1 Forbidden Characters + +## 01. Globally Enforced Opinions - + +### 1.1 Forbidden Characters + + + #### Identifiers In any `Identifier` of any kind, **never** use the following unless absolutely forced to: @@ -274,17 +276,20 @@ Any `Identifier` should strive to only have the following characters when possib The reasoning for this is this will ensure the greatest compatibility of all data across all platforms across all tools, and help prevent downtime due to potentially bad character handling for identifiers in code you don't control. +**[⬆ Back to Top](#table-of-contents)** + + - -## 1. Asset Naming Conventions + +## 2. Asset Naming Conventions Naming conventions should be treated as law. A project that conforms to a naming convention is able to have its assets managed, searched, parsed, and maintained with incredible ease. Most things are prefixed with prefixes being generally an acronym of the asset type followed by an underscore. - -### 1.1 Base Asset Name - `Prefix_BaseAssetName_Variant_Suffix` + +### 2.1 Base Asset Name - `Prefix_BaseAssetName_Variant_Suffix` All assets should have a _Base Asset Name_. A Base Asset Name represents a logical grouping of related assets. Any asset that is part of this logical group should follow the standard of `Prefix_BaseAssetName_Variant_Suffix`. @@ -300,10 +305,10 @@ For unique but generic variations of assets, `Variant` is a two digit number sta Depending on how your asset variants are made, you can chain together variant names. For example, if you are creating flooring assets for an Arch Viz project you should use the base name `Flooring` with chained variants such as `Flooring_Marble_01`, `Flooring_Maple_01`, `Flooring_Tile_Squares_01`. - -#### 1.1 Examples + +#### 2.1 Examples -##### 1.1e1 Bob +##### 2.1e1 Bob | Asset Type | Asset Name | | ----------------------- | ---------------------------------------------------------- | @@ -313,7 +318,7 @@ Depending on how your asset variants are made, you can chain together variant na | Texture (Normal) | T_Bob_N | | Texture (Evil Diffuse) | T_Bob_Evil_D | -##### 1.1e2 Rocks +##### 2.1e2 Rocks | Asset Type | Asset Name | | ----------------------- | ---------------------------------------------------------- | @@ -324,14 +329,14 @@ Depending on how your asset variants are made, you can chain together variant na | Material Instance (Snow)| MI_Rock_Snow | - -### 1.2 Asset Name Modifiers + +### 2.2 Asset Name Modifiers When naming an asset, use these tables to determine the prefix and suffix to use with an asset's [Base Asset Name](#base-asset-name). - -#### 1.2.1 Most Common + +#### 2.2.1 Most Common | Asset Type | Prefix | Suffix | Notes | | ----------------------- | ---------- | ---------- | -------------------------------- | @@ -350,8 +355,8 @@ When naming an asset, use these tables to determine the prefix and suffix to use | Widget Blueprint | WBP_ | | | - -#### 1.2.2 Animations + +#### 2.2.2 Animations | Asset Type | Prefix | Suffix | Notes | | ----------------------- | ---------- | ---------- | -------------------------------- | @@ -371,8 +376,8 @@ When naming an asset, use these tables to determine the prefix and suffix to use | Skeleton | SKEL_ | | | - -### 1.2.3 Artificial Intelligence + +### 2.2.3 Artificial Intelligence | Asset Type | Prefix | Suffix | Notes | | ----------------------- | ---------- | ---------- | -------------------------------- | @@ -386,8 +391,8 @@ When naming an asset, use these tables to determine the prefix and suffix to use | EnvQueryContext | EQS_ | Context | | - -### 1.2.4 Blueprints + +### 2.2.4 Blueprints | Asset Type | Prefix | Suffix | Notes | | ----------------------- | ---------- | ---------- | -------------------------------- | @@ -402,8 +407,8 @@ When naming an asset, use these tables to determine the prefix and suffix to use | Widget Blueprint | WBP_ | | | - -### 1.2.5 Materials + +### 2.2.5 Materials | Asset Type | Prefix | Suffix | Notes | | ----------------------------- | ---------- | ---------- | -------------------------------- | @@ -417,8 +422,8 @@ When naming an asset, use these tables to determine the prefix and suffix to use | Decal | M_, MI_ | _Decal | | - -### 1.2.6 Textures + +### 2.2.6 Textures | Asset Type | Prefix | Suffix | Notes | | ----------------------- | ---------- | ---------- | -------------------------------- | @@ -441,8 +446,8 @@ When naming an asset, use these tables to determine the prefix and suffix to use | Texture Light Profile | TLP | | | - -#### 1.2.6.1 Texture Packing + +#### 2.2.6.1 Texture Packing It is common practice to pack multiple layers of texture data into one texture. An example of this is packing Emissive, Roughness, Ambient Occlusion together as the Red, Green, and Blue channels of a texture respectively. To determine the suffix, simply stack the given suffix letters from above together, e.g. `_ERO`. > It is generally acceptable to include an Alpha/Opacity layer in your Diffuse/Albedo's alpha channel and as this is common practice, adding `A` to the `_D` suffix is optional. @@ -450,8 +455,8 @@ It is common practice to pack multiple layers of texture data into one texture. Packing 4 channels of data into a texture (RGBA) is not recommended except for an Alpha/Opacity mask in the Diffuse/Albedo's alpha channel as a texture with an alpha channel incurs more overhead than one without. - -### 1.2.7 Miscellaneous + +### 2.2.7 Miscellaneous | Asset Type | Prefix | Suffix | Notes | | -------------------------- | ---------- | ---------- | -------------------------------- | @@ -479,8 +484,8 @@ Packing 4 channels of data into a texture (RGBA) is not recommended except for a | Vector Curve | Curve_ | _Vector | | - -### 1.2.8 Paper 2D + +### 2.2.8 Paper 2D | Asset Type | Prefix | Suffix | Notes | | ----------------------- | ---------- | ---------- | -------------------------------- | @@ -491,8 +496,8 @@ Packing 4 channels of data into a texture (RGBA) is not recommended except for a | Tile Set | TS_ | | | - -### 1.2.9 Physics + +### 2.2.9 Physics | Asset Type | Prefix | Suffix | Notes | | ----------------------- | ---------- | ---------- | -------------------------------- | @@ -501,8 +506,8 @@ Packing 4 channels of data into a texture (RGBA) is not recommended except for a | Destructible Mesh | DM_ | | | - -### 1.2.10 Sounds + +### 2.2.10 Sounds | Asset Type | Prefix | Suffix | Notes | | ----------------------- | ---------- | ---------- | -------------------------------- | @@ -518,8 +523,8 @@ Packing 4 channels of data into a texture (RGBA) is not recommended except for a | Sound Wave | A_ | | | - -### 1.2.11 User Interface + +### 2.2.11 User Interface | Asset Type | Prefix | Suffix | Notes | | ----------------------- | ---------- | ---------- | -------------------------------- | @@ -529,8 +534,8 @@ Packing 4 channels of data into a texture (RGBA) is not recommended except for a | Widget Blueprint | WBP_ | | | - -### 1.2.12 Effects + +### 2.2.12 Effects | Asset Type | Prefix | Suffix | Notes | | ----------------------- | ---------- | ---------- | -------------------------------- | @@ -539,21 +544,22 @@ Packing 4 channels of data into a texture (RGBA) is not recommended except for a **[⬆ Back to Top](#table-of-contents)** - + + -## 2. Content Directory Structure +## 3. Content Directory Structure Equally important as asset names, the directory structure style of a project should be considered law. Asset naming conventions and content directory structure go hand in hand, and a violation of either causes unneeded chaos. There are multiple ways to lay out the content of a UE4 project. In this style, we will be using a structure that relies more on filtering and search abilities of the Content Browser for those working with assets to find assets of a specific type instead of another common structure that groups asset types with folders. -> If you are using the prefix [naming convention](#1.2) above, using folders to contain assets of similar types such as `Meshes`, `Textures`, and `Materials` is a redundant practice as asset types are already both sorted by prefix as well as able to be filtered in the content browser. +> If you are using the prefix [naming convention](#2.2) above, using folders to contain assets of similar types such as `Meshes`, `Textures`, and `Materials` is a redundant practice as asset types are already both sorted by prefix as well as able to be filtered in the content browser. - -### 2e1 Example Project Content Structure + +### 3e1 Example Project Content Structure
 |-- Content
-    |-- GenericShooter
+    |-- GenericShooter
         |-- Art
         |   |-- Industrial
         |   |   |-- Ambient
@@ -568,15 +574,15 @@ There are multiple ways to lay out the content of a UE4 project. In this style,
         |-- Characters
         |   |-- Bob
         |   |-- Common
-        |   |   |-- Animations
+        |   |   |-- Animations
         |   |   |-- Audio
         |   |-- Jack
         |   |-- Steve
-        |   |-- Zoe
-        |-- Core
+        |   |-- Zoe
+        |-- Core
         |   |-- Characters
         |   |-- Engine
-        |   |-- GameModes
+        |   |-- GameModes
         |   |-- Interactables
         |   |-- Pickups
         |   |-- Weapons
@@ -584,10 +590,10 @@ There are multiple ways to lay out the content of a UE4 project. In this style,
         |   |-- Electrical
         |   |-- Fire
         |   |-- Weather
-        |-- Maps
+        |-- Maps
         |   |-- Campaign1
         |   |-- Campaign2
-        |-- MaterialLibrary
+        |-- MaterialLibrary
         |   |-- Debug
         |   |-- Metal
         |   |-- Paint
@@ -605,52 +611,52 @@ There are multiple ways to lay out the content of a UE4 project. In this style,
 
 The reasons for this structure are listed in the following sub-sections.
 
-
+
 
-### 2.1 Folder Names
+### 3.1 Folder Names
 
 These are common rules for naming any folder in the content structure.
 
-
-#### 2.1.1 Always Use PascalCase[*](#terms-cases)
+
+#### 3.1.1 Always Use PascalCase[*](#terms-cases)
 
 PascalCase refers to starting a name with a capital letter and then instead of using spaces, every following word also starts with a capital letter. For example, `DesertEagle`, `RocketPistol`, and `ASeriesOfWords`.
 
 See [Cases](#terms-cases).
 
-
-#### 2.1.2 Never Use Spaces
+
+#### 3.1.2 Never Use Spaces
 
-Re-enforcing [2.1.1](#2.1.1), never use spaces. Spaces can cause various engineering tools and batch processes to fail. Ideally, your project's root also contains no spaces and is located somewhere such as `D:\Project` instead of `C:\Users\My Name\My Documents\Unreal Projects`.
+Re-enforcing [3.1.1](#3.1.1), never use spaces. Spaces can cause various engineering tools and batch processes to fail. Ideally, your project's root also contains no spaces and is located somewhere such as `D:\Project` instead of `C:\Users\My Name\My Documents\Unreal Projects`.
 
-
-#### 2.1.3 Never Use Unicode Characters And Other Symbols
+
+#### 3.1.3 Never Use Unicode Characters And Other Symbols
 
-If one of your game characters is named 'Zoë', its folder name should be `Zoe`. Unicode characters can be worse than [Spaces](#2.1.2) for engineering tool and some parts of UE4 don't support Unicode characters in paths either.
+If one of your game characters is named 'Zoë', its folder name should be `Zoe`. Unicode characters can be worse than [Spaces](#3.1.2) for engineering tool and some parts of UE4 don't support Unicode characters in paths either.
 
 Related to this, if your project has [unexplained issues](https://answers.unrealengine.com/questions/101207/undefined.html) and your computer's user name has a Unicode character (i.e. your name is `Zoë`), any project located in your `My Documents` folder will suffer from this issue. Often simply moving your project to something like `D:\Project` will fix these mysterious issues.
 
 Using other characters outside `a-z`, `A-Z`, and `0-9` such as `@`, `-`, `_`, `,`, `*`, and `#` can also lead to unexpected and hard to track issues on other platforms, source control, and weaker engineering tools.
 
-
+
 
-### 2.2 Use A Top Level Folder For Project Specific Assets
+### 3.2 Use A Top Level Folder For Project Specific Assets
 
 All of a project's assets should exist in a folder named after the project. For example, if your project is named 'Generic Shooter', _all_ of it's content should exist in `Content/GenericShooter`.
 
-> The `Developers` folder is not for assets that your project relies on and therefore is not project specific. See [Developer Folders](#2.3) for details about this.
+> The `Developers` folder is not for assets that your project relies on and therefore is not project specific. See [Developer Folders](#3.3) for details about this.
 
 There are multiple reasons for this approach.
 
-
-#### 2.2.1 No Global Assets
+
+#### 3.2.1 No Global Assets
 
 Often in code style guides it is written that you should not pollute the global namespace and this follows the same principle. When assets are allowed to exist outside of a project folder, it often becomes much harder to enforce a strict structure layout as assets not in a folder encourages the bad behavior of not having to organize assets.
 
-Every asset should have a purpose, otherwise it does not belong in a project. If an asset is an experimental test and shouldn't be used by the project it should be put in a [`Developer`](#2.3) folder.
+Every asset should have a purpose, otherwise it does not belong in a project. If an asset is an experimental test and shouldn't be used by the project it should be put in a [`Developer`](#3.3) folder.
 
-
-#### 2.2.2 Reduce Migration Conflicts
+
+#### 3.2.2 Reduce Migration Conflicts
 
 When working on multiple projects it is common for a team to copy assets from one project to another if they have made something useful for both. When this occurs, the easiest way to perform the copy is to use the Content Browser's Migrate functionality as it will copy over not just the selected asset but all of its dependencies.
 
@@ -660,8 +666,8 @@ This is also the primary reason why Epic's Marketplace staff enforces the same p
 
 After a migration, safe merging of assets can be done using the 'Replace References' tool in the content browser with the added clarity of assets not belonging to a project's top level folder are clearly pending a merge. Once assets are merged and fully migrated, there shouldn't be another top level folder in your Content tree. This method is _100%_ guaranteed to make any migrations that occur completely safe.
 
-
-##### 2.2.2e1 Master Material Example
+
+##### 3.2.2e1 Master Material Example
 
 For example, say you created a master material in one project that you would like to use in another project so you migrated that asset over. If this asset is not in a top level folder, it may have a name like `Content/MaterialLibrary/M_Master`. If the target project doesn't have a master material already, this should work without issue.
 
@@ -673,23 +679,23 @@ This issue can be hard to predict and hard to account for. The person migrating
 
 It is at this point where if the master materials for both projects are incompatible in _any way_, you risk breaking possibly the entire material library for a project as well as any other dependencies that may have already been migrated, simply because assets were not stored in a top level folder. The simple migration of static meshes now becomes a very ugly task.
 
-
-#### 2.2.3 Samples, Templates, and Marketplace Content Are Risk-Free
+
+#### 3.2.3 Samples, Templates, and Marketplace Content Are Risk-Free
 
-An extension to [2.2.2](#2.2.2), if a team member decides to add sample content, template files, or assets they bought from the marketplace, it is guaranteed, as long your project's top-level folder is uniquely named,that these new assets will not interfere with your project.
+An extension to [3.2.2](#3.2.2), if a team member decides to add sample content, template files, or assets they bought from the marketplace, it is guaranteed, as long your project's top-level folder is uniquely named,that these new assets will not interfere with your project.
 
-You can not trust marketplace content to fully conform to the [top level folder rule](#2.2). There exists many assets that have the majority of their content in a top level folder but also have possibly modified Epic sample content as well as level files polluting the global `Content` folder.
+You can not trust marketplace content to fully conform to the [top level folder rule](#3.2). There exists many assets that have the majority of their content in a top level folder but also have possibly modified Epic sample content as well as level files polluting the global `Content` folder.
 
-When adhering to [2.2](#2.2), the worst marketplace conflict you can have is if two marketplace assets both have the same Epic sample content. If all your assets are in a project specific folder, including sample content you may have moved into your folder, your project will never break.
+When adhering to [3.2](#3.2), the worst marketplace conflict you can have is if two marketplace assets both have the same Epic sample content. If all your assets are in a project specific folder, including sample content you may have moved into your folder, your project will never break.
 
-
-#### 2.2.4 DLC, Sub-Projects, and Patches Are Easily Maintained
+
+#### 3.2.4 DLC, Sub-Projects, and Patches Are Easily Maintained
 
 If your project plans to release DLC or has multiple sub-projects associated with it that may either be migrated out or simply not cooked in a build, assets relating to these projects should have their own separate top level content folder. This make cooking DLC separate from main project content far easier. Sub-projects can also be migrated in and out with minimal effort. If you need to change a material of an asset or add some very specific asset override behavior in a patch, you can easily put these changes in a patch folder and work safely without the chance of breaking the core project.
 
-
+
 
-### 2.3 Use Developers Folder For Local Testing
+### 3.3 Use Developers Folder For Local Testing
 
 During a project's development, it is very common for team members to have a sort of 'sandbox' where they can experiment freely without risking the core project. Because this work may be ongoing, these team members may wish to put their assets on a project's source control server. Not all teams require use of Developer folders, but ones that do use them often run into a common problem with assets submitted to source control.
 
@@ -699,9 +705,9 @@ If these modular assets were placed in a Developer folder, the world builder sho
 
 Once the assets are ready for use, an artist simply has to move the assets into the project specific folder and fix up redirectors. This is essentially 'promoting' the assets from experimental to production.
 
-
+
 
-### 2.4 All Map[*](#terms-level-map) Files Belong In A Folder Called Maps
+### 3.4 All Map[*](#terms-level-map) Files Belong In A Folder Called Maps
 
 Map files are incredibly special and it is common for every project to have its own map naming system, especially if they work with sub-levels or streaming levels. No matter what system of map organization is in place for the specific project, all levels should belong in `/Content/Project/Maps`.
 
@@ -709,9 +715,9 @@ Being able to tell someone to open a specific map without having to explain wher
 
 This also simplifies the job of cooking for engineers. Wrangling levels for a build process can be extremely frustrating if they have to dig through arbitrary folders for them. If a team's maps are all in one place, it is much harder to accidentally not cook a map in a build. It also simplifies lighting build scripts as well as QA processes.
 
-
+
 
-### 2.5 Use A `Core` Folder For Critical Blueprints And Other Assets
+### 3.5 Use A `Core` Folder For Critical Blueprints And Other Assets
 
 Use `/Content/Project/Core` folder for assets that are absolutely fundamental to a project's workings. For example, base `GameMode`, `Character`, `PlayerController`, `GameState`, `PlayerState`, and related Blueprints should live here.
 
@@ -719,17 +725,17 @@ This creates a very clear "don't touch these" message for other team members. No
 
 For example, if your project requires pickups that can be placed in a level, there should exist a base Pickup class in `Core/Pickups` that defines base behavior for a pickup. Specific pickups such as a Health or Ammo should exist in a folder such as `/Content/Project/Placeables/Pickups/`. Game designers can define and tweak pickups in this folder however they please, but they should not touch `Core/Pickups` as they may unintentionally break pickups project-wide.
 
-
+
 
-### 2.6 Do Not Create Folders Called `Assets` or `AssetTypes`
+### 3.6 Do Not Create Folders Called `Assets` or `AssetTypes`
 
-
-#### 2.6.1 Creating a folder named `Assets` is redundant
+
+#### 3.6.1 Creating a folder named `Assets` is redundant
 
 All assets are assets.
 
-
-#### 2.6.2 Creating a folder named `Meshes`, `Textures`, or `Materials` is redundant
+
+#### 3.6.2 Creating a folder named `Meshes`, `Textures`, or `Materials` is redundant
 
 All asset names are named with their asset type in mind. These folders offer only redundant information and the use of these folders can easily be replaced with the robust and easy to use filtering system the Content Browser provides.
 
@@ -739,21 +745,21 @@ Want to view only static mesh in `Environment/Rocks/`? Simply turn on the Static
 
 Not doing this also prevents the inevitability of someone putting a static mesh or a texture in a `Materials` folder.
 
-
+
 
-### 2.7 Very Large Asset Sets Get Their Own Folder Layout
+### 3.7 Very Large Asset Sets Get Their Own Folder Layout
 
-This can be seen as a pseudo-exception to [2.6](#2.6).
+This can be seen as a pseudo-exception to [3.6](#3.6).
 
 There are certain asset types that have a huge volume of related files where each asset has a unique purpose. The two most common are Animation and Audio assets. If you find yourself having 15+ of these assets that belong together, they should be together.
 
 For example, animations that are shared across multiple characters should lay in `Characters/Common/Animations` and may have sub-folders such as `Locomotion` or `Cinematic`.
 
-> This does not apply to assets like textures and materials. It is common for a `Rocks` folder to have a large amount of textures if there are a large amount of rocks, however these textures are generally only related to a few specific rocks and should be named appropriately. Even if these textures are part of a [Material Library](#2.8).
+> This does not apply to assets like textures and materials. It is common for a `Rocks` folder to have a large amount of textures if there are a large amount of rocks, however these textures are generally only related to a few specific rocks and should be named appropriately. Even if these textures are part of a [Material Library](#3.8).
 
-
+
 
-### 2.8 `MaterialLibrary`
+### 3.8 `MaterialLibrary`
 
 If your project makes use of master materials, layered materials, or any form of reusable materials or textures that do not belong to any subset of assets, these assets should be located in `Content/Project/MaterialLibrary`.
 
@@ -765,36 +771,36 @@ The `MaterialLibrary` doesn't have to consist of purely materials. Shared utilit
 
 Any testing or debug materials should be within `MaterialLibrary/Debug`. This allows debug materials to be easily stripped from a project before shipping and makes it incredibly apparent if production assets are using them if reference errors are shown.
 
-
+
 
-### 2.9 No Empty Folders
+### 3.9 No Empty Folders
 
 There simply shouldn't be any empty folders. They clutter the content browser.
 
 If you find that the content browser has an empty folder you can't delete, you should perform the following:
 1. Be sure you're using source control.
-1. Immediately run Fix Up Redirectors on your project.
-1. Navigate to the folder on-disk and delete the assets inside.
-1. Close the editor.
-1. Make sure your source control state is in sync (i.e. if using Perforce, run a Reconcile Offline Work on your content directory)
-1. Open the editor. Confirm everything still works as expected. If it doesn't, revert, figure out what went wrong, and try again.
-1. Ensure the folder is now gone.
-1. Submit changes to source control.
+2. Immediately run Fix Up Redirectors on your project.
+3. Navigate to the folder on-disk and delete the assets inside.
+4. Close the editor.
+5. Make sure your source control state is in sync (i.e. if using Perforce, run a Reconcile Offline Work on your content directory)
+6. Open the editor. Confirm everything still works as expected. If it doesn't, revert, figure out what went wrong, and try again.
+7. Ensure the folder is now gone.
+8. Submit changes to source control.
 
 **[⬆ Back to Top](#table-of-contents)**
 
 
-
+
 
-## 3. Blueprints
+## 4. Blueprints
 
 This section will focus on Blueprint classes and their internals. When possible, style rules conform to [Epic's Coding Standard](https://docs.unrealengine.com/latest/INT/Programming/Development/CodingStandard).
 
 Remember: Blueprinting badly bears blunders, beware! (Phrase by [KorkuVeren](http://github.com/KorkuVeren))
 
-
+
 
-### 3.1 Compiling
+### 4.1 Compiling
 
 All blueprints should compile with zero warnings and zero errors. You should fix blueprint warnings and errors immediately as they can quickly cascade into very scary unexpected behavior.
 
@@ -802,30 +808,30 @@ Do *not* submit broken blueprints to source control. If you must store them on s
 
 Broken blueprints can cause problems that manifest in other ways, such as broken references, unexpected behavior, cooking failures, and frequent unneeded recompilation. A broken blueprint has the power to break your entire game.
 
-
+
 
-### 3.2 Variables
+### 4.2 Variables
 
 The words `variable` and `property` may be used interchangeably.
 
-
+
 
-#### 3.2.1 Naming
+#### 4.2.1 Naming
 
-
+
 
-##### 3.2.1.1 Nouns
+##### 4.2.1.1 Nouns
 
 All non-boolean variable names must be clear, unambiguous, and descriptive nouns.
 
-
+
 
-##### 3.2.1.2 PascalCase
+##### 4.2.1.2 PascalCase
 
 All non-boolean variables should be in the form of [PascalCase](#terms-cases).
 
-
-###### 3.2.1.2e Examples
+
+###### 4.2.1.2e Examples
 
 * `Score`
 * `Kills`
@@ -834,9 +840,9 @@ All non-boolean variables should be in the form of [PascalCase](#terms-cases).
 * `CrosshairColor`
 * `AbilityID`
 
-
+
 
-##### 3.2.1.3 Boolean `b` Prefix
+##### 4.2.1.3 Boolean `b` Prefix
 
 All booleans should be named in PascalCase but prefixed with a lowercase `b`.
 
@@ -844,12 +850,12 @@ Example: Use `bDead` and `bEvil`, **not** `Dead` and `Evil`.
 
 UE4 Blueprint editors know not to include the `b` in user-friendly displays of the variable.
 
-
+
 
-##### 3.2.1.4 Boolean Names
+##### 4.2.1.4 Boolean Names
 
-
-###### 3.2.1.4.1 General And Independent State Information
+
+###### 4.2.1.4.1 General And Independent State Information
 
 All booleans should be named as descriptive adjectives when possible if representing general information. Do not include words that phrase the variable as a question, such as `Is`. This is reserved for functions.
 
@@ -857,8 +863,8 @@ Example: Use `bDead` and `bHostile` **not** `bIsDead` and `bIsHostile`.
 
 Try to not use verbs such as `bRunning`. Verbs tend to lead to complex states.
 
-
-###### 3.2.1.4.2 Complex States
+
+###### 4.2.1.4.2 Complex States
 
 Do not to use booleans to represent complex and/or dependent states. This makes state adding and removing complex and no longer easily readable. Use an enumeration instead.
 
@@ -866,14 +872,14 @@ Example: When defining a weapon, do **not** use `bReloading` and `bEquipping` if
 
 Example: Do **not** use `bRunning` if you also need `bWalking` or `bSprinting`. This should be defined as an enumeration with clearly defined state names.
 
-
+
 
-##### 3.2.1.5 Considered Context
+##### 4.2.1.5 Considered Context
 
 All variable names must not be redundant with their context as all variable references in Blueprint will always have context.
 
-
-###### 3.2.1.5e Examples
+
+###### 4.2.1.5e Examples
 
 Consider a Blueprint called `BP_PlayerCharacter`.
 
@@ -897,9 +903,9 @@ All of these variables are named redundantly. It is implied that the variable is
 * `Skills`
 * `Skin`
 
-
+
 
-##### 3.2.1.6 Do _Not_ Include Atomic Type Names
+##### 4.2.1.6 Do _Not_ Include Atomic Type Names
 
 Atomic or primitive variables are variables that represent data in their simplest form, such as booleans, integers, floats, and enumerations.
 
@@ -917,9 +923,9 @@ The only exception to this rule is when a variable represents 'a number of' some
 
 Example: A fence generator needs to generate X number of posts. Store X in `NumPosts` or `PostsCount` instead of `Posts` as `Posts` may potentially read as an Array of a variable type named `Post`.
 
-
+
 
-##### 3.2.1.7 Do Include Non-Atomic Type Names
+##### 4.2.1.7 Do Include Non-Atomic Type Names
 
 Non-atomic or complex variables are variables that represent data as a collection of atomic variables. Structs, Classes, Interfaces, and primitives with hidden behavior such as `Text` and `Name` all qualify under this rule.
 
@@ -936,18 +942,18 @@ If a class does not own the value a complex variable represents, you should use
 Example: If a `BP_Turret` has the ability to target a `BP_PlayerCharacter`, it should store its target as `TargetPlayer` as when in the context of `BP_Turret` it should be clear that it is a reference to another complex variable type that it does not own.
 
 
-
+
 
-##### 3.2.1.8 Arrays
+##### 4.2.1.8 Arrays
 
 Arrays follow the same naming rules as above, but should be named as a plural noun.
 
 Example: Use `Targets`, `Hats`, and `EnemyPlayers`, **not** `TargetList`, `HatArray`, `EnemyPlayerArray`.
 
 
-
+
 
-#### 3.2.2 Editable Variables
+#### 4.2.2 Editable Variables
 
 All variables that are safe to change the value of in order to configure behavior of a blueprint should be marked as `Editable`.
 
@@ -955,15 +961,15 @@ Conversely, all variables that are not safe to change or should not be exposed t
 
 Do not arbitrarily mark variables as `Editable`.
 
-
+
 
-##### 3.2.2.1 Tooltips
+##### 4.2.2.1 Tooltips
 
 All `Editable` variables, including those marked editable just so they can be marked as `Expose On Spawn`, should have a description in their `Tooltip` fields that explains how changing this value affects the behavior of the blueprint.
 
-
+
 
-##### 3.2.2.2 Slider And Value Ranges
+##### 4.2.2.2 Slider And Value Ranges
 
 All `Editable` variables should make use of slider and value ranges if there is ever a value that a variable should _not_ be set to.
 
@@ -973,9 +979,9 @@ If an editable variable is used in a Construction Script, it should have a reaso
 
 A Value Range only needs to be defined if the bounds of a value are known. While a Slider Range prevents accidental large number inputs, an undefined Value Range allows a user to specify a value outside the Slider Range that may be considered 'dangerous' but still valid.
 
-
+
 
-#### 3.2.3 Categories
+#### 4.2.3 Categories
 
 If a class has only a small number of variables, categories are not required.
 
@@ -997,9 +1003,9 @@ Example: A weapon class set of variables might be organized as:
     |-- State
     |-- Visuals
 
-
+
 
-#### 3.2.4 Variable Access Level
+#### 4.2.4 Variable Access Level
 
 In C++, variables have a concept of access level. Public means any code outside the class can access the variable. Protected means only the class and any child classes can access this variable internally. Private means only this class and no child classes can access this variable.
 
@@ -1007,43 +1013,43 @@ Blueprints do not have a defined concept of protected access currently.
 
 Treat `Editable` variables as public variables. Treat non-editable variables as protected variables.
 
-
+
 
-##### 3.2.4.1 Private Variables
+##### 4.2.4.1 Private Variables
 
 Unless it is known that a variable should only be accessed within the class it is defined and never a child class, do not mark variables as private. Until variables are able to be marked `protected`, reserve private for when you absolutely know you want to restrict child class usage.
 
-
+
 
-#### 3.2.5 Advanced Display
+#### 4.2.5 Advanced Display
 
 If a variable should be editable but often untouched, mark it as `Advanced Display`. This makes the variable hidden unless the advanced display arrow is clicked.
 
 To find the `Advanced Display` option, it is listed as an advanced displayed variable in the variable details list.
 
-
+
 
-#### 3.2.6 Transient Variables
+#### 4.2.6 Transient Variables
 
 Transient variables are variables that do not need to have their value saved and loaded and have an initial value of zero or null. This is useful for references to other objects and actors who's value isn't known until run-time. This prevents the editor from ever saving a reference to it, and speeds up saving and loading of the blueprint class.
 
 Because of this, all transient variables should always be initialized as zero or null. To do otherwise would result in hard to debug errors.
 
-
+
 
-#### 3.2.8 Config Variables
+#### 4.2.8 Config Variables
 
 Do not use the `Config Variable` flag. This makes it harder for designers to control blueprint behavior. Config variables should only be used in C++ for rarely changed variables. Think of them as `Advanced Advanced Display` variables.
 
-
+
 
-### 3.3 Functions, Events, and Event Dispatchers
+### 4.3 Functions, Events, and Event Dispatchers
 
 This section describes how you should author functions, events, and event dispatchers. Everything that applies to functions also applies to events, unless otherwise noted.
 
-
+
 
-#### 3.3.1 Function Naming
+#### 4.3.1 Function Naming
 
 The naming of functions, events, and event dispatchers is critically important. Based on the name alone, certain assumptions can be made about functions. For example:
 
@@ -1055,9 +1061,9 @@ The naming of functions, events, and event dispatchers is critically important.
 
 These questions and more can all be answered when functions are named appropriately.
 
-
+
 
-#### 3.3.1.1 All Functions Should Be Verbs
+#### 4.3.1.1 All Functions Should Be Verbs
 
 All functions and events perform some form of action, whether its getting info, calculating data, or causing something to explode. Therefore, all functions should all start with verbs. They should be worded in the present tense whenever possible. They should also have some context as to what they are doing.
 
@@ -1084,15 +1090,15 @@ Bad examples:
 * `PlayerState` - Nouns are ambiguous.
 * `Color` - Verb with no context, or ambiguous noun.
 
-
+
 
-#### 3.3.1.2 Property RepNotify Functions Always `OnRep_Variable`
+#### 4.3.1.2 Property RepNotify Functions Always `OnRep_Variable`
 
 All functions for replicated with notification variables should have the form `OnRep_Variable`. This is forced by the Blueprint editor. If you are writing a C++ `OnRep` function however, it should also follow this convention when exposing it to Blueprints.
 
-
+
 
-#### 3.3.1.3 Info Functions Returning Bool Should Ask Questions
+#### 4.3.1.3 Info Functions Returning Bool Should Ask Questions
 
 When writing a function that does not change the state of or modify any object and is purely for getting information, state, or computing a yes/no value, it should ask a question. This should also follow [the verb rule](#bp-funcs-naming-verbs).
 
@@ -1117,9 +1123,9 @@ Bad examples:
 * `Dead` - Is dead? Will deaden?
 * `Visibility` - Is visible? Set visibility? A description of flying conditions?
 
-
+
 
-#### 3.3.1.4 Event Handlers and Dispatchers Should Start With `On`
+#### 4.3.1.4 Event Handlers and Dispatchers Should Start With `On`
 
 Any function that handles an event or dispatches an event should start with `On` and continue to follow [the verb rule](#bp-funcs-naming-verbs). The verb may move to the end however if past-tense reads better.
 
@@ -1144,9 +1150,9 @@ Bad examples:
 * `HandleMessage`
 * `HandleDeath`
 
-
+
 
-#### 3.3.1.5 Remote Procedure Calls Should Be Prefixed With Target
+#### 4.3.1.5 Remote Procedure Calls Should Be Prefixed With Target
 
 Any time an RPC is created, it should be prefixed with either `Server`, `Client`, or `Multicast`. No exceptions.
 
@@ -1166,9 +1172,9 @@ Bad examples:
 * `ClientWeapon` - No verb, ambiguous.
 
 
-
+
 
-#### 3.3.2 All Functions Must Have Return Nodes
+#### 4.3.2 All Functions Must Have Return Nodes
 
 All functions must have return nodes, no exceptions.
 
@@ -1178,9 +1184,9 @@ The Blueprint compiler is able to follow the flow of execution and will warn you
 
 In situations like where a programmer may add a pin to a Sequence node or add logic after a for loop completes but the loop iteration might return early, this can often result in an accidental error in code flow. The warnings the Blueprint compiler will alert everyone of these issues immediately.
 
-
+
 
-#### 3.3.3 No Function Should Have More Than 50 Nodes
+#### 4.3.3 No Function Should Have More Than 50 Nodes
 
 Simply, no function should have more than 50 nodes. Any function this big should be broken down into smaller functions for readability and ease of maintenance.
 
@@ -1194,37 +1200,37 @@ The following nodes are not counted as they are deemed to not increase function
 * Function Entry
 * Self
 
-
+
 
-#### 3.3.4 All Public Functions Should Have A Description
+#### 4.3.4 All Public Functions Should Have A Description
 
 This rule applies more to public facing or marketplace blueprints, so that others can more easily navigate and consume your blueprint API.
 
 Simply, any function that has an access specificer of Public should have its description filled out.
 
-
+
 
-#### 3.3.5 All Custom Static Plugin `BlueprintCallable` Functions Must Be Categorized By Plugin Name
+#### 4.3.5 All Custom Static Plugin `BlueprintCallable` Functions Must Be Categorized By Plugin Name
 
 If your project includes a plugin that defines `static` `BlueprintCallable` functions, they should have their category set to the plugin's name or a subset category of the plugin's name.
 
 For example, `Zed Camera Interface` or `Zed Camera Interface | Image Capturing`.
 
-
+
 
-### 3.4 Blueprint Graphs
+### 4.4 Blueprint Graphs
 
 This section covers things that apply to all Blueprint graphs.
 
-
+
 
-#### 3.4.1 No Spaghetti
+#### 4.4.1 No Spaghetti
 
 Wires should have clear beginnings and ends. You should never have to mentally untangle wires to make sense of a graph. Many of the following sections are dedicated to reducing spaghetti.
 
-
+
 
-#### 3.4.2 Align Wires Not Nodes
+#### 4.4.2 Align Wires Not Nodes
 
 Always align wires, not nodes. You can't always control the size and pin location on a node, but you can always control the location of a node and thus control the wires. Straight wires provide clear linear flow. Wiggly wires wear wits wickedly. You can straighten wires by using the Straighten Connections command with BP nodes selected. Hotkey: Q
 
@@ -1237,120 +1243,119 @@ Bad Example: The tops of the nodes are aligned creating a wiggly white exec line
 Acceptable Example: Certain nodes might not cooperate no matter how you use the alignment tools. In this situation, try to minimize the wiggle by bringing the node in closer.
 ![Acceptable](https://github.com/Allar/ue5-style-guide/blob/main/images/bp-graphs-align-wires-acceptable.png?raw=true "Acceptable")
 
-
+
 
-#### 3.4.3 White Exec Lines Are Top Priority
+#### 4.4.3 White Exec Lines Are Top Priority
 
 If you ever have to decide between straightening a linear white exec line or straightening data lines of some kind, always straighten the white exec line.
 
-
+
 
-#### 3.4.4 Graphs Should Be Reasonably Commented
+#### 4.4.4 Graphs Should Be Reasonably Commented
 
 Blocks of nodes should be wrapped in comments that describe their higher-level behavior. While every function should be well named so that each individual node is easily readable and understandable, groups of nodes contributing to a purpose should have their purpose described in a comment block. If a function does not have many blocks of nodes and its clear that the nodes are serving a direct purpose in the function's goal, then they do not need to be commented as the function name and  description should suffice.
 
-
+
 
-#### 3.4.5 Graphs Should Handle Casting Errors Where Appropriate
+#### 4.4.5 Graphs Should Handle Casting Errors Where Appropriate
 
 If a function or event assumes that a cast always succeeds, it should appropriately report a failure in logic if the cast fails. This lets others know why something that is 'supposed to work' doesn't. A function should also attempt a graceful recover after a failed cast if it's known that the reference being casted could ever fail to be casted.
 
 This does not mean every cast node should have its failure handled. In many cases, especially events regarding things like collisions, it is expected that execution flow terminates on a failed cast quietly.
 
-
+
 
-#### 3.4.6 Graphs Should Not Have Any Dangling / Loose / Dead Nodes
+#### 4.4.6 Graphs Should Not Have Any Dangling / Loose / Dead Nodes
 
 All nodes in all blueprint graphs must have a purpose. You should not leave dangling blueprint nodes around that have no purpose or are not executed.
 
 **[⬆ Back to Top](#table-of-contents)**
 
 
-
+
 
 
-## 4. Static Meshes
+## 5. Static Meshes
 
 This section will focus on Static Mesh assets and their internals.
 
-
+
 
-### 4.1 Static Mesh UVs
+### 5.1 Static Mesh UVs
 
 If Linter is reporting bad UVs and you can't seem to track it down, open the resulting `.log` file in your project's `Saved/Logs` folder for exact details as to why it's failing. I am hoping to include these messages in the Lint report in the future.
 
-
+
 
-#### 4.1.1 All Meshes Must Have UVs
+#### 5.1.1 All Meshes Must Have UVs
 
 Pretty simple. All meshes, regardless how they are to be used, should not be missing UVs.
 
-
+
 
-#### 4.1.2 All Meshes Must Not Have Overlapping UVs for Lightmaps
+#### 5.1.2 All Meshes Must Not Have Overlapping UVs for Lightmaps
 
 Pretty simple. All meshes, regardless how they are to be used, should have valid non-overlapping UVs.
 
-
+
 
-### 4.2 LODs Should Be Set Up Correctly
+### 5.2 LODs Should Be Set Up Correctly
 
 This is a subjective check on a per-project basis, but as a general rule any mesh that can be seen at varying distances should have proper LODs.
 
-
+
 
-### 4.3 Modular Socketless Assets Should Snap To The Grid Cleanly
+### 5.3 Modular Socketless Assets Should Snap To The Grid Cleanly
 
 This is a subjective check on a per-asset basis, however any modular socketless assets should snap together cleanly based on the project's grid settings.
 
 It is up to the project whether to snap based on a power of 2 grid or on a base 10 grid. However if you are authoring modular socketless assets for the marketplace, Epic's requirement is that they snap cleanly when the grid is set to 10 units or bigger.
 
-
+
 
-### 4.4 All Meshes Must Have Collision
+### 5.4 All Meshes Must Have Collision
 
 Regardless of whether an asset is going to be used for collision in a level, all meshes should have proper collision defined. This helps the engine with things such as bounds calculations, occlusion, and lighting. Collision should also be well-formed to the asset.
 
-
+
 
-### 4.5 All Meshes Should Be Scaled Correctly
+### 5.5 All Meshes Should Be Scaled Correctly
 
 This is a subjective check on a per-project basis, however all assets should be scaled correctly to their project. Level designers or blueprint authors should not have to tweak the scale of meshes to get them to confirm in the editor. Scaling meshes in the engine should be treated as a scale override, not a scale correction.
 
 **[⬆ Back to Top](#table-of-contents)**
 
 
-
+
 
 
-## 5. Niagara
+## 6. Niagara
 
 This section will focus on Niagara assets and their internals.
 
-
+
 
-### 5.1 No Spaces, Ever
+### 6.1 No Spaces, Ever
 
 As mentioned in [00.1 Forbidden Identifiers](#00), spaces and all white space characters are forbidden in identifiers. This is especially true for Niagara systems as it makes working with things significantly harder if not impossible when working with HLSL or other means of scripting within Niagara and trying to reference an identifier.
 
 (Original Contribution by [@dunenkoff](https://github.com/Allar/ue5-style-guide/issues/58))
 
-
 **[⬆ Back to Top](#table-of-contents)**
 
 
-
+
 
 
-## 6. Levels / Maps
+## 7. Levels / Maps
 
 [See Terminology Note](#terms-level-map) regarding "levels" vs "maps".
 
 This section will focus on Level assets and their internals.
 
-
+
 
-### 6.1 No Errors Or Warnings
+### 7.1 No Errors Or Warnings
 
 All levels should load with zero errors or warnings. If a level loads with any errors or warnings, they should be fixed immediately to prevent cascading issues.
 
@@ -1358,27 +1363,27 @@ You can run a map check on an open level in the editor by using the console comm
 
 Please note: Linter is even more strict on this than the editor is currently, and will catch load errors that the editor will resolve on its own.
 
-
+
 
-### 6.2 Lighting Should Be Built
+### 7.2 Lighting Should Be Built
 
 It is normal during development for levels to occasionally not have lighting built. When doing a test/internal/shipping build or any build that is to be distributed however, lighting should always be built.
 
-
+
 
-### 6.3 No Player Visible Z Fighting
+### 7.3 No Player Visible Z Fighting
 
 Levels should not have any [z-fighting](https://en.wikipedia.org/wiki/Z-fighting) in all areas visible to the player.
 
-
+
 
-### 6.4 Marketplace Specific Rules
+### 7.4 Marketplace Specific Rules
 
 If a project is to be sold on the UE4 Marketplace, it must follow these rules.
 
-
+
 
-#### 6.4.1 Overview Level
+#### 7.5.1 Overview Level
 
 If your project contains assets that should be visualized or demoed, you must have a map within your project that contains the name "Overview".
 
@@ -1386,9 +1391,9 @@ This overview map, if it is visualizing assets, should be set up according to [E
 
 For example, `InteractionComponent_Overview`.
 
-
+
 
-#### 6.4.2 Demo Level
+#### 7.5.2 Demo Level
 
 If your project contains assets that should be demoed or come with some sort of tutorial, you must have a map within your project that contains the name "Demo". This level should also contain documentation within it in some form that illustrates how to use your project. See Epic's Content Examples project for good examples on how to do this.
 
@@ -1399,37 +1404,37 @@ For example, `InteractionComponent_Overview_Demo`, `ExplosionKit_Demo`.
 **[⬆ Back to Top](#table-of-contents)**
 
 
-
+
 
-## 7. Textures
+## 8. Textures
 
 This section will focus on Texture assets and their internals.
 
-
+
 
-### 7.1 Dimensions Are Powers of 2
+### 8.1 Dimensions Are Powers of 2
 
 All textures, except for UI textures, must have its dimensions in multiples of powers of 2. Textures do not have to be square.
 
 For example, `128x512`, `1024x1024`, `2048x1024`, `1024x2048`, `1x512`.
 
-
+
 
-### 7.2 Texture Density Should Be Uniform
+### 8.2 Texture Density Should Be Uniform
 
 All textures should be of a size appropriate for their standard use case. Appropriate texture density varies from project to project, but all textures within that project should have a consistent density.
 
 For example, if a project's texture density is 8 pixel per 1 unit, a texture that is meant to be applied to a 100x100 unit cube should be 1024x1024, as that is the closest power of 2 that matches the project's texture density.
 
-
+
 
-### 7.3 Textures Should Be No Bigger than 8192
+### 8.3 Textures Should Be No Bigger than 8192
 
 No texture should have a dimension that exceeds 8192 in size, unless you have a very explicit reason to do so. Often, using a texture this big is simply just a waste of resources.
 
-
+
 
-### 7.4 Textures Should Be Grouped Correctly
+### 8.4 Textures Should Be Grouped Correctly
 
 Every texture has a Texture Group property used for LODing, and this should be set correctly based on its use. For example, all UI textures should belong in the UI texture group.
 

From d0d752dbf64d3d2f94a200e5e1a59b67f23c900d Mon Sep 17 00:00:00 2001
From: Anton Vasserman 
Date: Sat, 9 Nov 2024 10:05:12 +0200
Subject: [PATCH 2/3] Map asset type fix

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 55443d2a..475bdf58 100644
--- a/README.md
+++ b/README.md
@@ -340,7 +340,7 @@ When naming an asset, use these tables to determine the prefix and suffix to use
 
 | Asset Type              | Prefix     | Suffix     | Notes                            |
 | ----------------------- | ---------- | ---------- | -------------------------------- |
-| Level / Map             |            |            | [Should be in a folder called Maps.](#2.4) |
+| Level / Map             |            |            | [Should be in a folder called Maps.](#3.4) |
 | Level (Persistent)      |            | _P         |                                  |
 | Level (Audio)           |            | _Audio     |                                  |
 | Level (Lighting)        |            | _Lighting  |                                  |

From fcea4c67f94358014dba737784f93e1302479abc Mon Sep 17 00:00:00 2001
From: Anton Vasserman 
Date: Sat, 9 Nov 2024 11:35:23 +0200
Subject: [PATCH 3/3] Fixed niagara

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 475bdf58..c2f9c671 100644
--- a/README.md
+++ b/README.md
@@ -1337,7 +1337,7 @@ This section will focus on Niagara assets and their internals.
 
 ### 6.1 No Spaces, Ever
 
-As mentioned in [00.1 Forbidden Identifiers](#00), spaces and all white space characters are forbidden in identifiers. This is especially true for Niagara systems as it makes working with things significantly harder if not impossible when working with HLSL or other means of scripting within Niagara and trying to reference an identifier.
+As mentioned in [1.1 Forbidden Identifiers](#1.1), spaces and all white space characters are forbidden in identifiers. This is especially true for Niagara systems as it makes working with things significantly harder if not impossible when working with HLSL or other means of scripting within Niagara and trying to reference an identifier.
 
 (Original Contribution by [@dunenkoff](https://github.com/Allar/ue5-style-guide/issues/58))