<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://developer.vellocetsoftware.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=DocumentationBot</id>
	<title>Vellocet Developer Community - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://developer.vellocetsoftware.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=DocumentationBot"/>
	<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/wiki/Special:Contributions/DocumentationBot"/>
	<updated>2026-10-21T20:05:46Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Integrating_your_game&amp;diff=294</id>
		<title>Vertex/Integrating your game</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Integrating_your_game&amp;diff=294"/>
		<updated>2026-10-09T20:38:00Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Expand game integration guide with step-by-step build, content, and SDK instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
You can use Vertex to make levels for your own game. Start by importing geometry. Add a game connection when you want your materials, entities, and build commands inside the editor.&lt;br /&gt;
&lt;br /&gt;
Unity has a working integration package. Other engines can read Vertex&#039;s map format, but need their own engine adapter for compilation and playtesting. A game profile alone does not add support for another engine.&lt;br /&gt;
&lt;br /&gt;
For Grimwar maps, follow [[Grimwar/SDK setup|Grimwar SDK setup]] and use the supplied &amp;lt;code&amp;gt;Grimwar.vertexsdk&amp;lt;/code&amp;gt;. The steps below are for connecting a game you are developing.&lt;br /&gt;
&lt;br /&gt;
== First level in Unity ==&lt;br /&gt;
&lt;br /&gt;
You need a matching Vertex build and the &amp;lt;code&amp;gt;com.vellocet.vertex&amp;lt;/code&amp;gt; Unity package. The Grimwar SDK includes that package under &amp;lt;code&amp;gt;Compiler/Packages/com.vellocet.vertex/&amp;lt;/code&amp;gt;; copy it to a stable location for your project so a Steam update cannot replace it. Use Unity 6.3 for this integration; each finished SDK pins the exact editor version it builds with. Grimwar&#039;s SDK pins &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Add the Vertex package through &#039;&#039;&#039;Window → Package Manager → Add package from disk…&#039;&#039;&#039; and select its &amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt;. Keep the package folder available to the project.&lt;br /&gt;
# Create a small map in Vertex without a game connection. Use plain brush geometry for the first import.&lt;br /&gt;
# Choose &#039;&#039;&#039;File → Export compiled meshes…&#039;&#039;&#039; and save a &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; under your Unity project&#039;s &amp;lt;code&amp;gt;Assets/GameContent/Maps/arena_mycustommap/&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Unity imports it as a prefab. Place it in a scene and assign material bindings on the imported asset where needed. Enable the placed root if it is inactive.&lt;br /&gt;
# Add your game&#039;s player, camera, and startup objects, then test movement and collision.&lt;br /&gt;
&lt;br /&gt;
Keep the &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; source beside the export. Re-export after editing; preserve the map and object IDs so Unity can retain references to imported objects. OBJ and FBX export are also available when you only need a model, but they omit entity and collision data.&lt;br /&gt;
&lt;br /&gt;
This gives you an editable level and a repeatable import before you build an SDK for other creators.&lt;br /&gt;
&lt;br /&gt;
After creating the connection below, you can go straight to [[#Add build and play actions|Add build and play actions]] for a first scene build. Materials, entities, scripts, and custom media can be added one at a time afterward.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Define_the_game_connection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Create a .vertexsdk file ==&lt;br /&gt;
&lt;br /&gt;
Create two plain-text JSON files with a text editor such as VS Code or Notepad:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt; describes your game: its name, identifier, Unity version, and available content.&lt;br /&gt;
* &amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt; tells Vertex where that description and your Unity project are saved. This is the file you select in &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Start with an existing Unity project and the Vertex Unity package installed as described in [[#First level in Unity|First level in Unity]]. The examples below make a local connection to that project. You can add materials, entities, and build actions after the connection works.&lt;br /&gt;
&lt;br /&gt;
=== 1. Choose where to save the files ===&lt;br /&gt;
&lt;br /&gt;
Find your Unity project folder: it contains &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Packages&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;ProjectSettings&amp;lt;/code&amp;gt;. Go up one folder and create an &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; folder there. The two new files will fit into this layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
MyGame/&lt;br /&gt;
  MyGame.local.vertexsdk&lt;br /&gt;
  Authoring/&lt;br /&gt;
    MyGame.vertexgame&lt;br /&gt;
  UnityProject/&lt;br /&gt;
    Assets/&lt;br /&gt;
    Packages/&lt;br /&gt;
    ProjectSettings/&lt;br /&gt;
      ProjectVersion.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, &amp;lt;code&amp;gt;MyGame&amp;lt;/code&amp;gt; is the parent folder and &amp;lt;code&amp;gt;UnityProject&amp;lt;/code&amp;gt; is your existing Unity project. Keep your current folder names; step 3 explains how to use them in the connection file.&lt;br /&gt;
&lt;br /&gt;
=== 2. Create MyGame.vertexgame ===&lt;br /&gt;
&lt;br /&gt;
Create a file in &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt;, paste the following JSON, and save it as &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt;. Save as plain text and check the full filename: it must end in &amp;lt;code&amp;gt;.vertexgame&amp;lt;/code&amp;gt;, with no extra &amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; extension.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formatVersion&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;com.example.mygame&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;My Game&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
  &amp;quot;engineId&amp;quot;: &amp;quot;unity&amp;quot;,&lt;br /&gt;
  &amp;quot;engineVersion&amp;quot;: &amp;quot;6000.3.17f1&amp;quot;,&lt;br /&gt;
  &amp;quot;coordinates&amp;quot;: &amp;quot;right-handed-y-up&amp;quot;,&lt;br /&gt;
  &amp;quot;defaultMetersPerUnit&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;entityCatalogs&amp;quot;: [],&lt;br /&gt;
  &amp;quot;assetCatalogs&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before saving, set these values for your game:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! What to enter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; || An identifier you choose, such as &amp;lt;code&amp;gt;com.yourstudio.yourgame&amp;lt;/code&amp;gt;. Keep it stable once maps use it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; || The name Vertex should display, such as &amp;lt;code&amp;gt;My Game&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; || Your game profile version. You can start with &amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt;; this is separate from the Unity version.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;engineVersion&amp;lt;/code&amp;gt; || Your project&#039;s exact Unity version. Open &amp;lt;code&amp;gt;ProjectSettings/ProjectVersion.txt&amp;lt;/code&amp;gt; and copy the value after &amp;lt;code&amp;gt;m_EditorVersion:&amp;lt;/code&amp;gt;. Replace &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt; if your project uses another supported version.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For this first connection, keep &amp;lt;code&amp;gt;entityCatalogs&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;assetCatalogs&amp;lt;/code&amp;gt; as empty lists (&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;). They will list your entities, materials, and models later. The sample uses one map unit per metre; &amp;lt;code&amp;gt;defaultMetersPerUnit&amp;lt;/code&amp;gt; can be &amp;lt;code&amp;gt;0.0254&amp;lt;/code&amp;gt; for inches. Keep &amp;lt;code&amp;gt;coordinates&amp;lt;/code&amp;gt; as shown: Vertex&#039;s Unity importer handles the coordinate conversion.&lt;br /&gt;
&lt;br /&gt;
=== 3. Create MyGame.local.vertexsdk ===&lt;br /&gt;
&lt;br /&gt;
Create another plain-text file in the parent folder, next to &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; and your Unity project folder. Paste this JSON and save it as &amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt;, with no extra &amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; extension. The &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; part is a naming convention for this developer connection; the file extension is &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formatVersion&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;game&amp;quot;: {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;com.example.mygame&amp;quot;,&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;path&amp;quot;: &amp;quot;Authoring/MyGame.vertexgame&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;compilerProject&amp;quot;: &amp;quot;UnityProject&amp;quot;,&lt;br /&gt;
  &amp;quot;editorProject&amp;quot;: &amp;quot;UnityProject&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set &amp;lt;code&amp;gt;game.id&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;game.version&amp;lt;/code&amp;gt; to exactly match the &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; you saved in &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Path !! What it points to&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;game.path&amp;lt;/code&amp;gt; || The game description from step 2. &amp;lt;code&amp;gt;Authoring/MyGame.vertexgame&amp;lt;/code&amp;gt; means open the &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; folder beside this &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; file, then read &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compilerProject&amp;lt;/code&amp;gt; || Your Unity project folder, which supplies the source for map builds.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt; || Your local Unity project for saving maps into the editor. Use the same folder as &amp;lt;code&amp;gt;compilerProject&amp;lt;/code&amp;gt; for this setup.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If your Unity project folder is named &amp;lt;code&amp;gt;SpaceGame&amp;lt;/code&amp;gt;, replace &#039;&#039;&#039;both&#039;&#039;&#039; &amp;lt;code&amp;gt;&amp;quot;UnityProject&amp;quot;&amp;lt;/code&amp;gt; values with &amp;lt;code&amp;gt;&amp;quot;SpaceGame&amp;quot;&amp;lt;/code&amp;gt;. If you change the game description&#039;s filename or folder, update &amp;lt;code&amp;gt;game.path&amp;lt;/code&amp;gt; too.&lt;br /&gt;
&lt;br /&gt;
All three paths start from the folder containing &amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt;. Use forward slashes (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) even on Windows, and keep the referenced files and folders below that folder. Absolute paths and &amp;lt;code&amp;gt;../&amp;lt;/code&amp;gt; are not accepted here.&lt;br /&gt;
&lt;br /&gt;
=== 4. Open and check the connection ===&lt;br /&gt;
&lt;br /&gt;
# In Vertex, choose &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039;.&lt;br /&gt;
# Select &amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Check the status message. It should start with &#039;&#039;&#039;My Game connected.&#039;&#039;&#039; (using the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; from your game description).&lt;br /&gt;
# When creating a new map, select your game. Existing maps retain their own game connections.&lt;br /&gt;
&lt;br /&gt;
Vertex now knows your game&#039;s identity, units, and project paths. You can continue the geometry import steps in [[#First level in Unity|First level in Unity]].&lt;br /&gt;
&lt;br /&gt;
The empty catalog lists add no game-specific materials, models, or entities yet. Continue with [[#Expose materials and models|Expose materials and models]] and [[#Add an entity type|Add an entity type]] to supply them. &#039;&#039;&#039;Save to Unity&#039;&#039;&#039; and map builds also need the code described in [[#Add build and play actions|Add build and play actions]]; creating these two files does not implement those actions.&lt;br /&gt;
&lt;br /&gt;
After editing either file, use &#039;&#039;&#039;Settings → Game and resources → Reload resources&#039;&#039;&#039; in Vertex. Keep this local developer connection out of public SDK distributions.&lt;br /&gt;
&lt;br /&gt;
=== If the connection does not open ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Problem !! Check&lt;br /&gt;
|-&lt;br /&gt;
| The file does not appear in the SDK chooser || Show filename extensions in your file manager. The file must end in &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;.vertexsdk.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Invalid JSON || Save plain text, use straight double quotes, and check commas and brackets against the examples. Copy only the JSON, without surrounding wiki text.&lt;br /&gt;
|-&lt;br /&gt;
| Missing file or compiler project || Check paths from the folder containing &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt;. The project path must reach the existing Unity project containing &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Packages&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;ProjectSettings&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Unity version mismatch || Match &amp;lt;code&amp;gt;engineVersion&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;m_EditorVersion&amp;lt;/code&amp;gt; in that project&#039;s &amp;lt;code&amp;gt;ProjectSettings/ProjectVersion.txt&amp;lt;/code&amp;gt;, including the patch version and suffix.&lt;br /&gt;
|-&lt;br /&gt;
| Game ID or version mismatch || Match &amp;lt;code&amp;gt;game.id&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;game.version&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;.vertexgame&amp;lt;/code&amp;gt; exactly.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Expose materials and models ==&lt;br /&gt;
&lt;br /&gt;
An asset catalog is the list of Unity materials and models Vertex can offer in its pickers. It also contains previews, so Vertex can show the content without running Unity. Start with one material and one prefab you can recognize.&lt;br /&gt;
&lt;br /&gt;
=== 1. Choose the Unity assets ===&lt;br /&gt;
&lt;br /&gt;
# In your Unity project&#039;s &#039;&#039;&#039;Project&#039;&#039;&#039; window, create &amp;lt;code&amp;gt;Assets/GameContent/VertexLibrary&amp;lt;/code&amp;gt; and put the test material and prefab there.&lt;br /&gt;
# Create &amp;lt;code&amp;gt;Assets/Editor&amp;lt;/code&amp;gt; if it does not exist. Inside it, right-click and choose &#039;&#039;&#039;Create → Vertex → Asset catalog profile&#039;&#039;&#039;. Name the asset &amp;lt;code&amp;gt;VertexAssets&amp;lt;/code&amp;gt;, giving it the path &amp;lt;code&amp;gt;Assets/Editor/VertexAssets.asset&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Select the asset. Set &#039;&#039;&#039;Catalog Id&#039;&#039;&#039; to &amp;lt;code&amp;gt;mygame.base&amp;lt;/code&amp;gt; and &#039;&#039;&#039;Catalog Version&#039;&#039;&#039; to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add one entry to &#039;&#039;&#039;Folders&#039;&#039;&#039;. Set &#039;&#039;&#039;Folder&#039;&#039;&#039; to &amp;lt;code&amp;gt;Assets/GameContent/VertexLibrary&amp;lt;/code&amp;gt;, with forward slashes and no trailing slash. Enable &#039;&#039;&#039;Materials&#039;&#039;&#039;, &#039;&#039;&#039;Models&#039;&#039;&#039;, and &#039;&#039;&#039;Prefabs&#039;&#039;&#039; for the types you want to expose.&lt;br /&gt;
# Set &#039;&#039;&#039;Ownership&#039;&#039;&#039; to &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; for assets that your installed game already supplies. Use &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; for creator-owned assets that your package builder is allowed to include in an add-on.&lt;br /&gt;
&lt;br /&gt;
Folder rules include subfolders. Keep the first rule narrow: pointing it at all of &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; can expose unrelated content. Preserve the assets&#039; &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files; their GUIDs form part of the keys saved in maps.&lt;br /&gt;
&lt;br /&gt;
=== 2. Add an export menu in Unity ===&lt;br /&gt;
&lt;br /&gt;
Create &amp;lt;code&amp;gt;UnityProject/Assets/Editor/MyGameCatalogExport.cs&amp;lt;/code&amp;gt; and paste this complete script. It uses the folder layout from [[#Create a .vertexsdk file|Create a .vertexsdk file]]. It exports the catalog next to your game description and updates that description without removing its other settings.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System.IO;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using UnityEditor;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
using Vertex.Contracts;&lt;br /&gt;
using Vertex.Unity.Editor;&lt;br /&gt;
&lt;br /&gt;
public static class MyGameCatalogExport&lt;br /&gt;
{&lt;br /&gt;
    [MenuItem(&amp;quot;Tools/My Game/Export Vertex assets&amp;quot;)]&lt;br /&gt;
    public static void Export()&lt;br /&gt;
    {&lt;br /&gt;
        var profile = AssetDatabase.LoadAssetAtPath&amp;lt;VertexAssetCatalogProfile&amp;gt;(&lt;br /&gt;
            &amp;quot;Assets/Editor/VertexAssets.asset&amp;quot;);&lt;br /&gt;
        if (!profile)&lt;br /&gt;
            throw new FileNotFoundException(&amp;quot;Create Assets/Editor/VertexAssets.asset first.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        var authoring = Path.GetFullPath(Path.Combine(Application.dataPath, &amp;quot;../../Authoring&amp;quot;));&lt;br /&gt;
        var gamePath = Path.Combine(authoring, &amp;quot;MyGame.vertexgame&amp;quot;);&lt;br /&gt;
        var game = GameProfile.Load(gamePath);&lt;br /&gt;
        var catalog = VertexAssetCatalogExporter.Export(profile,&lt;br /&gt;
            Path.Combine(authoring, &amp;quot;MyGame.vertexassets&amp;quot;));&lt;br /&gt;
        game.AssetCatalogs = game.AssetCatalogs&lt;br /&gt;
            .Where(reference =&amp;gt; reference.Id != catalog.Id)&lt;br /&gt;
            .Append(new ProfileReference&lt;br /&gt;
            {&lt;br /&gt;
                Id = catalog.Id,&lt;br /&gt;
                Version = catalog.Version,&lt;br /&gt;
                Path = &amp;quot;MyGame.vertexassets&amp;quot;&lt;br /&gt;
            }).ToArray();&lt;br /&gt;
        VertexAssetCatalogExporter.Publish(gamePath, game.Serialize());&lt;br /&gt;
        Debug.Log(&amp;quot;Vertex assets exported to &amp;quot; + authoring);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you used different filenames, change the two &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;MyGame.vertexassets&amp;lt;/code&amp;gt; paths in the script. The &amp;lt;code&amp;gt;Assets/Editor&amp;lt;/code&amp;gt; location makes this an editor script; do not attach it to a GameObject.&lt;br /&gt;
&lt;br /&gt;
=== 3. Export and check the pickers ===&lt;br /&gt;
&lt;br /&gt;
# Wait for Unity to compile the script. Resolve any red Console errors before continuing.&lt;br /&gt;
# Choose &#039;&#039;&#039;Tools → My Game → Export Vertex assets&#039;&#039;&#039; in Unity.&lt;br /&gt;
# Check that &amp;lt;code&amp;gt;Authoring/MyGame.vertexassets&amp;lt;/code&amp;gt; and the exported preview files exist. The Console should report the export folder.&lt;br /&gt;
# In Vertex, choose &#039;&#039;&#039;Settings → Game and resources → Reload resources&#039;&#039;&#039;.&lt;br /&gt;
# Open the material picker and look for your test material. Apply it to a brush. Check the model/prefab picker for the test prefab and place it.&lt;br /&gt;
# Export a &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; into Unity again. Check that it resolves to the original material and prefab, rather than just matching the preview image.&lt;br /&gt;
&lt;br /&gt;
Re-run the export menu after changing assets. Keep the catalog and its preview files together when distributing them. If a material is missing, check its folder rule and &#039;&#039;&#039;Materials&#039;&#039;&#039; checkbox. If it appears but imports incorrectly, check that the compiler project contains the same assets, &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files, and catalog profile. Custom shaders may also need a project-specific material preview provider.&lt;br /&gt;
&lt;br /&gt;
For automated releases with several catalogs, &amp;lt;code&amp;gt;VertexGameProfileExporter.Export&amp;lt;/code&amp;gt; publishes the catalogs and game description together. The menu above is sufficient for this first local catalog.&lt;br /&gt;
&lt;br /&gt;
== Add an entity type ==&lt;br /&gt;
&lt;br /&gt;
An entity definition adds a choice to Vertex. A Unity importer turns that choice into a working game object. This example adds a point light so you can see the result without writing a player or trigger system.&lt;br /&gt;
&lt;br /&gt;
=== 1. Create the entity catalog ===&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Authoring/MyGame.vertexentities.json&amp;lt;/code&amp;gt;. Change &amp;lt;code&amp;gt;sdkId&amp;lt;/code&amp;gt; if you changed the example game&#039;s identifier.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formatVersion&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;sdkId&amp;quot;: &amp;quot;com.example.mygame&amp;quot;,&lt;br /&gt;
  &amp;quot;sdkVersion&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
  &amp;quot;entities&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;point_light&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;Point light&amp;quot;,&lt;br /&gt;
      &amp;quot;category&amp;quot;: &amp;quot;My Game&amp;quot;,&lt;br /&gt;
      &amp;quot;placement&amp;quot;: &amp;quot;point&amp;quot;,&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: &amp;quot;none&amp;quot;,&lt;br /&gt;
      &amp;quot;importable&amp;quot;: true,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: [],&lt;br /&gt;
      &amp;quot;signals&amp;quot;: [],&lt;br /&gt;
      &amp;quot;capabilities&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
  ],&lt;br /&gt;
  &amp;quot;globals&amp;quot;: [],&lt;br /&gt;
  &amp;quot;diagnostics&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt;, replace the existing &amp;lt;code&amp;gt;entityCatalogs&amp;lt;/code&amp;gt; value (&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;) with this array. These paths start beside &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt;, so there is no &amp;lt;code&amp;gt;Authoring/&amp;lt;/code&amp;gt; prefix here.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;com.example.mygame&amp;quot;,&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;path&amp;quot;: &amp;quot;MyGame.vertexentities.json&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Add the Unity importer ===&lt;br /&gt;
&lt;br /&gt;
Save this as &amp;lt;code&amp;gt;UnityProject/Assets/Editor/MyGameEntityImport.cs&amp;lt;/code&amp;gt;. The registration ID must match the catalog&#039;s &amp;lt;code&amp;gt;sdkId&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System.IO;&lt;br /&gt;
using UnityEditor;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
using Vertex.Unity.Editor;&lt;br /&gt;
&lt;br /&gt;
[InitializeOnLoad]&lt;br /&gt;
public static class MyGameEntityImport&lt;br /&gt;
{&lt;br /&gt;
    static MyGameEntityImport()&lt;br /&gt;
    {&lt;br /&gt;
        VertexSdkRegistry.Register(&amp;quot;com.example.mygame&amp;quot;, Import);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static void Import(VertexEntityBuildContext context)&lt;br /&gt;
    {&lt;br /&gt;
        foreach (var entity in context.Entities)&lt;br /&gt;
        {&lt;br /&gt;
            if (entity.Entity.TypeId != &amp;quot;point_light&amp;quot;)&lt;br /&gt;
                throw new InvalidDataException(&amp;quot;Unknown entity: &amp;quot; + entity.Entity.TypeId);&lt;br /&gt;
            var light = context.Objects[entity.Id].AddComponent&amp;lt;Light&amp;gt;();&lt;br /&gt;
            light.type = LightType.Point;&lt;br /&gt;
            light.range = 10;&lt;br /&gt;
            light.intensity = 2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertex has already created and positioned each object&#039;s transform. The importer adds the native component to that object. The range above is in Unity metres. Changing these values changes future imports; this first entity has no editable properties in Vertex yet.&lt;br /&gt;
&lt;br /&gt;
=== 3. Place and test it ===&lt;br /&gt;
&lt;br /&gt;
# Wait for Unity&#039;s scripts to compile, then reload resources in Vertex.&lt;br /&gt;
# In &#039;&#039;&#039;Create&#039;&#039;&#039;, choose &#039;&#039;&#039;Point light&#039;&#039;&#039; under &#039;&#039;&#039;My Game&#039;&#039;&#039; and place it near a floor or wall.&lt;br /&gt;
# Export a &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; into your Unity project and place the imported prefab in a scene. Enable its root if it is inactive.&lt;br /&gt;
# Expand the hierarchy and select the entity. It should have a Unity &#039;&#039;&#039;Light&#039;&#039;&#039; component with range &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; and intensity &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;. Check it with Scene lighting enabled.&lt;br /&gt;
&lt;br /&gt;
If the entity appears in Vertex but Unity says its SDK is missing, the catalog was loaded but the importer was not registered. Check the &amp;lt;code&amp;gt;Assets/Editor&amp;lt;/code&amp;gt; script, Unity Console errors, and the exact registration ID.&lt;br /&gt;
&lt;br /&gt;
Next, add catalog properties such as range or color and read their validated values in the importer. Use &amp;lt;code&amp;gt;context.ResolveAsset&amp;lt;/code&amp;gt; for asset-key properties. Keep entity and property IDs stable: maps store them. Add signals only when the runtime implements them; declaring an &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; input does not give a door any behavior.&lt;br /&gt;
&lt;br /&gt;
== Run map scripts ==&lt;br /&gt;
&lt;br /&gt;
Do this after an entity imports correctly and its game behavior works without scripting. Vertex supplies the VSig language and runtime; your game must connect script inputs and outputs to its components. The point-light example above does not yet supply script bindings.&lt;br /&gt;
&lt;br /&gt;
=== 1. Define and implement one signal ===&lt;br /&gt;
&lt;br /&gt;
# Choose one behavior, such as enabling a light or opening a door. Add the input&#039;s name, value type, and authority to that entity&#039;s catalog definition.&lt;br /&gt;
# In your game&#039;s runtime code, implement &amp;lt;code&amp;gt;IEntitySignalRuntime&amp;lt;/code&amp;gt; for that component. Its input handling must call the actual game behavior.&lt;br /&gt;
# Create an &amp;lt;code&amp;gt;EntityDescriptor&amp;lt;/code&amp;gt; for each imported entity, using its persistent map/object IDs and the catalog&#039;s signal contract. Keep a dictionary from those descriptors to their runtime bindings.&lt;br /&gt;
# Re-export/reload the catalog. Follow [[Vertex/VSig|Map logic]] to write a small script that calls the input from &amp;lt;code&amp;gt;map.ready&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The expected result at this stage is a valid script in Vertex. Runtime behavior still depends on the next two steps.&lt;br /&gt;
&lt;br /&gt;
=== 2. Compile the script with the map ===&lt;br /&gt;
&lt;br /&gt;
# Extend your Unity compiler to read the captured entry script at &amp;lt;code&amp;gt;context.PathFor(context.Job.Script)&amp;lt;/code&amp;gt; and its declared source dependencies.&lt;br /&gt;
# Parse with &amp;lt;code&amp;gt;VSigParser&amp;lt;/code&amp;gt; and validate with &amp;lt;code&amp;gt;VSigProgramValidator&amp;lt;/code&amp;gt;, using the same entity descriptors and global-event catalog your game exposes. Stop the build on errors.&lt;br /&gt;
# Convert the valid program with &amp;lt;code&amp;gt;VSigCompiledProgram.FromProgram&amp;lt;/code&amp;gt; and store its serialized data with the built map, using a game-owned component or asset. A &amp;lt;code&amp;gt;.vsig&amp;lt;/code&amp;gt; file beside a scene is not automatically executed.&lt;br /&gt;
&lt;br /&gt;
Resolve imports from the captured source set, so the build uses the versions captured when it started. Do not read an unrelated live script folder halfway through a build.&lt;br /&gt;
&lt;br /&gt;
=== 3. Start the runtime and check the result ===&lt;br /&gt;
&lt;br /&gt;
# When your game loads the map, create or enable a GameObject with &amp;lt;code&amp;gt;VertexScriptHost&amp;lt;/code&amp;gt;. It must be active before initialization.&lt;br /&gt;
# Call &amp;lt;code&amp;gt;Initialize(compiledProgram, bindings, capabilities)&amp;lt;/code&amp;gt; after the entity bindings exist. The arguments are the saved compiled program, your descriptor-to-runtime dictionary, and the &amp;lt;code&amp;gt;VSigHost&amp;lt;/code&amp;gt; containing your game&#039;s allowed operations and globals.&lt;br /&gt;
# Call &amp;lt;code&amp;gt;MarkReady()&amp;lt;/code&amp;gt; once the map is ready for scripts. This emits &amp;lt;code&amp;gt;map.ready&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Load the test map and confirm that the chosen light or door responds. Then deliberately misspell the input in the source: the next build should fail with a useful error.&lt;br /&gt;
&lt;br /&gt;
The host advances automatically using Unity time. If your game owns the simulation clock, pass &amp;lt;code&amp;gt;automaticTick: false&amp;lt;/code&amp;gt; and call &amp;lt;code&amp;gt;Tick(seconds)&amp;lt;/code&amp;gt; from that clock instead. Disabling or destroying the host disposes its runtime; re-enabling requires initialization again.&lt;br /&gt;
&lt;br /&gt;
For multiplayer, derive authority from the running server/client roles. Global events other than &amp;lt;code&amp;gt;map.ready&amp;lt;/code&amp;gt;, console commands, and variables need game-owned bindings. Grimwar&#039;s round events and VMod API are not supplied to another game by installing Vertex.&lt;br /&gt;
&lt;br /&gt;
== Add build and play actions ==&lt;br /&gt;
&lt;br /&gt;
Start with a &#039;&#039;&#039;scene build&#039;&#039;&#039;: Vertex captures your map, runs Unity in a separate project, and produces a &amp;lt;code&amp;gt;.unity&amp;lt;/code&amp;gt; scene you can inspect. This checks your connection and compiler before you implement an installable add-on or a game launcher.&lt;br /&gt;
&lt;br /&gt;
Building a map does not build your game&#039;s executable. You still build your game with Unity&#039;s normal player build. &#039;&#039;&#039;Play in Game&#039;&#039;&#039; later loads a built map into an existing game executable.&lt;br /&gt;
&lt;br /&gt;
=== 1. Understand the three actions ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Action !! Where it runs !! What you must supply&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Build scene&#039;&#039;&#039; / your export label || A separate Unity process using a private copy of the compiler project || A &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; object in &amp;lt;code&amp;gt;.vertexgame&amp;lt;/code&amp;gt; and an editor script registered with &amp;lt;code&amp;gt;VertexSdkRegistry.RegisterCompiler&amp;lt;/code&amp;gt;. Steps 2–5 below provide a first example.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Save to Unity&#039;&#039;&#039; / &#039;&#039;&#039;Save &amp;amp; Compile to Unity&#039;&#039;&#039; || Your already-open Unity editor || An &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt; connection, &amp;lt;code&amp;gt;build.editorSaveLabel&amp;lt;/code&amp;gt;, and a separate &amp;lt;code&amp;gt;VertexEditorBridge.Register&amp;lt;/code&amp;gt; callback. See step 6.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Play in Game&#039;&#039;&#039; || The package compiler, then your installed game || Working package export, &amp;lt;code&amp;gt;build.launchArguments&amp;lt;/code&amp;gt;, and a game that can load the package. See steps 7–8.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The JSON supplies names and supported choices. It does not contain C# or a shell command, and it does not generate the Unity implementation. Put the implementation in your own &amp;lt;code&amp;gt;Assets/Editor&amp;lt;/code&amp;gt; scripts; keep the supplied Vertex package unchanged.&lt;br /&gt;
&lt;br /&gt;
=== 2. Add build settings to MyGame.vertexgame ===&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;Authoring/MyGame.vertexgame&amp;lt;/code&amp;gt;. Keep the existing identity, engine version, and catalogs. Add a comma after the last existing field, then add the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; field shown here before the final closing brace. This block shows only the new field; it is not a replacement for the whole game description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;build&amp;quot;: {&lt;br /&gt;
    &amp;quot;profiles&amp;quot;: [&amp;quot;Preview&amp;quot;],&lt;br /&gt;
    &amp;quot;targets&amp;quot;: [&lt;br /&gt;
      { &amp;quot;id&amp;quot;: &amp;quot;StandaloneWindows64&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;Windows&amp;quot;, &amp;quot;platform&amp;quot;: &amp;quot;windows&amp;quot; },&lt;br /&gt;
      { &amp;quot;id&amp;quot;: &amp;quot;StandaloneOSX&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;macOS&amp;quot;, &amp;quot;platform&amp;quot;: &amp;quot;macos&amp;quot; },&lt;br /&gt;
      { &amp;quot;id&amp;quot;: &amp;quot;StandaloneLinux64&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;Linux&amp;quot;, &amp;quot;platform&amp;quot;: &amp;quot;linux&amp;quot; }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;exportLabel&amp;quot;: &amp;quot;Build scene&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;profiles&amp;lt;/code&amp;gt; is the list shown in the build profile selector. &amp;lt;code&amp;gt;Preview&amp;lt;/code&amp;gt; is a name passed to your compiler, not an automatic choice of lighting quality. The target IDs above are the supported Unity build targets; their &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; values are the labels shown to users. Remove targets your game will not support.&lt;br /&gt;
&lt;br /&gt;
Leave &amp;lt;code&amp;gt;packageFormat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;launchArguments&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;editorSaveLabel&amp;lt;/code&amp;gt; absent for now. This example produces a scene and does not advertise an unimplemented save or play action. Keep &amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt; as created earlier.&lt;br /&gt;
&lt;br /&gt;
=== 3. Register a first scene compiler ===&lt;br /&gt;
&lt;br /&gt;
Create &amp;lt;code&amp;gt;UnityProject/Assets/Editor/MyGameVertexBuild.cs&amp;lt;/code&amp;gt; and paste the following. Replace the registration&#039;s &amp;lt;code&amp;gt;com.example.mygame&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; if you changed the game ID or version. Both must match &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt; exactly.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System.IO;&lt;br /&gt;
using System.Linq;&lt;br /&gt;
using UnityEditor;&lt;br /&gt;
using UnityEditor.SceneManagement;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
using Vertex.Unity.Editor;&lt;br /&gt;
&lt;br /&gt;
[InitializeOnLoad]&lt;br /&gt;
public static class MyGameVertexBuild&lt;br /&gt;
{&lt;br /&gt;
    static MyGameVertexBuild()&lt;br /&gt;
    {&lt;br /&gt;
        VertexSdkRegistry.RegisterCompiler(&amp;quot;com.example.mygame&amp;quot;, &amp;quot;1&amp;quot;, Compile);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static void Compile(VertexBuildContext context)&lt;br /&gt;
    {&lt;br /&gt;
        if (context.Job.Package)&lt;br /&gt;
            throw new InvalidDataException(&amp;quot;This example builds scenes, not add-on packages.&amp;quot;);&lt;br /&gt;
        if (context.Job.Game.Baking != null ||&lt;br /&gt;
            (context.Job.Resources?.Length ?? 0) != 0 ||&lt;br /&gt;
            (context.Job.Content?.Length ?? 0) != 0)&lt;br /&gt;
            throw new InvalidDataException(&amp;quot;Add baking, resource, and custom-media support before building this map.&amp;quot;);&lt;br /&gt;
        if (File.ReadLines(context.PathFor(context.Job.Script))&lt;br /&gt;
            .Any(line =&amp;gt; line.Trim().Length &amp;gt; 0 &amp;amp;&amp;amp; !line.TrimStart().StartsWith(&amp;quot;#&amp;quot;)))&lt;br /&gt;
            throw new InvalidDataException(&amp;quot;This first compiler needs a map with no VSig script.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        context.CheckCanceled();&lt;br /&gt;
        context.Policy = &amp;quot;mygame.scene-only.v1&amp;quot;;&lt;br /&gt;
        const string scenePath = &amp;quot;Assets/VertexBuild/Output/Map.unity&amp;quot;;&lt;br /&gt;
        context.PrepareScenePath(scenePath);&lt;br /&gt;
        var prefab = AssetDatabase.LoadAssetAtPath&amp;lt;GameObject&amp;gt;(context.Job.Map);&lt;br /&gt;
        if (!prefab)&lt;br /&gt;
            throw new InvalidDataException(&amp;quot;Map import failed; inspect the Unity build log.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);&lt;br /&gt;
        var map = (GameObject)PrefabUtility.InstantiatePrefab(prefab, scene);&lt;br /&gt;
        map.SetActive(true);&lt;br /&gt;
        context.Report(0.8, &amp;quot;Saving the imported map scene…&amp;quot;);&lt;br /&gt;
        if (!EditorSceneManager.SaveScene(scene, scenePath))&lt;br /&gt;
            throw new IOException(&amp;quot;Could not save &amp;quot; + scenePath);&lt;br /&gt;
        context.Complete(scenePath, new[] { &amp;quot;geometry-import&amp;quot; });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for Unity to compile it and check the Console for errors. There is no component to attach or menu to click: &amp;lt;code&amp;gt;InitializeOnLoad&amp;lt;/code&amp;gt; registers the callback whenever this Unity project loads, including in Vertex&#039;s build process.&lt;br /&gt;
&lt;br /&gt;
The example imports geometry and any entities whose importers you registered. It deliberately rejects scripts, custom media, resource attachments, package jobs, and declared bake policies until you implement them. It adds no player, camera, or game bootstrap. Use a small test map with a floor and walls for the first build.&lt;br /&gt;
&lt;br /&gt;
Vertex starts Unity through the fixed &amp;lt;code&amp;gt;Vertex.Unity.Editor.VertexBuildCompiler.Run&amp;lt;/code&amp;gt; entry point. That code verifies the captured inputs, imports the map as a prefab, and then calls your registered &amp;lt;code&amp;gt;Compile&amp;lt;/code&amp;gt; method. You do not put that method name in the JSON.&lt;br /&gt;
&lt;br /&gt;
=== 4. Configure the machine and build ===&lt;br /&gt;
&lt;br /&gt;
# In Unity Hub, install the exact editor version recorded in &amp;lt;code&amp;gt;engineVersion&amp;lt;/code&amp;gt;, with the build support module for your chosen target. Activate its Unity license. The current Unity build entry point also requires a graphics-capable machine, even for this simple scene example.&lt;br /&gt;
# In Vertex, reload resources. Create or open a map connected to &#039;&#039;&#039;My Game&#039;&#039;&#039;, then save it as &amp;lt;code&amp;gt;arena_test.vertex&amp;lt;/code&amp;gt; in a folder you own.&lt;br /&gt;
# Open &#039;&#039;&#039;Build&#039;&#039;&#039;. You should now see &#039;&#039;&#039;Build scene&#039;&#039;&#039;, the &#039;&#039;&#039;Preview&#039;&#039;&#039; profile, and the targets you declared.&lt;br /&gt;
# Expand &#039;&#039;&#039;Advanced settings&#039;&#039;&#039;. Check &#039;&#039;&#039;Engine executable&#039;&#039;&#039;: it must be the matching Unity editor executable or &amp;lt;code&amp;gt;Unity.app&amp;lt;/code&amp;gt;, not Unity Hub or your game&#039;s executable.&lt;br /&gt;
# Check &#039;&#039;&#039;Compiler template&#039;&#039;&#039;: it must point to your &amp;lt;code&amp;gt;UnityProject&amp;lt;/code&amp;gt; folder, containing the new compiler script and the Vertex package. The local SDK connection normally fills this in.&lt;br /&gt;
# Set &#039;&#039;&#039;Build directory&#039;&#039;&#039; to a separate writable location, such as &amp;lt;code&amp;gt;MyGame/VertexBuilds&amp;lt;/code&amp;gt;. Do not use your Unity project itself or a folder inside it.&lt;br /&gt;
# Choose your machine&#039;s target for the first test, select &#039;&#039;&#039;Preview&#039;&#039;&#039;, and click &#039;&#039;&#039;Build scene&#039;&#039;&#039;. Watch the progress and diagnostics in the Build panel.&lt;br /&gt;
&lt;br /&gt;
Unity works on a captured copy of the project. The first build can take longer while Unity imports that copy. Save changes to your Unity scripts and assets before starting; changes made after the snapshot belong to the next build.&lt;br /&gt;
&lt;br /&gt;
=== 5. Find and inspect the result ===&lt;br /&gt;
&lt;br /&gt;
# Wait for the successful build result. Choose &#039;&#039;&#039;Open current output&#039;&#039;&#039;. For this scene-only example, it opens the retained build workspace.&lt;br /&gt;
# Find &amp;lt;code&amp;gt;Assets/VertexBuild/Output/Map.unity&amp;lt;/code&amp;gt; inside it. The captured input is &amp;lt;code&amp;gt;Assets/VertexBuild/Input/Map.vertexmesh&amp;lt;/code&amp;gt;; logs and result information are under &amp;lt;code&amp;gt;VertexJob&amp;lt;/code&amp;gt;.&lt;br /&gt;
# After the build process has exited, open that workspace as a separate project with the matching Unity version. Open &amp;lt;code&amp;gt;Map.unity&amp;lt;/code&amp;gt;, select the map root, and press &#039;&#039;&#039;F&#039;&#039;&#039; in the Scene view to frame it.&lt;br /&gt;
# Check the meshes, materials, and colliders. Add your game&#039;s player/camera/bootstrap creation to your compiler when you are ready to make this scene playable.&lt;br /&gt;
&lt;br /&gt;
Keep the whole workspace when inspecting it: the scene references imported assets elsewhere in the project. It is a build result, not the folder to distribute to players. Make further edits to the original &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; map and compiler code, then rebuild.&lt;br /&gt;
&lt;br /&gt;
Once this works, add your required validation, VSig compilation, navigation, lighting, and other bake steps. Set a policy identifier that describes the checks your compiler actually performs, and report only completed passes in &amp;lt;code&amp;gt;Complete&amp;lt;/code&amp;gt;. Reporting a pass name does not perform that pass.&lt;br /&gt;
&lt;br /&gt;
If your game exposes collision filters, register &amp;lt;code&amp;gt;VertexSdkRegistry.RegisterCollisionPolicy(id, resolve)&amp;lt;/code&amp;gt; during editor initialization. The resolver maps your game&#039;s collision categories to Unity layers; the importer needs that registration to apply the filters saved in a map.&lt;br /&gt;
&lt;br /&gt;
=== 6. Optionally save into the open Unity project ===&lt;br /&gt;
&lt;br /&gt;
This is a separate integration for developers working on base-game maps. It avoids opening a separate output project each time.&lt;br /&gt;
&lt;br /&gt;
# Keep &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt; in the local &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; pointing to your development project. Add &amp;lt;code&amp;gt;&amp;quot;editorSaveLabel&amp;quot;: &amp;quot;Save to Unity&amp;quot;&amp;lt;/code&amp;gt; inside the game&#039;s &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; object.&lt;br /&gt;
# In an &amp;lt;code&amp;gt;Assets/Editor&amp;lt;/code&amp;gt; script, register &amp;lt;code&amp;gt;VertexEditorBridge.Register(gameId, version, save)&amp;lt;/code&amp;gt; during initialization. The &amp;lt;code&amp;gt;save&amp;lt;/code&amp;gt; callback takes a &amp;lt;code&amp;gt;VertexEditorMapContext&amp;lt;/code&amp;gt; and must return the path of a saved Unity scene, starting with &amp;lt;code&amp;gt;Assets/&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In that callback, use &amp;lt;code&amp;gt;context.Job&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;context.PathFor(...)&amp;lt;/code&amp;gt; to read the captured map and source files. Copy the inputs needed by the saved map out of the temporary request directory. For example, organize them below &amp;lt;code&amp;gt;Assets/GameContent/Maps/arena_test/&amp;lt;/code&amp;gt; and create &amp;lt;code&amp;gt;Authoring.unity&amp;lt;/code&amp;gt; there.&lt;br /&gt;
# Inspect &amp;lt;code&amp;gt;context.Compile&amp;lt;/code&amp;gt;. For &#039;&#039;&#039;Save to Unity&#039;&#039;&#039;, save the authoring data. For &#039;&#039;&#039;Save &amp;amp; Compile to Unity&#039;&#039;&#039;, also run your game&#039;s validation and compilation steps. Return the scene that was actually saved. Preserve previous output if validation or cancellation fails.&lt;br /&gt;
# Open the development project, exit Play Mode, and save any modified Unity scenes. Reload resources in Vertex, then try &#039;&#039;&#039;Save to Unity&#039;&#039;&#039;. Confirm the new scene and its dependencies exist under &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The scene-build callback from step 3 does not implement this callback; adding the label alone is insufficient. Save actions do not need the export platform selector: your normal game player build handles platforms for base-game assets.&lt;br /&gt;
&lt;br /&gt;
=== 7. Implement an installable package ===&lt;br /&gt;
&lt;br /&gt;
Do this before enabling &#039;&#039;&#039;Play in Game&#039;&#039;&#039;. A standalone Unity game cannot load an arbitrary editor &amp;lt;code&amp;gt;.unity&amp;lt;/code&amp;gt; file from disk. Your game needs a supported runtime format, such as an add-on containing built scene bundles, and a loader for it.&lt;br /&gt;
&lt;br /&gt;
# Choose a package format ID, for example &amp;lt;code&amp;gt;mygame.addon.v1&amp;lt;/code&amp;gt;. Implement how your game finds, validates, loads, and unloads a map in that format.&lt;br /&gt;
# Extend the compiler to handle &amp;lt;code&amp;gt;context.Job.Package&amp;lt;/code&amp;gt;. Build the scene, compile its scripts/resources, run required bakes, and build its platform-specific bundles or other runtime data.&lt;br /&gt;
# Write the package below &amp;lt;code&amp;gt;VertexPackage/&amp;lt;/code&amp;gt; in the private build workspace. Include &amp;lt;code&amp;gt;vertex-package.json&amp;lt;/code&amp;gt;, serialized from &amp;lt;code&amp;gt;Vertex.Contracts.PackageManifest&amp;lt;/code&amp;gt;. It records the map/game identity, input hash, profile/target, format, file hashes, and asset ownership/bundle membership. This is separate from any manifest your game&#039;s loader needs.&lt;br /&gt;
# Keep installed base assets out of the package; include permitted custom assets and generated map data with their required dependencies. Audit the actual output and bundle membership rather than recording the intended contents.&lt;br /&gt;
# Finish with &amp;lt;code&amp;gt;context.Complete(scenePath, completedPasses, packageRelativePath)&amp;lt;/code&amp;gt;. The package path must start with &amp;lt;code&amp;gt;VertexPackage/&amp;lt;/code&amp;gt;. Vertex checks the manifest and output receipts before replacing the current result.&lt;br /&gt;
# Add &amp;lt;code&amp;gt;&amp;quot;packageFormat&amp;quot;: &amp;quot;mygame.addon.v1&amp;quot;&amp;lt;/code&amp;gt; inside &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; and change &amp;lt;code&amp;gt;exportLabel&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;Export add-on&amp;lt;/code&amp;gt;. Reload resources and export a small map. Use &#039;&#039;&#039;Open current output&#039;&#039;&#039; to inspect the package, then &#039;&#039;&#039;Install current package&#039;&#039;&#039; to test installation.&lt;br /&gt;
&lt;br /&gt;
Do not add &amp;lt;code&amp;gt;packageFormat&amp;lt;/code&amp;gt; while still using the scene-only compiler: it changes export requests into package jobs, which that example rejects. A successful export does not upload to Steam Workshop or publish your game.&lt;br /&gt;
&lt;br /&gt;
=== 8. Connect Play in Game ===&lt;br /&gt;
&lt;br /&gt;
After the package loads successfully in your game, add these fields inside the existing &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; object. Keep its profiles, targets, export label, and package format. This block again shows only the additional fields.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;addonDirectory&amp;quot;: &amp;quot;MyStudio/MyGame/addons&amp;quot;,&lt;br /&gt;
  &amp;quot;launchArguments&amp;quot;: [&amp;quot;--addon-root&amp;quot;, &amp;quot;{addonRoot}&amp;quot;, &amp;quot;--map&amp;quot;, &amp;quot;{mapId}&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;--addon-root&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;--map&amp;lt;/code&amp;gt; are example arguments for your game&#039;s own command-line parser. Unity and Vertex do not automatically implement them. Use the argument names your game actually handles; put each argument and value in a separate array entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Substitution !! Value passed to your game&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;{addonRoot}&amp;lt;/code&amp;gt; || The parent folder containing installed add-on packages.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;{packageRoot}&amp;lt;/code&amp;gt; || The specific installed package folder for this map.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;{mapId}&amp;lt;/code&amp;gt; || The public map ID derived from the saved filename, such as &amp;lt;code&amp;gt;arena_test&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
# Reload resources in Vertex. &#039;&#039;&#039;Play in Game&#039;&#039;&#039; should now appear.&lt;br /&gt;
# In &#039;&#039;&#039;Build → Advanced settings&#039;&#039;&#039;, choose the already-built &#039;&#039;&#039;Game executable&#039;&#039;&#039; and the &#039;&#039;&#039;Add-on folder&#039;&#039;&#039; your game reads. &amp;lt;code&amp;gt;addonDirectory&amp;lt;/code&amp;gt; supplies a default relative to the user&#039;s local application-data folder; it is not relative to the SDK.&lt;br /&gt;
# Choose a target matching the machine that will run the game. Close any game instance that still has the old bundles loaded.&lt;br /&gt;
# Click &#039;&#039;&#039;Play in Game&#039;&#039;&#039;. It builds the current inputs, installs the successful package, then launches that executable with the configured arguments.&lt;br /&gt;
# Confirm your game opens &amp;lt;code&amp;gt;arena_test&amp;lt;/code&amp;gt;. If the game opens its usual menu, check its command-line handling and map-loading logs. Starting the process does not prove that the game loaded the requested map.&lt;br /&gt;
&lt;br /&gt;
Set &amp;lt;code&amp;gt;steamAppId&amp;lt;/code&amp;gt; to the &#039;&#039;&#039;game&#039;s&#039;&#039;&#039; Steam app ID only if the game requires Steam; omit it otherwise. Executable paths belong in each user&#039;s local settings, not the shared game description. Add a &amp;lt;code&amp;gt;Release&amp;lt;/code&amp;gt; profile and &amp;lt;code&amp;gt;allTargetsPackageProfiles&amp;lt;/code&amp;gt; only when the compiler implements the corresponding checks and can build every required target.&lt;br /&gt;
&lt;br /&gt;
=== If building does not work ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! What to check&lt;br /&gt;
|-&lt;br /&gt;
| No build choices || The connected game&#039;s &amp;lt;code&amp;gt;.vertexgame&amp;lt;/code&amp;gt; needs a valid &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; object. Reload resources, then check that the map is connected to that game.&lt;br /&gt;
|-&lt;br /&gt;
| Build button disabled || Save the map first. Finish or cancel any running job and resolve any local-settings error shown in Build.&lt;br /&gt;
|-&lt;br /&gt;
| “Install the compiler binding…” || The compiler script must be inside the project selected as &#039;&#039;&#039;Compiler template&#039;&#039;&#039;. Resolve Unity compilation errors; match the registered game ID and exact version. A script only present in another open project will not register in this build.&lt;br /&gt;
|-&lt;br /&gt;
| Unity version, license, target, or graphics error || Match &amp;lt;code&amp;gt;engineVersion&amp;lt;/code&amp;gt;, activate that editor, install the selected target&#039;s support module, and use a graphics-capable worker. The build entry point rejects &amp;lt;code&amp;gt;-nographics&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| A script, media, or package request is rejected by the example || The first compiler supports scene import only. Test a plain map, then implement the named feature before advertising it in the game profile.&lt;br /&gt;
|-&lt;br /&gt;
| Waiting for Unity during Save || Open the project named by &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt;, exit Play Mode, save dirty scenes, and check that the separate save callback is registered.&lt;br /&gt;
|-&lt;br /&gt;
| Play is missing || &amp;lt;code&amp;gt;launchArguments&amp;lt;/code&amp;gt; must be present, and they require &amp;lt;code&amp;gt;packageFormat&amp;lt;/code&amp;gt;. First get package export and your game&#039;s loader working.&lt;br /&gt;
|-&lt;br /&gt;
| Build fails or is cancelled || Read the first build diagnostic and the retained Unity log. The previous successful output stays available; Play does not launch that older output as a substitute for the failed build.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Custom media and other resource types ==&lt;br /&gt;
&lt;br /&gt;
These are optional. Add them after the plain-map build works, one type at a time. There are two different lists in &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;contentTypes&amp;lt;/code&amp;gt; describes imported files such as sounds, images, models, and data. They appear in &#039;&#039;&#039;Content&#039;&#039;&#039; and use stable asset keys.&lt;br /&gt;
* &amp;lt;code&amp;gt;resourceTypes&amp;lt;/code&amp;gt; describes a source folder with its own JSON manifest and declared files, such as a mission or a game-specific script module. It can be attached to a map and, when supported, authored separately through VSDK.&lt;br /&gt;
&lt;br /&gt;
=== 1. Declare one media type ===&lt;br /&gt;
&lt;br /&gt;
For example, add the following field at the top level of &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt; if your game will support WAV sounds. This is an additional field, not a complete game description.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;contentTypes&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;sound&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;Sound&amp;quot;,&lt;br /&gt;
      &amp;quot;kind&amp;quot;: &amp;quot;audio&amp;quot;,&lt;br /&gt;
      &amp;quot;extensions&amp;quot;: [&amp;quot;.wav&amp;quot;],&lt;br /&gt;
      &amp;quot;maximumBytes&amp;quot;: 16777216,&lt;br /&gt;
      &amp;quot;settings&amp;quot;: []&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Reload resources. Open &#039;&#039;&#039;Content&#039;&#039;&#039; and import a small WAV file using the new &#039;&#039;&#039;Sound&#039;&#039;&#039; type.&lt;br /&gt;
# Check the map&#039;s source folder: &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt; records the asset and its settings, and &amp;lt;code&amp;gt;Content/&amp;lt;/code&amp;gt; holds its source file. The example limits one file to 16 MiB.&lt;br /&gt;
# Extend your compiler to process the captured catalogs in &amp;lt;code&amp;gt;context.Job.Content&amp;lt;/code&amp;gt;, validate the allowed format/size, and include or convert the needed audio data into the runtime package.&lt;br /&gt;
# Add an asset-key property to an entity, or a game API that accepts the sound key. Implement how the runtime resolves and plays it.&lt;br /&gt;
# Build, load the map, and trigger the sound. Merely seeing it in Content confirms authoring registration, not runtime playback.&lt;br /&gt;
&lt;br /&gt;
Use additional &amp;lt;code&amp;gt;settings&amp;lt;/code&amp;gt; entries for game-owned choices such as volume or looping. Your importer and runtime must interpret them. See [[Vertex/Content|Custom content]] for the creator&#039;s import, replacement, and dependency workflow.&lt;br /&gt;
&lt;br /&gt;
=== 2. Add a manifest-based resource when needed ===&lt;br /&gt;
&lt;br /&gt;
# Choose a stable resource ID, for example &amp;lt;code&amp;gt;mission&amp;lt;/code&amp;gt;, and define the format your game will read.&lt;br /&gt;
# Add a &amp;lt;code&amp;gt;resourceTypes&amp;lt;/code&amp;gt; entry to &amp;lt;code&amp;gt;.vertexgame&amp;lt;/code&amp;gt;. It needs &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;manifest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;filesProperty&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;template&amp;lt;/code&amp;gt;. For a mission, these could be &amp;lt;code&amp;gt;mission&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Mission&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mission.json&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;sourceFiles&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Supply the template as an array of &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt; objects, including the manifest itself and every starter source file. The manifest&#039;s &amp;lt;code&amp;gt;sourceFiles&amp;lt;/code&amp;gt; array lists relative filenames; &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{id}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; in template text is replaced with the new resource ID.&lt;br /&gt;
# Register &amp;lt;code&amp;gt;VertexSdkRegistry.RegisterResource(&amp;quot;mission&amp;quot;, validator)&amp;lt;/code&amp;gt; in your Unity editor integration. In your compiler, call &amp;lt;code&amp;gt;VertexSdkRegistry.CaptureResources(context.Job, context.Root)&amp;lt;/code&amp;gt; to obtain validated captured resources, then compile/store them in your map&#039;s runtime format. Registration alone does not add this call to a custom compiler.&lt;br /&gt;
# Reload resources and use &#039;&#039;&#039;Settings → Game and resources → Mission → Create&#039;&#039;&#039; to make a test resource. Edit and save its declared files, then build the map. Check that invalid input fails validation and that valid input reaches your game.&lt;br /&gt;
&lt;br /&gt;
For standalone authoring, also implement a resource worker executable and add its paths under &amp;lt;code&amp;gt;resourceTools&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt;, one per supported desktop runtime. Set the resource type&#039;s &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; flag only when that workflow is supported. VSDK uses the worker for validate/build/test actions; the game still decides when the resource starts and stops.&lt;br /&gt;
&lt;br /&gt;
== Ship an SDK ==&lt;br /&gt;
&lt;br /&gt;
Do this after building and loading a map works on your development machine. The release must also work for someone who has none of your project folders. A &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; file is the entry point to the distribution; it does not contain the compiler or catalogs itself.&lt;br /&gt;
&lt;br /&gt;
These steps package your own game integration. Creators should install Vertex/VSDK from Vellocet&#039;s official distribution. Bundling Vellocet&#039;s tools, Unity package, or source with your SDK requires prior written permission; the license&#039;s compiled-runtime exception covers finished games and projects. Credit &amp;lt;code&amp;gt;Software by Vellocet Corporation&amp;lt;/code&amp;gt; as required by the included license.&lt;br /&gt;
&lt;br /&gt;
=== 1. Assemble a separate distribution folder ===&lt;br /&gt;
&lt;br /&gt;
# Create a clean compiler project containing your registered compiler, entity importers, needed Unity packages, catalog profiles, and authorized build assets. Keep local caches, credentials, and unrelated game source out of that project.&lt;br /&gt;
# Copy the game description, entity/asset catalogs, and preview files into &amp;lt;code&amp;gt;Authoring/&amp;lt;/code&amp;gt;, preserving the relative paths recorded in the game description.&lt;br /&gt;
# Document the matching Vertex/VSDK versions creators must install. Include your own resource workers for the platforms you support, and document how to install any dependencies you cannot bundle.&lt;br /&gt;
# Generate &amp;lt;code&amp;gt;Compiler.inputs.json&amp;lt;/code&amp;gt; from the finished compiler tree using &amp;lt;code&amp;gt;Vertex.Contracts.BuildInputs&amp;lt;/code&amp;gt;. Each file entry records its relative &amp;lt;code&amp;gt;path&amp;lt;/code&amp;gt;, byte count, and SHA-256 hash. Generate it in your release tooling; do not hand-maintain hashes or include the compiler&#039;s generated &amp;lt;code&amp;gt;Library&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
# Create a public &amp;lt;code&amp;gt;MyGame.vertexsdk&amp;lt;/code&amp;gt; using the example below. Include &amp;lt;code&amp;gt;resourceTools&amp;lt;/code&amp;gt; too if your game provides workers. Keep the developer-only &amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt; out of this distribution.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
MyGameSDK/&lt;br /&gt;
  MyGame.vertexsdk&lt;br /&gt;
  Compiler.inputs.json&lt;br /&gt;
  Authoring/&lt;br /&gt;
    MyGame.vertexgame&lt;br /&gt;
    MyGame.vertexassets&lt;br /&gt;
    MyGame.vertexentities.json&lt;br /&gt;
    previews/&lt;br /&gt;
  Compiler/&lt;br /&gt;
    Assets/&lt;br /&gt;
    Packages/&lt;br /&gt;
    ProjectSettings/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The catalog/preview filenames above correspond to the earlier examples; keep the actual exported preview folders.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formatVersion&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;game&amp;quot;: {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;com.example.mygame&amp;quot;,&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;path&amp;quot;: &amp;quot;Authoring/MyGame.vertexgame&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;compilerProject&amp;quot;: &amp;quot;Compiler&amp;quot;,&lt;br /&gt;
  &amp;quot;compilerInputs&amp;quot;: &amp;quot;Compiler.inputs.json&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The public connection omits &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt;, because a creator does not have your development checkout. Remove &amp;lt;code&amp;gt;build.editorSaveLabel&amp;lt;/code&amp;gt; from its game description as well. The inventory lets Vertex verify and prepare the compiler cache; regenerate it whenever any compiler file changes.&lt;br /&gt;
&lt;br /&gt;
Review what your release tooling copies. The Vertex application is compiled, but copying a Unity package directory can include that package&#039;s C# source. A public compiler project should contain only the code and assets you intend and have permission to distribute.&lt;br /&gt;
&lt;br /&gt;
=== 2. Test it as a creator ===&lt;br /&gt;
&lt;br /&gt;
# Copy the distribution to a fresh location or machine. Make your development checkout unavailable to the test so missing dependencies cannot resolve accidentally.&lt;br /&gt;
# Install the pinned Unity version and required modules, then open the SDK through VSDK or &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039; in Vertex.&lt;br /&gt;
# Create a new map outside the SDK folder. Test the supplied material, entity, script, and custom-media workflows.&lt;br /&gt;
# Build every supported target/profile, install the result, and launch the actual game. Confirm it loads the newly built map.&lt;br /&gt;
# Introduce an invalid source, then cancel a separate build. Both should preserve the last successful output; a failed play request must not launch an older package.&lt;br /&gt;
# Replace the SDK with a new release, reload resources, and rebuild the same map. Its authored sources and stable asset/entity references should still work.&lt;br /&gt;
&lt;br /&gt;
Record the matching editor, package, compiler, and catalog versions in your release process. Ship them together rather than replacing one executable in an older SDK.&lt;br /&gt;
&lt;br /&gt;
=== Using another engine ===&lt;br /&gt;
&lt;br /&gt;
The JSON can describe another engine, but it cannot install one into Vertex. An engine developer must implement &amp;lt;code&amp;gt;IEngineAdapter&amp;lt;/code&amp;gt; in a trusted engine assembly and register it in the desktop application. Reuse the portable &amp;lt;code&amp;gt;Vertex.Contracts&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Vertex.VSig&amp;lt;/code&amp;gt; libraries, and convert coordinates and units at that boundary. There is no finished production Godot adapter in the current distribution.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex&amp;diff=293</id>
		<title>Vertex</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex&amp;diff=293"/>
		<updated>2026-10-09T18:30:58Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Link directly to the Vertex game connection walkthrough&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Vertex is a level editor for brush geometry, terrain, models, entities, and map scripts. It runs on Windows and macOS. A game&#039;s SDK supplies its assets, entity types, compiler, and playtesting tools.&lt;br /&gt;
&lt;br /&gt;
== Start here ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! You want to… !! Guide&lt;br /&gt;
|-&lt;br /&gt;
| Open the editor and save a map || [[Vertex/Getting started]]&lt;br /&gt;
|-&lt;br /&gt;
| Build geometry, apply materials, and place objects || [[Vertex/Editing]]&lt;br /&gt;
|-&lt;br /&gt;
| Add sounds, music, textures, models, or shared assets || [[Vertex/Content|Custom content]]&lt;br /&gt;
|-&lt;br /&gt;
| Connect entity events to actions || [[Vertex/VSig]]&lt;br /&gt;
|-&lt;br /&gt;
| Use Vertex with a game you are making || [[Vertex/Integrating your game]]&lt;br /&gt;
|-&lt;br /&gt;
| Create a &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; connection for your own game || [[Vertex/Integrating your game#Create a .vertexsdk file|Create a .vertexsdk file]]&lt;br /&gt;
|-&lt;br /&gt;
| Make something for Grimwar || [[Grimwar/Getting started|Grimwar modding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vertex and your game ==&lt;br /&gt;
&lt;br /&gt;
You can draw geometry and export models without a game SDK. To place game entities or build a playable map, open the SDK supplied by that game&#039;s author. Vertex reads the available tools from that connection; installing a different SDK changes the assets and entity types you can use.&lt;br /&gt;
&lt;br /&gt;
For Grimwar, install the Grimwar SDK from Steam&#039;s Tools library. Its VSDK launcher sets up the compiler and opens Vertex. Follow [[Grimwar/SDK setup|SDK setup]] before the first map build.&lt;br /&gt;
&lt;br /&gt;
Keep your editable &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; file, scripts, and imported media together. The exported add-on is a separate build that players install. [[Vertex/Getting started#Keep the source|Keep the source]] even after publishing.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Getting_started&amp;diff=292</id>
		<title>Vertex/Getting started</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Getting_started&amp;diff=292"/>
		<updated>2026-10-09T18:29:57Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Link directly to the Vertex game connection walkthrough&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Start Vertex from your game&#039;s SDK launcher, or open a standalone Vertex installation. The editor does not need a separate .NET installation.&lt;br /&gt;
&lt;br /&gt;
== Connect a game ==&lt;br /&gt;
&lt;br /&gt;
If the SDK launcher has already registered your game, select that game when creating a map. Otherwise choose &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039; and select the installation&#039;s &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; file. Keep the full SDK folder intact: the connection refers to its catalogs and compiler.&lt;br /&gt;
&lt;br /&gt;
You can also choose an SDK under &#039;&#039;&#039;Settings → Game and resources&#039;&#039;&#039;. The game connection supplies the materials, models, entities, and build actions. An unavailable catalog leaves existing map data in place, but you must reconnect it before editing those properties or building.&lt;br /&gt;
&lt;br /&gt;
Grimwar users should follow [[Grimwar/SDK setup#Install the SDK|Grimwar SDK setup]]. Other games supply their own setup requirements.&lt;br /&gt;
&lt;br /&gt;
For a game you are developing, follow [[Vertex/Integrating your game#Create a .vertexsdk file|Create a .vertexsdk file]]. That guide shows which two text files to create, where to save them, and how to connect them to your Unity project.&lt;br /&gt;
&lt;br /&gt;
== Create or find a map ==&lt;br /&gt;
&lt;br /&gt;
# Create a new map from the welcome screen.&lt;br /&gt;
# Save it in a folder you own, outside the SDK installation. Choose a readable filename such as &amp;lt;code&amp;gt;arena_mycustommap.vertex&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Under &#039;&#039;&#039;Settings → Map details&#039;&#039;&#039;, set &#039;&#039;&#039;Title&#039;&#039;&#039; to the name players should see, such as &amp;lt;code&amp;gt;My Custom Map&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Start with a floor and a few walls, then follow [[Vertex/Editing|Editing]].&lt;br /&gt;
&lt;br /&gt;
To find maps in an existing checkout, choose &#039;&#039;&#039;File → Welcome… → Open repository…&#039;&#039;&#039; and select its root folder. Vertex scans for valid editable maps and adds them to the list. It skips generated builds, backups, and invalid files. This scans local files; it does not download a repository.&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Open&#039;&#039;&#039; for an individual &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; file. A built Unity scene or installed add-on folder is not the editable Vertex source.&lt;br /&gt;
&lt;br /&gt;
== Names and IDs ==&lt;br /&gt;
&lt;br /&gt;
The filename determines the public map ID. &amp;lt;code&amp;gt;arena_mycustommap.vertex&amp;lt;/code&amp;gt; uses &amp;lt;code&amp;gt;arena_mycustommap&amp;lt;/code&amp;gt;; underscores stay underscores. Use lowercase letters, numbers, and underscores. Spaces and punctuation are normalized to underscores.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Title&#039;&#039;&#039; is the display name and can change without changing the ID. &#039;&#039;&#039;Save As / Copy…&#039;&#039;&#039; lets you choose another filename and therefore another map ID. Treat that as a new map when an existing release or another package already depends on the old ID.&lt;br /&gt;
&lt;br /&gt;
Objects inside a map also have persistent internal IDs. Vertex manages those for copying, references, and prefab updates. Give entities readable names in the hierarchy for your scripts.&lt;br /&gt;
&lt;br /&gt;
== Keep the source ==&lt;br /&gt;
&lt;br /&gt;
A typical source folder contains:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
arena_mycustommap/&lt;br /&gt;
  arena_mycustommap.vertex&lt;br /&gt;
  arena_mycustommap.vsig&lt;br /&gt;
  thumbnail.png&lt;br /&gt;
  content.json&lt;br /&gt;
  Content/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script, thumbnail, and content files appear when you use those features. Keep any attached SDK resources and local prefabs in this folder too. Share or back up the folder, not just the map file. &#039;&#039;&#039;Save As&#039;&#039;&#039; carries supported companion sources with the map.&lt;br /&gt;
&lt;br /&gt;
Reusable materials, models, and sounds can stay in shared libraries outside this folder. See [[Grimwar/Custom content|Grimwar custom content]] for those workflows; maps reference the library assets they use.&lt;br /&gt;
&lt;br /&gt;
Vertex keeps protected save backups and offers &#039;&#039;&#039;File → Recovery and diagnostics…&#039;&#039;&#039; for recovery. Recovery snapshots do not include unsaved script edits. Save your scripts before closing the editor or moving the source folder.&lt;br /&gt;
&lt;br /&gt;
Machine-specific SDK and executable paths stay in local preferences or &amp;lt;code&amp;gt;&amp;amp;lt;map&amp;amp;gt;.vertex.local.json&amp;lt;/code&amp;gt;. Collaborators choose their own installed SDK and game paths.&lt;br /&gt;
&lt;br /&gt;
== Build and play ==&lt;br /&gt;
&lt;br /&gt;
Use the &#039;&#039;&#039;Build&#039;&#039;&#039; controls supplied by the selected SDK. &#039;&#039;&#039;Play in Game&#039;&#039;&#039; builds the current source, installs the result, and launches the configured game. &#039;&#039;&#039;Export add-on&#039;&#039;&#039; builds without launching it. &#039;&#039;&#039;Open current output&#039;&#039;&#039; finds the generated package.&lt;br /&gt;
&lt;br /&gt;
A failed or cancelled build leaves the previous output available and does not launch it as though the new build succeeded. Read the first build error, correct the source or setup, and build again.&lt;br /&gt;
&lt;br /&gt;
See [[Grimwar/Mapping|Grimwar mapping]] for that game&#039;s targets and playtest steps.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:Getting started]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Integrating_your_game&amp;diff=291</id>
		<title>Vertex/Integrating your game</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Integrating_your_game&amp;diff=291"/>
		<updated>2026-10-09T18:28:20Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Explain creating a Vertex game connection step by step&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
You can use Vertex to make levels for your own game. Start by importing geometry. Add a game connection when you want your materials, entities, and build commands inside the editor.&lt;br /&gt;
&lt;br /&gt;
Unity has a working integration package. Other engines can read Vertex&#039;s map format, but need their own engine adapter for compilation and playtesting. A game profile alone does not add support for another engine.&lt;br /&gt;
&lt;br /&gt;
For Grimwar maps, follow [[Grimwar/SDK setup|Grimwar SDK setup]] and use the supplied &amp;lt;code&amp;gt;Grimwar.vertexsdk&amp;lt;/code&amp;gt;. The steps below are for connecting a game you are developing.&lt;br /&gt;
&lt;br /&gt;
== First level in Unity ==&lt;br /&gt;
&lt;br /&gt;
You need a matching Vertex build and the &amp;lt;code&amp;gt;com.vellocet.vertex&amp;lt;/code&amp;gt; Unity package. The Grimwar SDK includes that package under &amp;lt;code&amp;gt;Compiler/Packages/com.vellocet.vertex/&amp;lt;/code&amp;gt;; copy it to a stable location for your project so a Steam update cannot replace it. Use Unity 6.3 for this integration; each finished SDK pins the exact editor version it builds with. Grimwar&#039;s SDK pins &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Add the Vertex package through &#039;&#039;&#039;Window → Package Manager → Add package from disk…&#039;&#039;&#039; and select its &amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt;. Keep the package folder available to the project.&lt;br /&gt;
# Create a small map in Vertex without a game connection. Use plain brush geometry for the first import.&lt;br /&gt;
# Choose &#039;&#039;&#039;File → Export compiled meshes…&#039;&#039;&#039; and save a &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; under your Unity project&#039;s &amp;lt;code&amp;gt;Assets/GameContent/Maps/arena_mycustommap/&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Unity imports it as a prefab. Place it in a scene and assign material bindings on the imported asset where needed. Enable the placed root if it is inactive.&lt;br /&gt;
# Add your game&#039;s player, camera, and startup objects, then test movement and collision.&lt;br /&gt;
&lt;br /&gt;
Keep the &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; source beside the export. Re-export after editing; preserve the map and object IDs so Unity can retain references to imported objects. OBJ and FBX export are also available when you only need a model, but they omit entity and collision data.&lt;br /&gt;
&lt;br /&gt;
This gives you an editable level and a repeatable import before you build an SDK for other creators.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Define_the_game_connection&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Create a .vertexsdk file ==&lt;br /&gt;
&lt;br /&gt;
Create two plain-text JSON files with a text editor such as VS Code or Notepad:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt; describes your game: its name, identifier, Unity version, and available content.&lt;br /&gt;
* &amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt; tells Vertex where that description and your Unity project are saved. This is the file you select in &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Start with an existing Unity project and the Vertex Unity package installed as described in [[#First level in Unity|First level in Unity]]. The examples below make a local connection to that project. You can add materials, entities, and build actions after the connection works.&lt;br /&gt;
&lt;br /&gt;
=== 1. Choose where to save the files ===&lt;br /&gt;
&lt;br /&gt;
Find your Unity project folder: it contains &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Packages&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;ProjectSettings&amp;lt;/code&amp;gt;. Go up one folder and create an &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; folder there. The two new files will fit into this layout:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
MyGame/&lt;br /&gt;
  MyGame.local.vertexsdk&lt;br /&gt;
  Authoring/&lt;br /&gt;
    MyGame.vertexgame&lt;br /&gt;
  UnityProject/&lt;br /&gt;
    Assets/&lt;br /&gt;
    Packages/&lt;br /&gt;
    ProjectSettings/&lt;br /&gt;
      ProjectVersion.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here, &amp;lt;code&amp;gt;MyGame&amp;lt;/code&amp;gt; is the parent folder and &amp;lt;code&amp;gt;UnityProject&amp;lt;/code&amp;gt; is your existing Unity project. Keep your current folder names; step 3 explains how to use them in the connection file.&lt;br /&gt;
&lt;br /&gt;
=== 2. Create MyGame.vertexgame ===&lt;br /&gt;
&lt;br /&gt;
Create a file in &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt;, paste the following JSON, and save it as &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt;. Save as plain text and check the full filename: it must end in &amp;lt;code&amp;gt;.vertexgame&amp;lt;/code&amp;gt;, with no extra &amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; extension.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formatVersion&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;com.example.mygame&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;My Game&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
  &amp;quot;engineId&amp;quot;: &amp;quot;unity&amp;quot;,&lt;br /&gt;
  &amp;quot;engineVersion&amp;quot;: &amp;quot;6000.3.17f1&amp;quot;,&lt;br /&gt;
  &amp;quot;coordinates&amp;quot;: &amp;quot;right-handed-y-up&amp;quot;,&lt;br /&gt;
  &amp;quot;defaultMetersPerUnit&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;entityCatalogs&amp;quot;: [],&lt;br /&gt;
  &amp;quot;assetCatalogs&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before saving, set these values for your game:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Field !! What to enter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; || An identifier you choose, such as &amp;lt;code&amp;gt;com.yourstudio.yourgame&amp;lt;/code&amp;gt;. Keep it stable once maps use it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; || The name Vertex should display, such as &amp;lt;code&amp;gt;My Game&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; || Your game profile version. You can start with &amp;lt;code&amp;gt;&amp;quot;1&amp;quot;&amp;lt;/code&amp;gt;; this is separate from the Unity version.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;engineVersion&amp;lt;/code&amp;gt; || Your project&#039;s exact Unity version. Open &amp;lt;code&amp;gt;ProjectSettings/ProjectVersion.txt&amp;lt;/code&amp;gt; and copy the value after &amp;lt;code&amp;gt;m_EditorVersion:&amp;lt;/code&amp;gt;. Replace &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt; if your project uses another supported version.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For this first connection, keep &amp;lt;code&amp;gt;entityCatalogs&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;assetCatalogs&amp;lt;/code&amp;gt; as empty lists (&amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;). They will list your entities, materials, and models later. The sample uses one map unit per metre; &amp;lt;code&amp;gt;defaultMetersPerUnit&amp;lt;/code&amp;gt; can be &amp;lt;code&amp;gt;0.0254&amp;lt;/code&amp;gt; for inches. Keep &amp;lt;code&amp;gt;coordinates&amp;lt;/code&amp;gt; as shown: Vertex&#039;s Unity importer handles the coordinate conversion.&lt;br /&gt;
&lt;br /&gt;
=== 3. Create MyGame.local.vertexsdk ===&lt;br /&gt;
&lt;br /&gt;
Create another plain-text file in the parent folder, next to &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; and your Unity project folder. Paste this JSON and save it as &amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt;, with no extra &amp;lt;code&amp;gt;.txt&amp;lt;/code&amp;gt; extension. The &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; part is a naming convention for this developer connection; the file extension is &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formatVersion&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;game&amp;quot;: {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;com.example.mygame&amp;quot;,&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;path&amp;quot;: &amp;quot;Authoring/MyGame.vertexgame&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;compilerProject&amp;quot;: &amp;quot;UnityProject&amp;quot;,&lt;br /&gt;
  &amp;quot;editorProject&amp;quot;: &amp;quot;UnityProject&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set &amp;lt;code&amp;gt;game.id&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;game.version&amp;lt;/code&amp;gt; to exactly match the &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; you saved in &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Path !! What it points to&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;game.path&amp;lt;/code&amp;gt; || The game description from step 2. &amp;lt;code&amp;gt;Authoring/MyGame.vertexgame&amp;lt;/code&amp;gt; means open the &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; folder beside this &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; file, then read &amp;lt;code&amp;gt;MyGame.vertexgame&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;compilerProject&amp;lt;/code&amp;gt; || Your Unity project folder, which supplies the source for map builds.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt; || Your local Unity project for saving maps into the editor. Use the same folder as &amp;lt;code&amp;gt;compilerProject&amp;lt;/code&amp;gt; for this setup.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If your Unity project folder is named &amp;lt;code&amp;gt;SpaceGame&amp;lt;/code&amp;gt;, replace &#039;&#039;&#039;both&#039;&#039;&#039; &amp;lt;code&amp;gt;&amp;quot;UnityProject&amp;quot;&amp;lt;/code&amp;gt; values with &amp;lt;code&amp;gt;&amp;quot;SpaceGame&amp;quot;&amp;lt;/code&amp;gt;. If you change the game description&#039;s filename or folder, update &amp;lt;code&amp;gt;game.path&amp;lt;/code&amp;gt; too.&lt;br /&gt;
&lt;br /&gt;
All three paths start from the folder containing &amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt;. Use forward slashes (&amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;) even on Windows, and keep the referenced files and folders below that folder. Absolute paths and &amp;lt;code&amp;gt;../&amp;lt;/code&amp;gt; are not accepted here.&lt;br /&gt;
&lt;br /&gt;
=== 4. Open and check the connection ===&lt;br /&gt;
&lt;br /&gt;
# In Vertex, choose &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039;.&lt;br /&gt;
# Select &amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Check the status message. It should start with &#039;&#039;&#039;My Game connected.&#039;&#039;&#039; (using the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; from your game description).&lt;br /&gt;
# When creating a new map, select your game. Existing maps retain their own game connections.&lt;br /&gt;
&lt;br /&gt;
Vertex now knows your game&#039;s identity, units, and project paths. You can continue the geometry import steps in [[#First level in Unity|First level in Unity]].&lt;br /&gt;
&lt;br /&gt;
The empty catalog lists add no game-specific materials, models, or entities yet. Continue with [[#Expose materials and models|Expose materials and models]] and [[#Add an entity type|Add an entity type]] to supply them. &#039;&#039;&#039;Save to Unity&#039;&#039;&#039; and map builds also need the code described in [[#Add build and play actions|Add build and play actions]]; creating these two files does not implement those actions.&lt;br /&gt;
&lt;br /&gt;
After editing either file, use &#039;&#039;&#039;Settings → Game and resources → Reload resources&#039;&#039;&#039; in Vertex. Keep this local developer connection out of public SDK distributions.&lt;br /&gt;
&lt;br /&gt;
=== If the connection does not open ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Problem !! Check&lt;br /&gt;
|-&lt;br /&gt;
| The file does not appear in the SDK chooser || Show filename extensions in your file manager. The file must end in &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;.vertexsdk.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Invalid JSON || Save plain text, use straight double quotes, and check commas and brackets against the examples. Copy only the JSON, without surrounding wiki text.&lt;br /&gt;
|-&lt;br /&gt;
| Missing file or compiler project || Check paths from the folder containing &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt;. The project path must reach the existing Unity project containing &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Packages&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;ProjectSettings&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Unity version mismatch || Match &amp;lt;code&amp;gt;engineVersion&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;m_EditorVersion&amp;lt;/code&amp;gt; in that project&#039;s &amp;lt;code&amp;gt;ProjectSettings/ProjectVersion.txt&amp;lt;/code&amp;gt;, including the patch version and suffix.&lt;br /&gt;
|-&lt;br /&gt;
| Game ID or version mismatch || Match &amp;lt;code&amp;gt;game.id&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;game.version&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;.vertexgame&amp;lt;/code&amp;gt; exactly.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Expose materials and models ==&lt;br /&gt;
&lt;br /&gt;
# In Unity, create a &#039;&#039;&#039;Vertex → Asset catalog profile&#039;&#039;&#039; asset.&lt;br /&gt;
# Set a stable catalog ID and version, such as &amp;lt;code&amp;gt;mygame.base&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add folder rules for the assets creators can use. Mark installed game assets as &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; and creator-owned assets that may ship in add-ons as &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Export the profile with &amp;lt;code&amp;gt;VertexAssetCatalogExporter.Export&amp;lt;/code&amp;gt;, or publish it together with the game profile using &amp;lt;code&amp;gt;VertexGameProfileExporter.Export&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Distribute the exported catalog and its preview folder. Reload resources in Vertex after publishing an update.&lt;br /&gt;
&lt;br /&gt;
For example, an editor script can publish an existing profile asset:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using UnityEditor;&lt;br /&gt;
using Vertex.Unity.Editor;&lt;br /&gt;
&lt;br /&gt;
var assets = AssetDatabase.LoadAssetAtPath&amp;lt;VertexAssetCatalogProfile&amp;gt;(&lt;br /&gt;
    &amp;quot;Assets/Editor/VertexAssets.asset&amp;quot;);&lt;br /&gt;
VertexAssetCatalogExporter.Export(assets, catalogOutputPath);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is code for your exporter; &amp;lt;code&amp;gt;catalogOutputPath&amp;lt;/code&amp;gt; is its destination outside &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;. The exported &amp;lt;code&amp;gt;.vertexassets&amp;lt;/code&amp;gt; file lists the available materials and models. Add its ID, version, and path relative to the &amp;lt;code&amp;gt;.vertexgame&amp;lt;/code&amp;gt; file to &amp;lt;code&amp;gt;assetCatalogs&amp;lt;/code&amp;gt;, or let the game-profile exporter do it.&lt;br /&gt;
&lt;br /&gt;
Preserve Unity &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files when moving assets. Catalog keys use their GUIDs and local file IDs. Previews let Vertex display assets without running their scripts; the compiler resolves the original native assets. Only expose content your SDK is allowed to distribute.&lt;br /&gt;
&lt;br /&gt;
== Add an entity type ==&lt;br /&gt;
&lt;br /&gt;
An entity needs both an editor description and a game implementation. Start with one spawn point or trigger and test the full path before adding the rest.&lt;br /&gt;
&lt;br /&gt;
# Create an &amp;lt;code&amp;gt;EntityCatalog&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;Vertex.Contracts&amp;lt;/code&amp;gt; with your SDK ID and version.&lt;br /&gt;
# Add a type with a stable ID, display name, placement, properties, and signals. Set &amp;lt;code&amp;gt;importable&amp;lt;/code&amp;gt; and its geometry role: &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bounds&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;brushes&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Register a Unity importer with &amp;lt;code&amp;gt;VertexSdkRegistry.Register(sdkId, importer)&amp;lt;/code&amp;gt; during editor initialization.&lt;br /&gt;
# In that callback, read the validated entity values and add your game&#039;s components to the objects in &amp;lt;code&amp;gt;VertexEntityBuildContext.Objects&amp;lt;/code&amp;gt;. Resolve asset keys through &amp;lt;code&amp;gt;ResolveAsset&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Export the catalog and add it to the game profile&#039;s &amp;lt;code&amp;gt;entityCatalogs&amp;lt;/code&amp;gt;. Place the entity in Vertex, export the map, and verify its runtime behavior.&lt;br /&gt;
&lt;br /&gt;
Property IDs are saved in maps. Keep them stable when changing a display label. Use enum choices, units, bounds, and tooltips so creators can understand a property without reading your source.&lt;br /&gt;
&lt;br /&gt;
Entity signals describe what scripts may call or observe. Declaring &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; in a catalog does not make a door move; your runtime must implement it. Keep editor metadata and runtime bindings in the same SDK release.&lt;br /&gt;
&lt;br /&gt;
== Run map scripts ==&lt;br /&gt;
&lt;br /&gt;
Vertex supplies the VSig parser, compiler, and runtime. Your game supplies entity bindings and any global events beyond &amp;lt;code&amp;gt;map.ready&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Validate scripts against the exported entity and global-event catalogs during compilation. Store the compiled &amp;lt;code&amp;gt;VSigCompiledProgram&amp;lt;/code&amp;gt; in the map. At runtime, initialize &amp;lt;code&amp;gt;VertexScriptHost&amp;lt;/code&amp;gt; with that program and the map&#039;s entity bindings, then call &amp;lt;code&amp;gt;MarkReady&amp;lt;/code&amp;gt; after those bindings are ready.&lt;br /&gt;
&lt;br /&gt;
The host can tick automatically with Unity time. For a game with its own simulation clock, initialize it with &amp;lt;code&amp;gt;automaticTick: false&amp;lt;/code&amp;gt; and call &amp;lt;code&amp;gt;Tick&amp;lt;/code&amp;gt; from that clock. Dispose the host when unloading the map.&lt;br /&gt;
&lt;br /&gt;
In multiplayer, derive script authority from the running server/client roles. A catalog cannot grant permission to run server actions on a client. Expose commands, variables, and global events deliberately; Grimwar&#039;s round events and VMod API do not come with Vertex itself.&lt;br /&gt;
&lt;br /&gt;
== Add build and play actions ==&lt;br /&gt;
&lt;br /&gt;
Register the parts your workflow needs:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! API !! Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VertexSdkRegistry.RegisterCompiler(gameId, version, compile)&amp;lt;/code&amp;gt; || Import captured inputs, validate entities and resources, bake required data, and produce a scene or installable package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VertexEditorBridge.Register(gameId, version, save)&amp;lt;/code&amp;gt; || Save captured sources into the open game project and return a Unity scene path. Honor &amp;lt;code&amp;gt;context.Compile&amp;lt;/code&amp;gt; to distinguish saving from saving and compiling.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VertexSdkRegistry.RegisterCollisionPolicy(id, resolve)&amp;lt;/code&amp;gt; || Map your game&#039;s collision categories to native layers when you expose collision filters.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The compiler runs through &amp;lt;code&amp;gt;Vertex.Unity.Editor.VertexBuildCompiler.Run&amp;lt;/code&amp;gt;. Its &amp;lt;code&amp;gt;VertexBuildContext&amp;lt;/code&amp;gt; supplies captured files, progress, cancellation, and result handling. Complete the job with the built scene and pass results; package jobs must also return an audited root containing &amp;lt;code&amp;gt;vertex-package.json&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In the game profile&#039;s &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; settings, declare supported profiles and targets, your package format, and launch arguments. Use &amp;lt;code&amp;gt;{addonRoot}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{packageRoot}&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;{mapId}&amp;lt;/code&amp;gt; for the supported substitutions. Your game must load that package format and handle those arguments. Set &amp;lt;code&amp;gt;steamAppId&amp;lt;/code&amp;gt; to the game&#039;s app ID if Steam is required.&lt;br /&gt;
&lt;br /&gt;
For base-game authoring, save sources and generated scenes below &amp;lt;code&amp;gt;Assets/GameContent/Maps/&amp;amp;lt;map_id&amp;amp;gt;/&amp;lt;/code&amp;gt;. Saving into the game project does not need a separate platform choice; the game&#039;s player build handles its platforms. Add-on export builds the targets declared by your SDK.&lt;br /&gt;
&lt;br /&gt;
== Custom media and other resource types ==&lt;br /&gt;
&lt;br /&gt;
Declare &amp;lt;code&amp;gt;contentTypes&amp;lt;/code&amp;gt; for file types your game supports, including extensions, size limits, settings, and asset kind. The SDK owns validation, native conversion, packaging, and runtime loading. An entry in the picker does not create a sound player or video surface by itself.&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;resourceTypes&amp;lt;/code&amp;gt; for other source formats, such as game scripts or mission data. Each type names a manifest, its source-file list property, and a starter template. Enable standalone authoring when it also makes sense outside a map.&lt;br /&gt;
&lt;br /&gt;
Ship the resource worker in the SDK and register it under &amp;lt;code&amp;gt;resourceTools&amp;lt;/code&amp;gt; for each supported desktop runtime. VSDK uses it for validate/build/test operations. Unity integrations register map-resource validation with &amp;lt;code&amp;gt;VertexSdkRegistry.RegisterResource&amp;lt;/code&amp;gt;; the game decides when the resource starts and stops.&lt;br /&gt;
&lt;br /&gt;
Keep these formats game-owned. Another game can use the same Content and resource controls without implementing Grimwar entities or VMods.&lt;br /&gt;
&lt;br /&gt;
== Ship an SDK ==&lt;br /&gt;
&lt;br /&gt;
Distribute matching Vertex/VSDK applications, authoring catalogs and previews, engine packages, a compiler project, and any resource workers. A public &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; uses &amp;lt;code&amp;gt;compilerInputs&amp;lt;/code&amp;gt; for its verified compiler-file inventory and omits the local &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt; connection. The compiler project should contain only the authoring and build code you intend to ship.&lt;br /&gt;
&lt;br /&gt;
Test the SDK from a clean installation with no access to your game checkout. Create a map, import custom media, build every required target, install it into the game, and test an SDK update. Check failure and cancellation too: an unsuccessful build must leave the previous package intact.&lt;br /&gt;
&lt;br /&gt;
For another engine, reuse the portable &amp;lt;code&amp;gt;Vertex.Contracts&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Vertex.VSig&amp;lt;/code&amp;gt; contracts and implement &amp;lt;code&amp;gt;IEngineAdapter&amp;lt;/code&amp;gt; in a trusted engine assembly. Convert coordinates and units at that boundary. There is no finished production Godot adapter in the current distribution.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Integrating_your_game&amp;diff=290</id>
		<title>Vertex/Integrating your game</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Integrating_your_game&amp;diff=290"/>
		<updated>2026-10-04T16:30:18Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
You can use Vertex to make levels for your own game. Start by importing geometry. Add a game connection when you want your materials, entities, and build commands inside the editor.&lt;br /&gt;
&lt;br /&gt;
Unity has a working integration package. Other engines can read Vertex&#039;s map format, but need their own engine adapter for compilation and playtesting. A game profile alone does not add support for another engine.&lt;br /&gt;
&lt;br /&gt;
== First level in Unity ==&lt;br /&gt;
&lt;br /&gt;
You need a matching Vertex build and the &amp;lt;code&amp;gt;com.vellocet.vertex&amp;lt;/code&amp;gt; Unity package. The Grimwar SDK includes that package under &amp;lt;code&amp;gt;Compiler/Packages/com.vellocet.vertex/&amp;lt;/code&amp;gt;; copy it to a stable location for your project so a Steam update cannot replace it. Use Unity 6.3 for this integration; each finished SDK pins the exact editor version it builds with. Grimwar&#039;s SDK pins &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Add the Vertex package through &#039;&#039;&#039;Window → Package Manager → Add package from disk…&#039;&#039;&#039; and select its &amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt;. Keep the package folder available to the project.&lt;br /&gt;
# Create a small map in Vertex without a game connection. Use plain brush geometry for the first import.&lt;br /&gt;
# Choose &#039;&#039;&#039;File → Export compiled meshes…&#039;&#039;&#039; and save a &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; under your Unity project&#039;s &amp;lt;code&amp;gt;Assets/GameContent/Maps/arena_mycustommap/&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
# Unity imports it as a prefab. Place it in a scene and assign material bindings on the imported asset where needed. Enable the placed root if it is inactive.&lt;br /&gt;
# Add your game&#039;s player, camera, and startup objects, then test movement and collision.&lt;br /&gt;
&lt;br /&gt;
Keep the &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; source beside the export. Re-export after editing; preserve the map and object IDs so Unity can retain references to imported objects. OBJ and FBX export are also available when you only need a model, but they omit entity and collision data.&lt;br /&gt;
&lt;br /&gt;
This gives you an editable level and a repeatable import before you build an SDK for other creators.&lt;br /&gt;
&lt;br /&gt;
== Define the game connection ==&lt;br /&gt;
&lt;br /&gt;
Vertex separates the connection into a few files:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! What you supply&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.vertexgame&amp;lt;/code&amp;gt; || Game identity, units, exact engine version, catalog references, and optional build policy.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.vertexassets&amp;lt;/code&amp;gt; || Available materials, models, and other native assets, with previews and ownership.&lt;br /&gt;
|-&lt;br /&gt;
| Entity catalog JSON || Placeable entity types, editable properties, and script inputs and outputs.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; || Paths to the game profile and compiler, with an optional local editor connection.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Use your own stable game and catalog IDs. Display names are separate. Vertex uses right-handed, Y-up coordinates; its Unity importer handles the coordinate conversion. Set &amp;lt;code&amp;gt;defaultMetersPerUnit&amp;lt;/code&amp;gt; to your preferred authoring scale. A value of &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; means one map unit per metre; &amp;lt;code&amp;gt;0.0254&amp;lt;/code&amp;gt; means inches.&lt;br /&gt;
&lt;br /&gt;
A minimal profile with no catalogs or build commands is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formatVersion&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;com.example.mygame&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;My Game&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
  &amp;quot;engineId&amp;quot;: &amp;quot;unity&amp;quot;,&lt;br /&gt;
  &amp;quot;engineVersion&amp;quot;: &amp;quot;6000.3.17f1&amp;quot;,&lt;br /&gt;
  &amp;quot;coordinates&amp;quot;: &amp;quot;right-handed-y-up&amp;quot;,&lt;br /&gt;
  &amp;quot;defaultMetersPerUnit&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;entityCatalogs&amp;quot;: [],&lt;br /&gt;
  &amp;quot;assetCatalogs&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use the exact version of your Unity editor in &amp;lt;code&amp;gt;engineVersion&amp;lt;/code&amp;gt;. For a local connection, this layout keeps paths relative:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
MyGame/&lt;br /&gt;
  MyGame.local.vertexsdk&lt;br /&gt;
  Authoring/MyGame.vertexgame&lt;br /&gt;
  UnityProject/Assets/&lt;br /&gt;
  UnityProject/Packages/&lt;br /&gt;
  UnityProject/ProjectSettings/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;MyGame.local.vertexsdk&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formatVersion&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;game&amp;quot;: {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;com.example.mygame&amp;quot;,&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
    &amp;quot;path&amp;quot;: &amp;quot;Authoring/MyGame.vertexgame&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;compilerProject&amp;quot;: &amp;quot;UnityProject&amp;quot;,&lt;br /&gt;
  &amp;quot;editorProject&amp;quot;: &amp;quot;UnityProject&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open this connection with &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039;. This identifies the game and local project. Build and save actions still need the implementations described below. Keep local connections out of a public SDK.&lt;br /&gt;
&lt;br /&gt;
== Expose materials and models ==&lt;br /&gt;
&lt;br /&gt;
# In Unity, create a &#039;&#039;&#039;Vertex → Asset catalog profile&#039;&#039;&#039; asset.&lt;br /&gt;
# Set a stable catalog ID and version, such as &amp;lt;code&amp;gt;mygame.base&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add folder rules for the assets creators can use. Mark installed game assets as &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; and creator-owned assets that may ship in add-ons as &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Export the profile with &amp;lt;code&amp;gt;VertexAssetCatalogExporter.Export&amp;lt;/code&amp;gt;, or publish it together with the game profile using &amp;lt;code&amp;gt;VertexGameProfileExporter.Export&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Distribute the exported catalog and its preview folder. Reload resources in Vertex after publishing an update.&lt;br /&gt;
&lt;br /&gt;
For example, an editor script can publish an existing profile asset:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using UnityEditor;&lt;br /&gt;
using Vertex.Unity.Editor;&lt;br /&gt;
&lt;br /&gt;
var assets = AssetDatabase.LoadAssetAtPath&amp;lt;VertexAssetCatalogProfile&amp;gt;(&lt;br /&gt;
    &amp;quot;Assets/Editor/VertexAssets.asset&amp;quot;);&lt;br /&gt;
VertexAssetCatalogExporter.Export(assets, catalogOutputPath);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is code for your exporter; &amp;lt;code&amp;gt;catalogOutputPath&amp;lt;/code&amp;gt; is its destination outside &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;. Add the exported catalog&#039;s ID, version, and relative path to the game profile&#039;s &amp;lt;code&amp;gt;assetCatalogs&amp;lt;/code&amp;gt;, or let the game-profile exporter do it.&lt;br /&gt;
&lt;br /&gt;
Preserve Unity &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files when moving assets. Catalog keys use their GUIDs and local file IDs. Previews let Vertex display assets without running their scripts; the compiler resolves the original native assets. Only expose content your SDK is allowed to distribute.&lt;br /&gt;
&lt;br /&gt;
== Add an entity type ==&lt;br /&gt;
&lt;br /&gt;
An entity needs both an editor description and a game implementation. Start with one spawn point or trigger and test the full path before adding the rest.&lt;br /&gt;
&lt;br /&gt;
# Create an &amp;lt;code&amp;gt;EntityCatalog&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;Vertex.Contracts&amp;lt;/code&amp;gt; with your SDK ID and version.&lt;br /&gt;
# Add a type with a stable ID, display name, placement, properties, and signals. Set &amp;lt;code&amp;gt;importable&amp;lt;/code&amp;gt; and its geometry role: &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bounds&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;brushes&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Register a Unity importer with &amp;lt;code&amp;gt;VertexSdkRegistry.Register(sdkId, importer)&amp;lt;/code&amp;gt; during editor initialization.&lt;br /&gt;
# In that callback, read the validated entity values and add your game&#039;s components to the objects in &amp;lt;code&amp;gt;VertexEntityBuildContext.Objects&amp;lt;/code&amp;gt;. Resolve asset keys through &amp;lt;code&amp;gt;ResolveAsset&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Export the catalog and add it to the game profile&#039;s &amp;lt;code&amp;gt;entityCatalogs&amp;lt;/code&amp;gt;. Place the entity in Vertex, export the map, and verify its runtime behavior.&lt;br /&gt;
&lt;br /&gt;
Property IDs are saved in maps. Keep them stable when changing a display label. Use enum choices, units, bounds, and tooltips so creators can understand a property without reading your source.&lt;br /&gt;
&lt;br /&gt;
Entity signals describe what scripts may call or observe. Declaring &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; in a catalog does not make a door move; your runtime must implement it. Keep editor metadata and runtime bindings in the same SDK release.&lt;br /&gt;
&lt;br /&gt;
== Run map scripts ==&lt;br /&gt;
&lt;br /&gt;
Vertex supplies the VSig parser, compiler, and runtime. Your game supplies entity bindings and any global events beyond &amp;lt;code&amp;gt;map.ready&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Validate scripts against the exported entity and global-event catalogs during compilation. Store the compiled &amp;lt;code&amp;gt;VSigCompiledProgram&amp;lt;/code&amp;gt; in the map. At runtime, initialize &amp;lt;code&amp;gt;VertexScriptHost&amp;lt;/code&amp;gt; with that program and the map&#039;s entity bindings, then call &amp;lt;code&amp;gt;MarkReady&amp;lt;/code&amp;gt; after those bindings are ready.&lt;br /&gt;
&lt;br /&gt;
The host can tick automatically with Unity time. For a game with its own simulation clock, initialize it with &amp;lt;code&amp;gt;automaticTick: false&amp;lt;/code&amp;gt; and call &amp;lt;code&amp;gt;Tick&amp;lt;/code&amp;gt; from that clock. Dispose the host when unloading the map.&lt;br /&gt;
&lt;br /&gt;
In multiplayer, derive script authority from the running server/client roles. A catalog cannot grant permission to run server actions on a client. Expose commands, variables, and global events deliberately; Grimwar&#039;s round events and VMod API do not come with Vertex itself.&lt;br /&gt;
&lt;br /&gt;
== Add build and play actions ==&lt;br /&gt;
&lt;br /&gt;
Register the parts your workflow needs:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! API !! Responsibility&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VertexSdkRegistry.RegisterCompiler(gameId, version, compile)&amp;lt;/code&amp;gt; || Import captured inputs, validate entities and resources, bake required data, and produce a scene or installable package.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VertexEditorBridge.Register(gameId, version, save)&amp;lt;/code&amp;gt; || Save captured sources into the open game project and return a Unity scene path. Honor &amp;lt;code&amp;gt;context.Compile&amp;lt;/code&amp;gt; to distinguish saving from saving and compiling.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;VertexSdkRegistry.RegisterCollisionPolicy(id, resolve)&amp;lt;/code&amp;gt; || Map your game&#039;s collision categories to native layers when you expose collision filters.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The compiler runs through &amp;lt;code&amp;gt;Vertex.Unity.Editor.VertexBuildCompiler.Run&amp;lt;/code&amp;gt;. Its &amp;lt;code&amp;gt;VertexBuildContext&amp;lt;/code&amp;gt; supplies captured files, progress, cancellation, and result handling. Complete the job with the built scene and pass results; package jobs must also return an audited root containing &amp;lt;code&amp;gt;vertex-package.json&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In the game profile&#039;s &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; settings, declare supported profiles and targets, your package format, and launch arguments. Use &amp;lt;code&amp;gt;{addonRoot}&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;{packageRoot}&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;{mapId}&amp;lt;/code&amp;gt; for the supported substitutions. Your game must load that package format and handle those arguments. Set &amp;lt;code&amp;gt;steamAppId&amp;lt;/code&amp;gt; to the game&#039;s app ID if Steam is required.&lt;br /&gt;
&lt;br /&gt;
For base-game authoring, save sources and generated scenes below &amp;lt;code&amp;gt;Assets/GameContent/Maps/&amp;amp;lt;map_id&amp;amp;gt;/&amp;lt;/code&amp;gt;. Saving into the game project does not need a separate platform choice; the game&#039;s player build handles its platforms. Add-on export builds the targets declared by your SDK.&lt;br /&gt;
&lt;br /&gt;
== Custom media and other resource types ==&lt;br /&gt;
&lt;br /&gt;
Declare &amp;lt;code&amp;gt;contentTypes&amp;lt;/code&amp;gt; for file types your game supports, including extensions, size limits, settings, and asset kind. The SDK owns validation, native conversion, packaging, and runtime loading. An entry in the picker does not create a sound player or video surface by itself.&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;resourceTypes&amp;lt;/code&amp;gt; for other source formats, such as game scripts or mission data. Each type names a manifest, its source-file list property, and a starter template. Enable standalone authoring when it also makes sense outside a map.&lt;br /&gt;
&lt;br /&gt;
Ship the resource worker in the SDK and register it under &amp;lt;code&amp;gt;resourceTools&amp;lt;/code&amp;gt; for each supported desktop runtime. VSDK uses it for validate/build/test operations. Unity integrations register map-resource validation with &amp;lt;code&amp;gt;VertexSdkRegistry.RegisterResource&amp;lt;/code&amp;gt;; the game decides when the resource starts and stops.&lt;br /&gt;
&lt;br /&gt;
Keep these formats game-owned. Another game can use the same Content and resource controls without implementing Grimwar entities or VMods.&lt;br /&gt;
&lt;br /&gt;
== Ship an SDK ==&lt;br /&gt;
&lt;br /&gt;
Distribute matching Vertex/VSDK applications, authoring catalogs and previews, engine packages, a compiler project, and any resource workers. A public &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; uses &amp;lt;code&amp;gt;compilerInputs&amp;lt;/code&amp;gt; for its verified compiler-file inventory and omits the local &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt; connection. The compiler project should contain only the authoring and build code you intend to ship.&lt;br /&gt;
&lt;br /&gt;
Test the SDK from a clean installation with no access to your game checkout. Create a map, import custom media, build every required target, install it into the game, and test an SDK update. Check failure and cancellation too: an unsuccessful build must leave the previous package intact.&lt;br /&gt;
&lt;br /&gt;
For another engine, reuse the portable &amp;lt;code&amp;gt;Vertex.Contracts&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Vertex.VSig&amp;lt;/code&amp;gt; contracts and implement &amp;lt;code&amp;gt;IEngineAdapter&amp;lt;/code&amp;gt; in a trusted engine assembly. Convert coordinates and units at that boundary. There is no finished production Godot adapter in the current distribution.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Getting_started&amp;diff=289</id>
		<title>Vertex/Getting started</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Getting_started&amp;diff=289"/>
		<updated>2026-10-04T16:30:15Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Start Vertex from your game&#039;s SDK launcher, or open a standalone Vertex installation. The editor does not need a separate .NET installation.&lt;br /&gt;
&lt;br /&gt;
== Connect a game ==&lt;br /&gt;
&lt;br /&gt;
If the SDK launcher has already registered your game, select that game when creating a map. Otherwise choose &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039; and select the installation&#039;s &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; file. Keep the full SDK folder intact: the connection refers to its catalogs and compiler.&lt;br /&gt;
&lt;br /&gt;
You can also choose an SDK under &#039;&#039;&#039;Settings → Game and resources&#039;&#039;&#039;. The game connection supplies the materials, models, entities, and build actions. An unavailable catalog leaves existing map data in place, but you must reconnect it before editing those properties or building.&lt;br /&gt;
&lt;br /&gt;
Grimwar users should follow [[Grimwar/SDK setup#Install the SDK|Grimwar SDK setup]]. Other games supply their own setup requirements.&lt;br /&gt;
&lt;br /&gt;
== Create or find a map ==&lt;br /&gt;
&lt;br /&gt;
# Create a new map from the welcome screen.&lt;br /&gt;
# Save it in a folder you own, outside the SDK installation. Choose a readable filename such as &amp;lt;code&amp;gt;arena_mycustommap.vertex&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Under &#039;&#039;&#039;Settings → Map details&#039;&#039;&#039;, set &#039;&#039;&#039;Title&#039;&#039;&#039; to the name players should see, such as &amp;lt;code&amp;gt;My Custom Map&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Start with a floor and a few walls, then follow [[Vertex/Editing|Editing]].&lt;br /&gt;
&lt;br /&gt;
To find maps in an existing checkout, choose &#039;&#039;&#039;File → Welcome… → Open repository…&#039;&#039;&#039; and select its root folder. Vertex scans for valid editable maps and adds them to the list. It skips generated builds, backups, and invalid files. This scans local files; it does not download a repository.&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Open&#039;&#039;&#039; for an individual &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; file. A built Unity scene or installed add-on folder is not the editable Vertex source.&lt;br /&gt;
&lt;br /&gt;
== Names and IDs ==&lt;br /&gt;
&lt;br /&gt;
The filename determines the public map ID. &amp;lt;code&amp;gt;arena_mycustommap.vertex&amp;lt;/code&amp;gt; uses &amp;lt;code&amp;gt;arena_mycustommap&amp;lt;/code&amp;gt;; underscores stay underscores. Use lowercase letters, numbers, and underscores. Spaces and punctuation are normalized to underscores.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Title&#039;&#039;&#039; is the display name and can change without changing the ID. &#039;&#039;&#039;Save As / Copy…&#039;&#039;&#039; lets you choose another filename and therefore another map ID. Treat that as a new map when an existing release or another package already depends on the old ID.&lt;br /&gt;
&lt;br /&gt;
Objects inside a map also have persistent internal IDs. Vertex manages those for copying, references, and prefab updates. Give entities readable names in the hierarchy for your scripts.&lt;br /&gt;
&lt;br /&gt;
== Keep the source ==&lt;br /&gt;
&lt;br /&gt;
A typical source folder contains:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
arena_mycustommap/&lt;br /&gt;
  arena_mycustommap.vertex&lt;br /&gt;
  arena_mycustommap.vsig&lt;br /&gt;
  thumbnail.png&lt;br /&gt;
  content.json&lt;br /&gt;
  Content/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The script, thumbnail, and content files appear when you use those features. Keep any attached SDK resources and local prefabs in this folder too. Share or back up the folder, not just the map file. &#039;&#039;&#039;Save As&#039;&#039;&#039; carries supported companion sources with the map.&lt;br /&gt;
&lt;br /&gt;
Reusable materials, models, and sounds can stay in shared libraries outside this folder. See [[Grimwar/Custom content|Grimwar custom content]] for those workflows; maps reference the library assets they use.&lt;br /&gt;
&lt;br /&gt;
Vertex keeps protected save backups and offers &#039;&#039;&#039;File → Recovery and diagnostics…&#039;&#039;&#039; for recovery. Recovery snapshots do not include unsaved script edits. Save your scripts before closing the editor or moving the source folder.&lt;br /&gt;
&lt;br /&gt;
Machine-specific SDK and executable paths stay in local preferences or &amp;lt;code&amp;gt;&amp;amp;lt;map&amp;amp;gt;.vertex.local.json&amp;lt;/code&amp;gt;. Collaborators choose their own installed SDK and game paths.&lt;br /&gt;
&lt;br /&gt;
== Build and play ==&lt;br /&gt;
&lt;br /&gt;
Use the &#039;&#039;&#039;Build&#039;&#039;&#039; controls supplied by the selected SDK. &#039;&#039;&#039;Play in Game&#039;&#039;&#039; builds the current source, installs the result, and launches the configured game. &#039;&#039;&#039;Export add-on&#039;&#039;&#039; builds without launching it. &#039;&#039;&#039;Open current output&#039;&#039;&#039; finds the generated package.&lt;br /&gt;
&lt;br /&gt;
A failed or cancelled build leaves the previous output available and does not launch it as though the new build succeeded. Read the first build error, correct the source or setup, and build again.&lt;br /&gt;
&lt;br /&gt;
See [[Grimwar/Mapping|Grimwar mapping]] for that game&#039;s targets and playtest steps.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:Getting started]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Content&amp;diff=288</id>
		<title>Vertex/Content</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Content&amp;diff=288"/>
		<updated>2026-10-04T16:30:13Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Content&#039;&#039;&#039; manages files owned by a map or SDK resource and references to assets from other packages. The connected game decides which file types it supports and how those files become usable in the game.&lt;br /&gt;
&lt;br /&gt;
For Grimwar, start with the asset you want to add:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Asset !! Guide&lt;br /&gt;
|-&lt;br /&gt;
| Sounds and music || [[Grimwar/Custom content#Sounds and music|Import audio, choose its playback type, and play it in a map]].&lt;br /&gt;
|-&lt;br /&gt;
| Textures and materials || [[Grimwar/Custom content/Materials and models#3. Create a wall material|Create a Unity material]].&lt;br /&gt;
|-&lt;br /&gt;
| Models and prefabs || [[Grimwar/Custom content/Materials and models#4. Import a model and save a prefab|Import a model and save a prefab]].&lt;br /&gt;
|-&lt;br /&gt;
| Shared libraries and supported formats || [[Grimwar/Custom content|Browse all custom content workflows]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Import your files ==&lt;br /&gt;
&lt;br /&gt;
# Save the map, then open &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039;. For a standalone resource, open its &#039;&#039;&#039;Content…&#039;&#039;&#039; controls in VSDK.&lt;br /&gt;
# Choose a content type and select &#039;&#039;&#039;Import files&#039;&#039;&#039;.&lt;br /&gt;
# Review the imported names and settings. The SDK may offer controls such as audio playback type or volume.&lt;br /&gt;
# Select the new asset in the appropriate material, model, entity, or script field.&lt;br /&gt;
&lt;br /&gt;
Vertex keeps imported source under &amp;lt;code&amp;gt;Content/&amp;lt;/code&amp;gt; and records it in &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt;. Keep both beside the map or resource manifest. Importing a file makes it available; you still need to place it or reference it.&lt;br /&gt;
&lt;br /&gt;
An asset key identifies the package and asset, for example &amp;lt;code&amp;gt;asset:shared_sounds/my_wind_loop_01&amp;lt;/code&amp;gt;. Display names can change without changing that key. Use &#039;&#039;&#039;Replace media&#039;&#039;&#039; to replace a file while retaining its references. Reimporting it as a new asset creates a different entry.&lt;br /&gt;
&lt;br /&gt;
Models may have companion materials and textures. Keep those files together when importing. &#039;&#039;&#039;Rebuild model previews&#039;&#039;&#039; refreshes the editor preview after external changes; the game compiler still builds the runtime model.&lt;br /&gt;
&lt;br /&gt;
== Sounds and music ==&lt;br /&gt;
&lt;br /&gt;
Grimwar&#039;s &#039;&#039;&#039;Sound&#039;&#039;&#039; import type accepts WAV, Ogg Vorbis, and MP3. Use it for effects, ambience, announcements, or music. The [[Grimwar/Custom content#Sounds and music|sound walkthrough]] covers playback settings, volume, and selecting a sound on an &amp;lt;code&amp;gt;env_ambient&amp;lt;/code&amp;gt; entity. To keep reusable audio outside map folders, [[Grimwar/Custom content#Make a reusable media pack|create a shared media pack]] and use its sound from each map.&lt;br /&gt;
&lt;br /&gt;
== Materials and prefabs authored in Unity ==&lt;br /&gt;
&lt;br /&gt;
For a general selection of custom assets across Grimwar maps, follow [[Grimwar/Custom content/Materials and models|Unity materials and models for Vertex]]. Keep one personal SDK copy in a shared library folder outside your map projects, create assets beneath its &amp;lt;code&amp;gt;Compiler/Assets/CustomContent/&amp;lt;/code&amp;gt;, and export its catalog. Connect each map to that same library to select its assets in the Materials and Models browsers. The guide covers each folder and setting with a wall material and a crate prefab. Dropping files into a Unity folder alone does not add them to Vertex, and Content&#039;s file importer does not accept &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== Use an installed package ==&lt;br /&gt;
&lt;br /&gt;
Select an installed asset in Content and choose &#039;&#039;&#039;Use this package&#039;&#039;&#039;. Vertex records the provider&#039;s add-on ID and references the asset by key. The resulting build depends on that package and does not include another copy of its files.&lt;br /&gt;
&lt;br /&gt;
The provider must be installed and enabled in the game. Publish and distribute the provider as well as the map or mod that uses it. A different display title or Workshop item number does not replace the stable package ID.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Copy files into this package&#039;&#039;&#039; creates an owned copy when you want to distribute and maintain the files yourself. References to other packages that you keep using remain dependencies. Check that the asset&#039;s terms permit redistribution.&lt;br /&gt;
&lt;br /&gt;
== Check what ships ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check build contents&#039;&#039;&#039; lists selected files, sizes, and the references or inclusion settings that bring them into the build. Use it before publishing a large package.&lt;br /&gt;
&lt;br /&gt;
Enable &#039;&#039;&#039;Include in build&#039;&#039;&#039; for files used only through dynamically constructed script references. An unchecked asset is still included when the map or another included asset needs it.&lt;br /&gt;
&lt;br /&gt;
Missing providers, cycles, unsupported formats, or changed source files can stop a build. Fix the reported source or dependency and rebuild. Avoid editing the generated package manifest to bypass an error.&lt;br /&gt;
&lt;br /&gt;
For supported formats, a complete sound example, and reusable media packs, see [[Grimwar/Custom content]]. For another game&#039;s support, use that game&#039;s SDK documentation.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex&amp;diff=287</id>
		<title>Vertex</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex&amp;diff=287"/>
		<updated>2026-10-04T16:30:11Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Vertex is a level editor for brush geometry, terrain, models, entities, and map scripts. It runs on Windows and macOS. A game&#039;s SDK supplies its assets, entity types, compiler, and playtesting tools.&lt;br /&gt;
&lt;br /&gt;
== Start here ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! You want to… !! Guide&lt;br /&gt;
|-&lt;br /&gt;
| Open the editor and save a map || [[Vertex/Getting started]]&lt;br /&gt;
|-&lt;br /&gt;
| Build geometry, apply materials, and place objects || [[Vertex/Editing]]&lt;br /&gt;
|-&lt;br /&gt;
| Add sounds, music, textures, models, or shared assets || [[Vertex/Content|Custom content]]&lt;br /&gt;
|-&lt;br /&gt;
| Connect entity events to actions || [[Vertex/VSig]]&lt;br /&gt;
|-&lt;br /&gt;
| Use Vertex with a game you are making || [[Vertex/Integrating your game]]&lt;br /&gt;
|-&lt;br /&gt;
| Make something for Grimwar || [[Grimwar/Getting started|Grimwar modding]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vertex and your game ==&lt;br /&gt;
&lt;br /&gt;
You can draw geometry and export models without a game SDK. To place game entities or build a playable map, open the SDK supplied by that game&#039;s author. Vertex reads the available tools from that connection; installing a different SDK changes the assets and entity types you can use.&lt;br /&gt;
&lt;br /&gt;
For Grimwar, install the Grimwar SDK from Steam&#039;s Tools library. Its VSDK launcher sets up the compiler and opens Vertex. Follow [[Grimwar/SDK setup|SDK setup]] before the first map build.&lt;br /&gt;
&lt;br /&gt;
Keep your editable &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; file, scripts, and imported media together. The exported add-on is a separate build that players install. [[Vertex/Getting started#Keep the source|Keep the source]] even after publishing.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Template:VertexNav&amp;diff=286</id>
		<title>Template:VertexNav</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Template:VertexNav&amp;diff=286"/>
		<updated>2026-10-04T16:30:09Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;game-nav game-nav--vertex&amp;quot;&amp;gt;[[Vertex|Vertex]] · [[Vertex/Getting started|Getting started]] · [[Vertex/Editing|Editing]] · [[Vertex/Content|Custom content]] · [[Vertex/VSig|Map logic]] · [[Vertex/Integrating your game|Game integration]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Template:GameNav&amp;diff=285</id>
		<title>Template:GameNav</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Template:GameNav&amp;diff=285"/>
		<updated>2026-10-04T16:30:07Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;game-nav&amp;quot;&amp;gt;[[Grimwar|Overview]] · [[Grimwar/Getting started|Getting started]] · [[Grimwar/SDK setup|SDK setup]] · [[Grimwar/Mapping|Maps]] · [[Grimwar/Custom content|Custom content]] · [[Grimwar/Entities|Entities]] · [[Grimwar/VSig|VSig]] · [[Grimwar/VMod|VMod]] · [[Grimwar/Steam Workshop addons|Workshop]] · [[Grimwar/Addons|Addons]] · [[Grimwar/Dedicated servers|Servers]] · [[Grimwar/Troubleshooting|Help]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Help:Contents&amp;diff=283</id>
		<title>Help:Contents</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Help:Contents&amp;diff=283"/>
		<updated>2026-10-04T16:30:02Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Reading the wiki ==&lt;br /&gt;
&lt;br /&gt;
Choose [[Vertex]] for editor controls and game integration, [[Grimwar]] for maps and mods, or [[ANEURISM IV]] for community hosting. The sidebar switches products and has direct Grimwar SDK links for maps, custom content, sounds, and materials/models. Links above each guide lead to related topics. Parent-page links below the title take you back up the product hierarchy. Use [[Grimwar/Entities|the entity index]] to look up an exact Grimwar class or search for its name.&lt;br /&gt;
&lt;br /&gt;
For assets, start at [[Grimwar/Custom content]]. Its topic index links to [[Grimwar/Custom content#Sounds and music|sounds and music]], [[Grimwar/Custom content/Materials and models|materials and models]], shared libraries, supported formats, and naming examples. The materials/models guide is a child of Custom content, so its parent link returns to that index.&lt;br /&gt;
&lt;br /&gt;
Start pages cover the usual workflow. VSig and VMod have separate detailed references for larger scripts. Every page has a history showing who changed it and when.&lt;br /&gt;
&lt;br /&gt;
== Editing ==&lt;br /&gt;
&lt;br /&gt;
Staff and approved editors can use either the visual editor or the wikitext editor. Use preview before saving, provide a concise edit summary, and keep each change focused.&lt;br /&gt;
&lt;br /&gt;
== Discussions ==&lt;br /&gt;
&lt;br /&gt;
Use the associated talk page to discuss documentation changes. Sign talk-page comments with &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Common maintenance pages ==&lt;br /&gt;
&lt;br /&gt;
* [[Special:RecentChanges|Recent changes]]&lt;br /&gt;
* [[Special:AllPages|All pages]]&lt;br /&gt;
* [[Special:Categories|Categories]]&lt;br /&gt;
* [[Special:ListFiles|Uploaded files]]&lt;br /&gt;
* [[Special:Version|Wiki software and extensions]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Unity_custom_content&amp;diff=282</id>
		<title>Grimwar/Unity custom content</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Unity_custom_content&amp;diff=282"/>
		<updated>2026-10-04T16:29:59Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Grimwar/Custom content/Materials and models]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/SDK_setup&amp;diff=281</id>
		<title>Grimwar/SDK setup</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/SDK_setup&amp;diff=281"/>
		<updated>2026-10-04T16:29:58Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
The Grimwar SDK includes Vertex for maps, VSDK for setup and standalone resources, and Grimwar&#039;s assets and compiler. This wiki is the maintained source for Vellocet SDK guidance.&lt;br /&gt;
&lt;br /&gt;
== Install the SDK ==&lt;br /&gt;
&lt;br /&gt;
# In Steam&#039;s Library, enable the &#039;&#039;&#039;Tools&#039;&#039;&#039; filter and install &#039;&#039;&#039;Grimwar SDK&#039;&#039;&#039;. Install Grimwar too if you want to playtest.&lt;br /&gt;
# Launch the SDK to open VSDK.&lt;br /&gt;
# For map builds, install and activate Unity &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt; through Unity Hub. Add build support for the targets you will use. VSDK detects standard installations; choose the Unity executable if detection misses yours.&lt;br /&gt;
# Choose your installed Grimwar executable or macOS app for playtesting.&lt;br /&gt;
# Select &#039;&#039;&#039;Finish setup and open Vertex&#039;&#039;&#039;. Setup prepares a writable compiler cache and registers the game.&lt;br /&gt;
# Create a map and save it outside the SDK installation.&lt;br /&gt;
&lt;br /&gt;
Map compilation runs Unity through the SDK. You author in Vertex and play in Grimwar. You do not need to create a Unity project or install a Unity package by hand for this workflow.&lt;br /&gt;
&lt;br /&gt;
A VMod containing only scripts, sounds, or ordinary data can be validated and built without Unity. Imported models, materials, textures, fonts, and video use the Unity compiler. Map lighting also needs a working graphics device.&lt;br /&gt;
&lt;br /&gt;
== Choose a workflow ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What you are making !! Start here&lt;br /&gt;
|-&lt;br /&gt;
| Map || Open Vertex, then [[Grimwar/Mapping|make a map]].&lt;br /&gt;
|-&lt;br /&gt;
| Map logic || Open the map&#039;s Code workspace and follow [[Grimwar/VSig|VSig]].&lt;br /&gt;
|-&lt;br /&gt;
| Standalone server mod || In VSDK, select &#039;&#039;&#039;VMod&#039;&#039;&#039; and &#039;&#039;&#039;Create…&#039;&#039;&#039;. See [[Grimwar/VMod]].&lt;br /&gt;
|-&lt;br /&gt;
| C# behavior attached to one map || Use &#039;&#039;&#039;Map → SDK resources → VMod → Create…&#039;&#039;&#039; in Vertex.&lt;br /&gt;
|-&lt;br /&gt;
| Reusable media || In VSDK, select &#039;&#039;&#039;Media pack&#039;&#039;&#039;, create it, and open &#039;&#039;&#039;Content…&#039;&#039;&#039;. See [[Grimwar/Custom content]].&lt;br /&gt;
|-&lt;br /&gt;
| Sounds, ambience, or music || Follow [[Grimwar/Custom content#Sounds and music|Sounds and music]] for importing audio, sharing it across maps, and playing it in the game.&lt;br /&gt;
|-&lt;br /&gt;
| Shared custom materials, models, and prefabs || Follow [[Grimwar/Custom content/Materials and models]] to keep one asset library outside your map folders. Author assets in its &amp;lt;code&amp;gt;Compiler/Assets/CustomContent/&amp;lt;/code&amp;gt; and connect your maps to the same Materials and Models selection.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Files and updates ==&lt;br /&gt;
&lt;br /&gt;
Keep your maps, scripts, thumbnails, &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt;, and imported files together in a source folder you control. Keep build output separate. Steam can replace SDK files during an update.&lt;br /&gt;
&lt;br /&gt;
Update the complete SDK through Steam and launch VSDK again. Do not mix an editor executable from one SDK release with the catalogs or compiler from another. Your source files and local preferences stay outside the installation.&lt;br /&gt;
&lt;br /&gt;
In Vertex, use &#039;&#039;&#039;Settings → Game and resources → Reload resources&#039;&#039;&#039; after changing or refreshing the game connection. Engine and game executable paths are under &#039;&#039;&#039;Build → Advanced&#039;&#039;&#039;. Standalone Vertex can open the same installation through &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Build profiles ==&lt;br /&gt;
&lt;br /&gt;
Vertex&#039;s &#039;&#039;&#039;Preview&#039;&#039;&#039; profile builds for local testing on the selected platform. VSDK calls its local standalone-resource output a Development package. These packages are for testing and cannot be published to Workshop.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release&#039;&#039;&#039; map exports include Windows client, macOS client, and Linux dedicated-server artifacts. Install the matching Unity build modules. The SDK enforces the required navigation, spatial, occlusion, and lighting policy.&lt;br /&gt;
&lt;br /&gt;
Choose a 1920 × 1080 thumbnail before publishing. Vertex maps accept PNG or JPEG through &#039;&#039;&#039;Map → Thumbnail&#039;&#039;&#039;; standalone VMods use a PNG path in &amp;lt;code&amp;gt;mod.json.thumbnail&amp;lt;/code&amp;gt;. A map can compile without artwork, but Workshop publication requires it. See [[Grimwar/Steam Workshop addons]].&lt;br /&gt;
&lt;br /&gt;
== If you are integrating your own game ==&lt;br /&gt;
&lt;br /&gt;
Read [[Vertex/Integrating your game]]. Your game supplies its own catalogs, entity behavior, compiler, and runtime loader. A local developer connection can offer &#039;&#039;&#039;Save to Unity&#039;&#039;&#039; for that game project. Grimwar&#039;s public SDK supplies a compiler, so its community workflow is &#039;&#039;&#039;Export add-on&#039;&#039;&#039; and &#039;&#039;&#039;Play in Game&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Mapping&amp;diff=280</id>
		<title>Grimwar/Mapping</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Mapping&amp;diff=280"/>
		<updated>2026-10-04T16:29:56Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Create the map in Vertex, build it with the Grimwar SDK, and test it in the installed game. Complete [[Grimwar/SDK setup#Install the SDK|SDK setup]] first.&lt;br /&gt;
&lt;br /&gt;
== Create and name the map ==&lt;br /&gt;
&lt;br /&gt;
Save a new map in a source folder you own, such as &amp;lt;code&amp;gt;Maps/arena_mycustommap/arena_mycustommap.vertex&amp;lt;/code&amp;gt;. Keep its companion script and thumbnail there; reusable custom assets stay in your [[Grimwar/Custom content|shared content libraries]]. Use &#039;&#039;&#039;File → Welcome… → Open repository…&#039;&#039;&#039; to find existing editable maps in a local checkout.&lt;br /&gt;
&lt;br /&gt;
The filename sets the map ID and exported add-on ID. &amp;lt;code&amp;gt;arena_mycustommap.vertex&amp;lt;/code&amp;gt; produces &amp;lt;code&amp;gt;arena_mycustommap&amp;lt;/code&amp;gt;, including the underscores. Set &#039;&#039;&#039;Title&#039;&#039;&#039; under &#039;&#039;&#039;Settings → Map details&#039;&#039;&#039; to a readable display name such as &#039;&#039;&#039;My Custom Map&#039;&#039;&#039;. Changing the title does not rename the ID; &#039;&#039;&#039;Save As / Copy…&#039;&#039;&#039; with a different filename does.&lt;br /&gt;
&lt;br /&gt;
Choose an ID that does not collide with a built-in map or another installed add-on. Use lowercase names with underscores. The &amp;lt;code&amp;gt;arena_&amp;lt;/code&amp;gt; filename prefix is a naming convention, not a game-mode switch. Choose the mode when hosting. The current Vertex SDK connection uses King of the Hill for its default playtest launch.&lt;br /&gt;
&lt;br /&gt;
== Build a playable space ==&lt;br /&gt;
&lt;br /&gt;
Start with a floor, walls, and a route between spawn areas. See [[Vertex/Editing]] for drawing, clipping, materials, models, terrain, and collision controls.&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Auto&#039;&#039;&#039; collision for ordinary geometry and inspect it with &#039;&#039;&#039;Shift+C&#039;&#039;&#039;. Box or Convex collision can seal a visible doorway. For moving doors and platforms, put their geometry beneath the corresponding entity in the hierarchy so it moves with the entity.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Prefabs&#039;&#039;&#039; browser includes a burn barrel and Order/Union spawn-door assemblies. Place an assembly to inspect how its models, triggers, doors, audio, and script host fit together. Linked instances remain editable.&lt;br /&gt;
&lt;br /&gt;
== Place spawns and objectives ==&lt;br /&gt;
&lt;br /&gt;
Use the entity creation controls and give the objects readable, stable names.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Purpose !! Entities and setup&lt;br /&gt;
|-&lt;br /&gt;
| Team spawn || [[Grimwar/Entities/info_player_spawn|info_player_spawn]]. Set Team explicitly; the default is Union. Provide usable spawns for each participating team.&lt;br /&gt;
|-&lt;br /&gt;
| King of the Hill or capture objectives || [[Grimwar/Entities/game_capture_point|game_capture_point]]. Set the starting owner and capture times.&lt;br /&gt;
|-&lt;br /&gt;
| Uplink || [[Grimwar/Entities/game_capture_flag|game_capture_flag]]. Configure the prerequisite graph and exactly one middle flag.&lt;br /&gt;
|-&lt;br /&gt;
| Blitz || [[Grimwar/Entities/game_blitz_tank|game_blitz_tank]] with path points and child [[Grimwar/Entities/game_blitz_checkpoint|checkpoints]].&lt;br /&gt;
|-&lt;br /&gt;
| Gravewar facilities || [[Grimwar/Entities/trigger_gravewar_skull_deposit|Skull deposit]] and [[Grimwar/Entities/trigger_gravewar_upgrade_zone|upgrade zone]].&lt;br /&gt;
|-&lt;br /&gt;
| Supplies || [[Grimwar/Entities/item_pickup|item_pickup]] or [[Grimwar/Entities/func_resupply|func_resupply]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The [[Grimwar/Entities|entity reference]] lists entity types. Its individual pages include placement, settings, defaults, and script signals.&lt;br /&gt;
&lt;br /&gt;
Volumes use their authored orientation and size. Keep a trigger large enough to overlap a player, and check its team/activator filters. A new &amp;lt;code&amp;gt;trigger_multiple&amp;lt;/code&amp;gt; has &#039;&#039;&#039;Allowed Teams: None&#039;&#039;&#039;, which blocks participants until you select the intended teams.&lt;br /&gt;
&lt;br /&gt;
== Optional map settings and music ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Map Settings&#039;&#039;&#039; (&amp;lt;code&amp;gt;info_map_settings&amp;lt;/code&amp;gt;) is optional. You can compile, export, and play a map without placing one or choosing music. Omitted settings use the game defaults; the default loading and gameplay score is &#039;&#039;&#039;Ordainment&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To override the score, place one Map Settings entity and choose &#039;&#039;&#039;Compound&#039;&#039;&#039;, &#039;&#039;&#039;Ritual&#039;&#039;&#039;, &#039;&#039;&#039;Arcade&#039;&#039;&#039;, or &#039;&#039;&#039;Ordainment&#039;&#039;&#039; in &#039;&#039;&#039;Music Set&#039;&#039;&#039;. Leaving Music Set at &#039;&#039;&#039;Unassigned&#039;&#039;&#039; also uses Ordainment. The map filename and title do not select music.&lt;br /&gt;
&lt;br /&gt;
Do not put objects beneath Map Settings: the compiler reads its overrides and removes the settings object from the compiled scene. Duplicate settings entities and invalid music values remain build errors. A package with no &amp;lt;code&amp;gt;musicSet&amp;lt;/code&amp;gt; value also uses the default score.&lt;br /&gt;
&lt;br /&gt;
== Add logic and media ==&lt;br /&gt;
&lt;br /&gt;
Vertex associates a &amp;lt;code&amp;gt;.vsig&amp;lt;/code&amp;gt; script with the map. Use the Code workspace to connect entity outputs to inputs, such as a trigger opening a door. [[Grimwar/VSig]] gives a complete example.&lt;br /&gt;
&lt;br /&gt;
For C# behavior tied to this map, use &#039;&#039;&#039;Map → SDK resources → VMod → Create…&#039;&#039;&#039; or attach an existing resource inside the source folder. The map build includes it; you do not need a second installed package. See [[Grimwar/VMod#Attach a VMod to a map|map-bound VMods]].&lt;br /&gt;
&lt;br /&gt;
For custom materials, models, and prefabs in your general asset selection, follow [[Grimwar/Custom content/Materials and models|the shared Unity asset library guide]]. Keep the library outside your map folders and connect each map to it. &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039; imports files owned by this map; references to another installed package become dependencies. See [[Grimwar/Custom content]].&lt;br /&gt;
&lt;br /&gt;
For &#039;&#039;&#039;sounds and music&#039;&#039;&#039;, follow [[Grimwar/Custom content#Sounds and music|the audio walkthrough]]. It covers shared audio packs, the Sound import type, playback settings, and placing an &amp;lt;code&amp;gt;env_ambient&amp;lt;/code&amp;gt; entity.&lt;br /&gt;
&lt;br /&gt;
== Set lighting and a thumbnail ==&lt;br /&gt;
&lt;br /&gt;
Set the sky, sun, ambient light, and fog in Map Environment. Place &amp;lt;code&amp;gt;env_light&amp;lt;/code&amp;gt; entities for local lights. Use Mixed or Dynamic lighting for animated or scripted lights; Area lights are baked only.&lt;br /&gt;
&lt;br /&gt;
Choose a lightmap quality for your test. &#039;&#039;&#039;None&#039;&#039;&#039; skips lightmap/APV baking but does not skip Grimwar&#039;s required navigation, spatial, and occlusion work. Check the compiled lighting in the game.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;&#039;Map → Thumbnail&#039;&#039;&#039;, choose a PNG or JPEG. Vertex uses it for the add-on thumbnail and in-game map image. Use 1920 × 1080 for release artwork. Vertex copies an image from outside the source folder beside the map, so include that copy when sharing the source.&lt;br /&gt;
&lt;br /&gt;
== Compile and play ==&lt;br /&gt;
&lt;br /&gt;
# Save the map and any externally edited script or media files.&lt;br /&gt;
# Select &#039;&#039;&#039;Preview&#039;&#039;&#039; and your desktop target in Build.&lt;br /&gt;
# Select &#039;&#039;&#039;Play in Game&#039;&#039;&#039;. Vertex captures the inputs, compiles, installs the add-on, and launches Grimwar.&lt;br /&gt;
# In &#039;&#039;&#039;Addons&#039;&#039;&#039;, confirm the package is valid and enabled. Choose &#039;&#039;&#039;Use This Copy&#039;&#039;&#039; if a Workshop or older local copy is selected.&lt;br /&gt;
# Open &#039;&#039;&#039;Host&#039;&#039;&#039;, select the map and intended game mode, and use &#039;&#039;&#039;Local&#039;&#039;&#039; access for an unpublished build.&lt;br /&gt;
# Test collision, spawns, objectives, sounds, scripts, and more than one round. Reload the map to check initialization again.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export add-on&#039;&#039;&#039; performs the build without launching the game. &#039;&#039;&#039;Open current output&#039;&#039;&#039; shows the generated package. Close a running playtest before replacing its loaded bundles.&lt;br /&gt;
&lt;br /&gt;
The default install location is Grimwar&#039;s user add-on library; [[Grimwar/Addons#Install a local package|Using add-ons]] lists the platform paths. You can choose a separate output folder in Build&#039;s Advanced settings for isolated tests.&lt;br /&gt;
&lt;br /&gt;
== Build for publishing ==&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Release&#039;&#039;&#039; and export the map. Release includes Windows client, macOS client, and Linux dedicated-server output. Install every required Unity target module and resolve all build errors before publishing.&lt;br /&gt;
&lt;br /&gt;
Keep the generated folder intact. It contains &amp;lt;code&amp;gt;addon.json&amp;lt;/code&amp;gt;, platform files, and build receipts used to verify the package. Editing generated files breaks that verification; change the source and rebuild instead.&lt;br /&gt;
&lt;br /&gt;
Publish from Grimwar&#039;s Addons screen following [[Grimwar/Steam Workshop addons]]. Publish required media packs first. An unpublished local package has no download source for other players and is restricted to local testing.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Getting_started&amp;diff=279</id>
		<title>Grimwar/Getting started</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Getting_started&amp;diff=279"/>
		<updated>2026-10-04T16:29:55Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Install the [[Grimwar/SDK setup|Grimwar SDK]], then choose a small first project.&lt;br /&gt;
&lt;br /&gt;
== A first map ==&lt;br /&gt;
&lt;br /&gt;
# Open Vertex from VSDK and save a map as &amp;lt;code&amp;gt;arena_mycustommap.vertex&amp;lt;/code&amp;gt; in your own source folder.&lt;br /&gt;
# Draw a floor and a few walls. Apply a material from the Grimwar catalog.&lt;br /&gt;
# Add &amp;lt;code&amp;gt;info_player_spawn&amp;lt;/code&amp;gt; points for Order and Union. Keep them above the floor with room to stand.&lt;br /&gt;
# For a first King of the Hill test, add a neutral &amp;lt;code&amp;gt;game_capture_point&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open Build, choose &#039;&#039;&#039;Preview&#039;&#039;&#039; and your platform, then &#039;&#039;&#039;Play in Game&#039;&#039;&#039;.&lt;br /&gt;
# In Grimwar, host the map with &#039;&#039;&#039;Local&#039;&#039;&#039; access and test movement, spawns, and the capture point.&lt;br /&gt;
&lt;br /&gt;
Continue with [[Grimwar/Mapping|Mapping]] for map naming, entities, thumbnails, and Release builds. [[Vertex/Editing]] covers the editor controls.&lt;br /&gt;
&lt;br /&gt;
== A custom sound ==&lt;br /&gt;
&lt;br /&gt;
Open &#039;&#039;&#039;Map → Content…&#039;&#039;&#039;, choose &#039;&#039;&#039;Sound&#039;&#039;&#039;, and import a WAV, Ogg Vorbis, or MP3 file. Select an appropriate playback type, then assign it to an &amp;lt;code&amp;gt;env_ambient&amp;lt;/code&amp;gt; entity&#039;s &#039;&#039;&#039;Custom Cue&#039;&#039;&#039;. Build and play the map to hear it.&lt;br /&gt;
&lt;br /&gt;
[[Grimwar/Custom content]] explains looping sounds, reusable packs, dependencies, and using the same media from a VMod.&lt;br /&gt;
&lt;br /&gt;
== A server mod ==&lt;br /&gt;
&lt;br /&gt;
In VSDK, select &#039;&#039;&#039;VMod&#039;&#039;&#039; and &#039;&#039;&#039;Create…&#039;&#039;&#039;. Edit the generated source, validate it, then build and playtest. A script-only VMod does not need Unity. Follow [[Grimwar/VMod]] for a working command example and map-bound scripts.&lt;br /&gt;
&lt;br /&gt;
== Share your work ==&lt;br /&gt;
&lt;br /&gt;
Keep the editable source. Distribute the generated add-on folder, or build Release and publish it through Grimwar&#039;s Addons screen. See [[Grimwar/Steam Workshop addons|Workshop publishing]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Getting started]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Custom_content&amp;diff=278</id>
		<title>Grimwar/Custom content</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Custom_content&amp;diff=278"/>
		<updated>2026-10-04T16:29:52Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Custom content includes &#039;&#039;&#039;sounds and music, textures and materials, models and prefabs&#039;&#039;&#039;, plus fonts, video, and data. Start with the kind of asset you want to add:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Content !! Guide&lt;br /&gt;
|-&lt;br /&gt;
| Sounds, ambient audio, and music || [[#Sounds and music|Import and play audio]], including playback types and volume.&lt;br /&gt;
|-&lt;br /&gt;
| Textures and Unity materials || [[Grimwar/Custom content/Materials and models#3. Create a wall material|Create a material]] in your shared asset library.&lt;br /&gt;
|-&lt;br /&gt;
| Models and prefabs || [[Grimwar/Custom content/Materials and models#4. Import a model and save a prefab|Import a model, assign materials, and add collision]].&lt;br /&gt;
|-&lt;br /&gt;
| One Materials and Models selection for all your maps || [[Grimwar/Custom content/Materials and models|Set up a shared Unity asset library]] outside map folders.&lt;br /&gt;
|-&lt;br /&gt;
| Shared sounds and other imported media || [[#Make a reusable media pack|Create a media pack]] and reference it from your maps or mods.&lt;br /&gt;
|-&lt;br /&gt;
| Audio and data in C# mods || [[#Use media in a VMod|Use media in a VMod]].&lt;br /&gt;
|-&lt;br /&gt;
| File extensions, size limits, and naming || [[#Supported imports|Supported imports]] and [[#Naming examples|naming examples]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Keep reusable source assets in a general library outside your map folders. Use a Unity asset library for authored materials and prefabs, or a media pack for imported sounds and other supported files. Vertex&#039;s map Content window also supports files owned by one map. The SDK builds the required assets and records package dependencies.&lt;br /&gt;
&lt;br /&gt;
== Sounds and music ==&lt;br /&gt;
&lt;br /&gt;
Import audio through the &#039;&#039;&#039;Sound&#039;&#039;&#039; type in Vertex or VSDK. It accepts &#039;&#039;&#039;WAV, Ogg Vorbis, and MP3&#039;&#039;&#039;, with a 32 MiB limit per source. Playback settings cover sound effects, ambience, announcements, and music; you do not need to create Unity materials or export a model catalog for audio.&lt;br /&gt;
&lt;br /&gt;
For sounds shared across maps, first [[#Make a reusable media pack|create a media pack]] in your general source library, then select its sound in the map&#039;s Content window and choose &#039;&#039;&#039;Use this package&#039;&#039;&#039;. Place an &amp;lt;code&amp;gt;env_ambient&amp;lt;/code&amp;gt; entity and select that sound in &#039;&#039;&#039;Custom Cue&#039;&#039;&#039;, as in the placement steps below. Your original audio stays in the pack&#039;s source folder.&lt;br /&gt;
&lt;br /&gt;
The following example imports a sound owned by one map. The same playback and entity controls apply when selecting a sound from a shared pack.&lt;br /&gt;
&lt;br /&gt;
=== Add a sound to a map ===&lt;br /&gt;
&lt;br /&gt;
# Save the map, for example &amp;lt;code&amp;gt;arena_mycustommap.vertex&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039;, choose &#039;&#039;&#039;Sound&#039;&#039;&#039;, then &#039;&#039;&#039;Import files&#039;&#039;&#039;. Select &amp;lt;code&amp;gt;my_wind_loop_01.wav&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Set &#039;&#039;&#039;Playback&#039;&#039;&#039; to &#039;&#039;&#039;AmbientLoop&#039;&#039;&#039; for a looping sound with a world position. Adjust &#039;&#039;&#039;Volume&#039;&#039;&#039; between 0 and 1.&lt;br /&gt;
# Place an [[Grimwar/Entities/env_ambient|env_ambient]] entity and select the imported sound in &#039;&#039;&#039;Custom Cue&#039;&#039;&#039;. Leave &#039;&#039;&#039;Play On Start&#039;&#039;&#039; enabled to hear it when the map loads.&lt;br /&gt;
# Build with &#039;&#039;&#039;Play in Game&#039;&#039;&#039; and check the volume and placement in Grimwar.&lt;br /&gt;
&lt;br /&gt;
The imported sound has a key such as &amp;lt;code&amp;gt;asset:arena_mycustommap/my_wind_loop_01&amp;lt;/code&amp;gt;. Custom Cue takes priority over the entity&#039;s base-game Event Name. You do not need to build Wwise banks or write an audio manifest.&lt;br /&gt;
&lt;br /&gt;
The source stays under &amp;lt;code&amp;gt;Content/&amp;lt;/code&amp;gt;, with its settings in &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt;. Keep both with the map. Use &#039;&#039;&#039;Replace media&#039;&#039;&#039; to update the sound without changing its key.&lt;br /&gt;
&lt;br /&gt;
=== Pick the playback type ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Use&lt;br /&gt;
|-&lt;br /&gt;
| Announcer || Non-spatial announcements.&lt;br /&gt;
|-&lt;br /&gt;
| Sfx2D || A non-spatial one-shot sound.&lt;br /&gt;
|-&lt;br /&gt;
| Sfx3D || A one-shot sound at a world position.&lt;br /&gt;
|-&lt;br /&gt;
| AmbientLoop || A looping sound at a world position.&lt;br /&gt;
|-&lt;br /&gt;
| MusicLoop || Looping music.&lt;br /&gt;
|-&lt;br /&gt;
| Ambience2DLoop || Looping non-spatial ambience.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For a sound that starts from a door or objective, disable Play On Start and call the ambient entity from a client VSig handler. See [[Grimwar/VSig#Server and client logic|Server and client logic]].&lt;br /&gt;
&lt;br /&gt;
An ambient entity&#039;s &#039;&#039;&#039;Audible Distance&#039;&#039;&#039; is its emitter radius, not a guaranteed cutoff distance. Point mode stays at the marker. Volumetric mode follows the nearest boundary of its oriented box when the listener is outside and plays in 2D inside.&lt;br /&gt;
&lt;br /&gt;
For Grimwar&#039;s built-in loading and gameplay score, see [[Grimwar/Mapping#Optional map settings and music|Map Settings and music]]. Importing an audio file does not add it to the built-in Music Set choices.&lt;br /&gt;
&lt;br /&gt;
== Make a reusable media pack ==&lt;br /&gt;
&lt;br /&gt;
# Open VSDK and select &#039;&#039;&#039;Media pack&#039;&#039;&#039;, then &#039;&#039;&#039;Create…&#039;&#039;&#039;. Choose a new source folder outside the SDK installation, such as &amp;lt;code&amp;gt;shared_sounds&amp;lt;/code&amp;gt;. The folder name becomes the pack&#039;s stable ID.&lt;br /&gt;
# Open &#039;&#039;&#039;Content…&#039;&#039;&#039; and set its title, author, and version.&lt;br /&gt;
# Import your files and choose their settings. Mark assets intended for other packages with &#039;&#039;&#039;Include in build&#039;&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;&#039;Check build contents&#039;&#039;&#039; and review the file list and size.&lt;br /&gt;
# Build into Grimwar&#039;s add-on folder and enable the package in the game.&lt;br /&gt;
&lt;br /&gt;
In another map or VMod&#039;s Content window, select an installed asset from this pack and choose &#039;&#039;&#039;Use this package&#039;&#039;&#039;. A reference such as &amp;lt;code&amp;gt;asset:shared_sounds/my_wind_loop_01&amp;lt;/code&amp;gt; points to the provider. The consuming build records &amp;lt;code&amp;gt;shared_sounds&amp;lt;/code&amp;gt; as a requirement and leaves the sound bytes in the provider&#039;s package.&lt;br /&gt;
&lt;br /&gt;
Install and enable both packages to test them. Publish the media pack first, then the map or mod that depends on it. Keep the provider ID and asset keys stable in updates. Removing or renaming a published key can break consumers even if the pack&#039;s display title stays the same.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Copy files into this package&#039;&#039;&#039; when you want an independent copy you can edit and distribute. Check the creator&#039;s redistribution terms first. Other external references still keep their own dependencies.&lt;br /&gt;
&lt;br /&gt;
== Use media in a VMod ==&lt;br /&gt;
&lt;br /&gt;
Open the VMod&#039;s &#039;&#039;&#039;Content…&#039;&#039;&#039; controls in VSDK. For an attached VMod, select it under the map&#039;s SDK resources and use that resource&#039;s Content button. Importing there gives the script local names for its own assets.&lt;br /&gt;
&lt;br /&gt;
For a sound imported as &amp;lt;code&amp;gt;my_round_start_01&amp;lt;/code&amp;gt; with the Announcer or Sfx2D playback type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var result = context.Audio.PlayToAll(&amp;quot;my_round_start_01&amp;quot;);&lt;br /&gt;
if (!result.Success)&lt;br /&gt;
    context.Log.Warn(result.Message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use a full asset key for a sound from a shared pack:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var result = context.Audio.PlayFromPlayer(&lt;br /&gt;
    playerId, &amp;quot;asset:shared_sounds/my_wind_loop_01&amp;quot;, 0.5f);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here &amp;lt;code&amp;gt;context&amp;lt;/code&amp;gt; is the &amp;lt;code&amp;gt;IModContext&amp;lt;/code&amp;gt; saved in &amp;lt;code&amp;gt;OnLoad&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; identifies a connected player. This second example needs an AmbientLoop or Sfx3D cue. &amp;lt;code&amp;gt;PlayFromPlayer&amp;lt;/code&amp;gt; uses the player&#039;s authoritative pawn position. Save &amp;lt;code&amp;gt;result.Value&amp;lt;/code&amp;gt; from a successful play if you need to stop it later with &amp;lt;code&amp;gt;context.Audio.Stop&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PlayToAll&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PlayToPlayer&amp;lt;/code&amp;gt; accept non-spatial cue types. &amp;lt;code&amp;gt;PlayAt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PlayFromPlayer&amp;lt;/code&amp;gt; accept Sfx3D and AmbientLoop. Playback gain multiplies the cue&#039;s own volume.&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Use this package&#039;&#039;&#039; to record a selected provider. When declaring a dependency directly in a VMod manifest, put its add-on ID in &amp;lt;code&amp;gt;requires&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;dependencies&amp;lt;/code&amp;gt; instead lists VMod IDs for script load order.&lt;br /&gt;
&lt;br /&gt;
API 15 also exposes declared text/data through &amp;lt;code&amp;gt;Content&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
string rules;&lt;br /&gt;
if (context.Content.TryReadText(&amp;quot;rules&amp;quot;, out rules))&lt;br /&gt;
    context.Log.Write(rules);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the file through the resource&#039;s Content window and keep it included in the build. &amp;lt;code&amp;gt;Content.Describe(key)&amp;lt;/code&amp;gt; reads asset metadata. These APIs operate on declared assets; they do not give a VMod access to arbitrary files.&lt;br /&gt;
&lt;br /&gt;
== Supported imports ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Source formats !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Sound || WAV, Ogg Vorbis, MP3 || Up to 32 MiB per source. Set the playback type and volume.&lt;br /&gt;
|-&lt;br /&gt;
| Surface material || PNG, JPG/JPEG, TGA || Creates a surface material from an image. Up to 16 MiB per source.&lt;br /&gt;
|-&lt;br /&gt;
| Image / texture || PNG, JPG/JPEG, TGA || Up to 16 MiB per source. Select the type the consuming field expects.&lt;br /&gt;
|-&lt;br /&gt;
| Model || FBX, OBJ || Import supported MTL and image companions alongside it. Review scale and collision.&lt;br /&gt;
|-&lt;br /&gt;
| Font || TTF, OTF || Requires a supported game consumer.&lt;br /&gt;
|-&lt;br /&gt;
| Video || MP4, WebM, MOV || Requires a supported game consumer; importing a clip does not place a video screen.&lt;br /&gt;
|-&lt;br /&gt;
| Text / data || TXT, JSON, CSV, Markdown || Up to 8 MiB per source; usable through the VMod Content API.&lt;br /&gt;
|-&lt;br /&gt;
| Binary data || BIN || Packaged data for supported consumers, not executable code.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Native Unity media, including models, materials, textures, fonts, and video, needs the SDK&#039;s pinned Unity compiler and target modules. Sounds and ordinary data use platform-independent files. Import support does not imply that every entity or VMod service can consume every type.&lt;br /&gt;
&lt;br /&gt;
== Naming examples ==&lt;br /&gt;
&lt;br /&gt;
Use lowercase names with underscores for map and custom asset files. Give asset variants a numbered suffix such as &amp;lt;code&amp;gt;_01&amp;lt;/code&amp;gt;. These examples use the same names throughout the guides:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Asset !! Example&lt;br /&gt;
|-&lt;br /&gt;
| Map and companion script || &amp;lt;code&amp;gt;arena_mycustommap.vertex&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;arena_mycustommap.vsig&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Wall material || &amp;lt;code&amp;gt;my_brick_wall_01.mat&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Color texture || &amp;lt;code&amp;gt;my_brick_wall_01_basecolor.png&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Crate material, model, and prefab || &amp;lt;code&amp;gt;my_crate_01.mat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;my_crate_01.fbx&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;my_crate_01.prefab&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Ambient sound || &amp;lt;code&amp;gt;my_wind_loop_01.wav&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Catalog profile and exported catalog || &amp;lt;code&amp;gt;my_custom_assets.asset&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;my_custom_assets.vertexassets&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The map filename determines its ID: &amp;lt;code&amp;gt;arena_mycustommap.vertex&amp;lt;/code&amp;gt; exports as &amp;lt;code&amp;gt;arena_mycustommap&amp;lt;/code&amp;gt;. A readable display title such as &#039;&#039;&#039;My Custom Map&#039;&#039;&#039; is separate. Keep existing asset keys, catalog IDs, and Unity &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files stable when updating published work. Keep supplied SDK files and folders at their installed names.&lt;br /&gt;
&lt;br /&gt;
== Keep builds small and repeatable ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Check build contents&#039;&#039;&#039; to see what is included and why. Unreferenced files can stay in your source folder without shipping. &#039;&#039;&#039;Include in build&#039;&#039;&#039; keeps an asset available when code chooses its key at runtime; a referenced asset is included even if that checkbox is off.&lt;br /&gt;
&lt;br /&gt;
Keep model companion files together. Use &#039;&#039;&#039;Rebuild model previews&#039;&#039;&#039; after editing a model externally. Rebuild the package after any source change; the compiler reuses matching verified output where it can.&lt;br /&gt;
&lt;br /&gt;
Avoid copying the same large library into every map. Put shared assets in a media pack when you want a common update and dependency. Use an owned copy when a map needs to keep its own version.&lt;br /&gt;
&lt;br /&gt;
== Artwork and distribution ==&lt;br /&gt;
&lt;br /&gt;
Set a media pack&#039;s title, author, version, and PNG thumbnail in Content. Use a 1920 × 1080 thumbnail for Release. Enable &#039;&#039;&#039;Release package&#039;&#039;&#039; in VSDK, build, and publish the result as &#039;&#039;&#039;Content&#039;&#039;&#039; from Grimwar&#039;s Addons screen.&lt;br /&gt;
&lt;br /&gt;
Keep the entire output folder, including its generated &amp;lt;code&amp;gt;addon.json&amp;lt;/code&amp;gt; and catalogs. The editable &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt; is source; it is not an installable package by itself. See [[Grimwar/Steam Workshop addons]] for dependencies and updates.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Addons&amp;diff=277</id>
		<title>Grimwar/Addons</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Addons&amp;diff=277"/>
		<updated>2026-10-04T16:29:51Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
An add-on is a complete package folder containing &amp;lt;code&amp;gt;addon.json&amp;lt;/code&amp;gt; and its declared files. It can provide a map, a VMod, audio, other media, or a supported combination. Install the whole folder; a loose &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt;, scene, script, or resource manifest is not an installed add-on.&lt;br /&gt;
&lt;br /&gt;
== Install from Workshop ==&lt;br /&gt;
&lt;br /&gt;
# Launch Grimwar through Steam.&lt;br /&gt;
# Open &#039;&#039;&#039;Addons → Browse Steam Workshop&#039;&#039;&#039;, or visit [https://steamcommunity.com/app/4219460/workshop/ Grimwar Workshop].&lt;br /&gt;
# Subscribe to the item and wait for Steam to finish installing it.&lt;br /&gt;
# Return to Addons and confirm the package is valid and enabled.&lt;br /&gt;
# Install and enable its required packages too. For a map, open Host and select it.&lt;br /&gt;
&lt;br /&gt;
Steam manages subscribed files. Keep your own editable source outside those folders. When joining a server, Grimwar checks the required add-on IDs and exact build IDs before completing the join.&lt;br /&gt;
&lt;br /&gt;
== Install a local package ==&lt;br /&gt;
&lt;br /&gt;
Copy the built package folder into the user add-on library, or build there directly from Vertex/VSDK:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Platform !! Default library&lt;br /&gt;
|-&lt;br /&gt;
| Windows || &amp;lt;code&amp;gt;%LOCALAPPDATA%/Vellocet/Grimwar/addons&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| macOS || &amp;lt;code&amp;gt;~/Library/Application Support/Vellocet/Grimwar/addons&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Linux || &amp;lt;code&amp;gt;$XDG_DATA_HOME/Vellocet/Grimwar/addons&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;~/.local/share/Vellocet/Grimwar/addons&amp;lt;/code&amp;gt; when XDG_DATA_HOME is unset.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example, the installed manifest for &amp;lt;code&amp;gt;arena_mycustommap&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;addons/arena_mycustommap/addon.json&amp;lt;/code&amp;gt;. Choose the parent add-on library as a build output root, not the package&#039;s child folder.&lt;br /&gt;
&lt;br /&gt;
A separate test library can be supplied with &amp;lt;code&amp;gt;--addon-root&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;GRIMWAR_ADDON_ROOT&amp;lt;/code&amp;gt;. Vertex&#039;s Play in Game supplies the configured library. A custom data root changes the normal user-library location; server operators can use &amp;lt;code&amp;gt;vmod_runtime_paths&amp;lt;/code&amp;gt; to find it.&lt;br /&gt;
&lt;br /&gt;
== Use the Addons screen ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Action !! Result&lt;br /&gt;
|-&lt;br /&gt;
| Enable / Disable || Allow or prevent mounting the package.&lt;br /&gt;
|-&lt;br /&gt;
| Use This Copy || Select a particular local or Workshop copy with the same add-on ID.&lt;br /&gt;
|-&lt;br /&gt;
| Open Folder || Find an installed disk-backed package.&lt;br /&gt;
|-&lt;br /&gt;
| Download/Update || Request the current Workshop build.&lt;br /&gt;
|-&lt;br /&gt;
| View on Steam || Open its Workshop page.&lt;br /&gt;
|-&lt;br /&gt;
| Publish / Update || Publish an eligible local Release package.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Grimwar groups copies by the stable add-on ID. An external test folder normally takes priority over Workshop, which takes priority over the manual library. Use This Copy overrides that choice. Only one copy of an ID is mounted.&lt;br /&gt;
&lt;br /&gt;
If your latest edit does not appear, check which copy is selected. Built-in map IDs cannot be replaced by an add-on. Give a new map its own readable filename and ID.&lt;br /&gt;
&lt;br /&gt;
== Test an unpublished map ==&lt;br /&gt;
&lt;br /&gt;
Build Preview in Vertex and select &#039;&#039;&#039;Play in Game&#039;&#039;&#039;. In Grimwar, confirm the local package is selected, then open &#039;&#039;&#039;Host&#039;&#039;&#039;. Returning to Host rescans the folders.&lt;br /&gt;
&lt;br /&gt;
An unpublished map has no guest download source. Grimwar uses &#039;&#039;&#039;Local&#039;&#039;&#039; access and &#039;&#039;&#039;Test Map&#039;&#039;&#039; for that session. Publish a Release package to Workshop before inviting players who need to acquire it.&lt;br /&gt;
&lt;br /&gt;
== Dependencies and shared assets ==&lt;br /&gt;
&lt;br /&gt;
A package&#039;s &amp;lt;code&amp;gt;requires&amp;lt;/code&amp;gt; entries are stable add-on IDs. The required providers must be installed, valid, and enabled. Missing packages, dependency cycles, and conflicting copies prevent loading.&lt;br /&gt;
&lt;br /&gt;
Use Content in Vertex or VSDK to select an installed asset and choose &#039;&#039;&#039;Use this package&#039;&#039;&#039;. It records the requirement and keeps the provider&#039;s media in that provider. See [[Grimwar/Custom content#Make a reusable media pack|reusable media packs]].&lt;br /&gt;
&lt;br /&gt;
In a VMod manifest, &amp;lt;code&amp;gt;requires&amp;lt;/code&amp;gt; means add-on content dependencies. &amp;lt;code&amp;gt;dependencies&amp;lt;/code&amp;gt; means VMod load order. Neither field takes Steam Workshop numbers or generated build IDs.&lt;br /&gt;
&lt;br /&gt;
== Browse reusable content ==&lt;br /&gt;
&lt;br /&gt;
Use the Content window while authoring. In Grimwar, the console command &amp;lt;code&amp;gt;audio_browser&amp;lt;/code&amp;gt; opens the mounted audio catalog. &amp;lt;code&amp;gt;content_browser audio&amp;lt;/code&amp;gt; opens the same view.&lt;br /&gt;
&lt;br /&gt;
Use KIND, FILTER, and SOURCE to find a cue. Select it to inspect the provider, version, build, and source; Preview plays supported audio. Copy reference gives its cue/event reference, and Copy dependency gives its provider add-on ID. Refresh after changing mounted packages.&lt;br /&gt;
&lt;br /&gt;
This game browser shows mounted content. It does not import files. Use Vertex/VSDK Content to import your own files. Base-game &amp;lt;code&amp;gt;Play_amb...&amp;lt;/code&amp;gt; events can be used by ambient entities; internal &amp;lt;code&amp;gt;Play_User_...&amp;lt;/code&amp;gt; routes are not custom cue IDs.&lt;br /&gt;
&lt;br /&gt;
== VMods and dedicated servers ==&lt;br /&gt;
&lt;br /&gt;
Standalone VMods run for the server session. Attached VMods load and unload with their map. Both execute on the server, even when a client carries the source in a Workshop download.&lt;br /&gt;
&lt;br /&gt;
For a manual server install, copy the complete package into the server&#039;s add-on directory. Restart, or use &amp;lt;code&amp;gt;vmod_runtime_reload&amp;lt;/code&amp;gt; after unloading map-bound scripts and leaving scripted game modes. Check &amp;lt;code&amp;gt;vmod_runtime_list&amp;lt;/code&amp;gt; for failures.&lt;br /&gt;
&lt;br /&gt;
Dedicated servers acquire Workshop items through &amp;lt;code&amp;gt;config/server-addons.json&amp;lt;/code&amp;gt;. Use &amp;lt;code&amp;gt;items&amp;lt;/code&amp;gt; for direct item IDs, &amp;lt;code&amp;gt;collections&amp;lt;/code&amp;gt; for Workshop collections, and &amp;lt;code&amp;gt;manualItems&amp;lt;/code&amp;gt; only for manually staged packages that need a matching Workshop identity. See [[Grimwar/Dedicated servers#Install Workshop add-ons|server setup]].&lt;br /&gt;
&lt;br /&gt;
== Package errors ==&lt;br /&gt;
&lt;br /&gt;
Keep the build output intact. Generated manifests record file sizes, hashes, and platform artifacts. If a package was edited, partially copied, or built for an unsupported version, rebuild or reinstall it.&lt;br /&gt;
&lt;br /&gt;
For a local map, check the chosen copy, required packages, and target platform first. [[Grimwar/Troubleshooting]] covers build and runtime failures.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar&amp;diff=276</id>
		<title>Grimwar</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar&amp;diff=276"/>
		<updated>2026-10-04T16:29:50Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Find guides for using add-ons, making maps and mods, and hosting Grimwar servers.&lt;br /&gt;
&lt;br /&gt;
== Create maps and mods ==&lt;br /&gt;
&lt;br /&gt;
Start with [[Grimwar/SDK setup|SDK setup]], then follow [[Grimwar/Getting started|your first project]]. The Grimwar SDK includes [[Vertex]], game assets, entities, and build tools.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Goal !! Guide&lt;br /&gt;
|-&lt;br /&gt;
| Build and play a map || [[Grimwar/Mapping]]&lt;br /&gt;
|-&lt;br /&gt;
| Browse custom asset workflows and supported formats || [[Grimwar/Custom content]]&lt;br /&gt;
|-&lt;br /&gt;
| Add sounds, ambience, or music || [[Grimwar/Custom content#Sounds and music|Sounds and music]]&lt;br /&gt;
|-&lt;br /&gt;
| Create textures, materials, models, or prefabs || [[Grimwar/Custom content/Materials and models|Materials and models]]&lt;br /&gt;
|-&lt;br /&gt;
| Share audio and other imported files across maps || [[Grimwar/Custom content#Make a reusable media pack|Media packs]]&lt;br /&gt;
|-&lt;br /&gt;
| Look up an entity and its settings || [[Grimwar/Entities]]&lt;br /&gt;
|-&lt;br /&gt;
| Connect triggers, doors, and round events || [[Grimwar/VSig]]&lt;br /&gt;
|-&lt;br /&gt;
| Write server commands or a custom game mode || [[Grimwar/VMod]]&lt;br /&gt;
|-&lt;br /&gt;
| Publish a map, VMod, or content pack || [[Grimwar/Steam Workshop addons]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Play and host ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Goal !! Guide&lt;br /&gt;
|-&lt;br /&gt;
| Install maps and mods, manage dependencies, or select a local build || [[Grimwar/Addons|Using add-ons]]&lt;br /&gt;
|-&lt;br /&gt;
| Run a community server || [[Grimwar/Dedicated servers]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Get help ==&lt;br /&gt;
&lt;br /&gt;
If a setup, build, or playtest fails, start with [[Grimwar/Troubleshooting]].&lt;br /&gt;
&lt;br /&gt;
These guides describe the SDK with Vertex and VMod API 15. Update the game and SDK together. The SDK launcher reports the required Unity version; current Grimwar map builds use &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Custom_content/Materials_and_models&amp;diff=275</id>
		<title>Grimwar/Custom content/Materials and models</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Custom_content/Materials_and_models&amp;diff=275"/>
		<updated>2026-10-04T16:29:48Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Clarify custom content navigation and standardize asset examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
[[Grimwar/Custom content|← All custom content]] · [[Grimwar/Custom content#Sounds and music|Sounds and music]] · [[Grimwar/Custom content#Make a reusable media pack|Shared media packs]]&lt;br /&gt;
&lt;br /&gt;
Build one personal asset library for Vertex&#039;s &#039;&#039;&#039;Materials&#039;&#039;&#039; and &#039;&#039;&#039;Models&#039;&#039;&#039; browsers. Every map connected to that library can select the same custom materials, models, and prefabs. This walkthrough adds a wall material and a crate prefab to that shared selection.&lt;br /&gt;
&lt;br /&gt;
For custom sounds, ambient audio, and music, follow [[Grimwar/Custom content#Sounds and music|Sounds and music]]. Audio uses the &#039;&#039;&#039;Sound&#039;&#039;&#039; import type and can live in a shared media pack outside your map folders.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keep the library in &amp;lt;code&amp;gt;Documents/GrimwarLibrary/&amp;lt;/code&amp;gt;, and create your assets under its &amp;lt;code&amp;gt;Compiler/Assets/CustomContent/&amp;lt;/code&amp;gt; folder.&#039;&#039;&#039; Keep map projects separately, for example under &amp;lt;code&amp;gt;Documents/GrimwarMaps/&amp;lt;/code&amp;gt;. Set up the library once, export its catalog, and connect your maps to the same SDK copy. A folder alone does not register its contents with Vertex.&lt;br /&gt;
&lt;br /&gt;
Use this library for textures, Unity &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; files, models, and &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files that you want in your general selection. Vertex&#039;s &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039; imports files into the map&#039;s own source folder; those imports are covered separately by [[Grimwar/Custom content]]. Content&#039;s file importer does not accept &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== 1. Set up your shared asset library ==&lt;br /&gt;
&lt;br /&gt;
# Complete [[Grimwar/SDK setup|SDK setup]]. Install Unity &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt; and the build modules you need.&lt;br /&gt;
# In Steam, open Grimwar SDK&#039;s &#039;&#039;&#039;Manage → Browse local files&#039;&#039;&#039;. Locate &amp;lt;code&amp;gt;Grimwar.vertexsdk&amp;lt;/code&amp;gt; and its sibling &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; folders.&lt;br /&gt;
# Copy that SDK folder, with all its contents, to &amp;lt;code&amp;gt;Documents/GrimwarLibrary/&amp;lt;/code&amp;gt; outside Steam. This is your shared working copy for all your maps; create it once.&lt;br /&gt;
# Keep your Vertex maps in separate folders, for example &amp;lt;code&amp;gt;Documents/GrimwarMaps/arena_mycustommap/arena_mycustommap.vertex&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Documents/GrimwarMaps/arena_mysecondmap/arena_mysecondmap.vertex&amp;lt;/code&amp;gt;. Both will use the same library.&lt;br /&gt;
# In Unity Hub, add the existing project at &amp;lt;code&amp;gt;Documents/GrimwarLibrary/Compiler&amp;lt;/code&amp;gt; and open it with the pinned Unity version. Select &#039;&#039;&#039;Compiler&#039;&#039;&#039;, not its parent folder or its &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder. Let package resolution, script compilation, and asset imports finish.&lt;br /&gt;
# For Unity&#039;s scene and material previews, open &#039;&#039;&#039;Edit → Project Settings → Graphics&#039;&#039;&#039;. If &#039;&#039;&#039;Default Render Pipeline&#039;&#039;&#039; is empty, assign the supplied &amp;lt;code&amp;gt;Assets/VertexSdk/Rendering/Pipeline.asset&amp;lt;/code&amp;gt;. Keep the SDK&#039;s quality settings. See [https://docs.unity3d.com/6000.3/Documentation/Manual/srp-setting-render-pipeline-asset.html Unity&#039;s render pipeline settings].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; Unity&#039;s Project window shows &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;, including &amp;lt;code&amp;gt;CustomContent&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;VertexSdk&amp;lt;/code&amp;gt;. Resolve any Console errors before continuing. This is the SDK&#039;s asset-authoring and compiler project; playtest the map in Grimwar.&lt;br /&gt;
&lt;br /&gt;
The Steam installation and Vertex&#039;s generated compiler cache are replaceable. Neither is a place to keep your original work. Keep the SDK&#039;s supplied packages and base assets intact in your working copy.&lt;br /&gt;
&lt;br /&gt;
== 2. Create the content folders ==&lt;br /&gt;
&lt;br /&gt;
In Unity&#039;s &#039;&#039;&#039;Project&#039;&#039;&#039; window, expand &amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt;. Right-click it and use &#039;&#039;&#039;Create → Folder&#039;&#039;&#039; to create &amp;lt;code&amp;gt;Textures&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Materials&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Models&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;Prefabs&amp;lt;/code&amp;gt; directly inside it. These folders belong to your general asset library. You can add subfolders for themes or asset packs as the library grows.&lt;br /&gt;
&lt;br /&gt;
After completing the guide, your files will look like this. Unity also creates &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files beside assets and folders; keep those files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Documents/&lt;br /&gt;
  GrimwarMaps/&lt;br /&gt;
    arena_mycustommap/&lt;br /&gt;
      arena_mycustommap.vertex&lt;br /&gt;
    arena_mysecondmap/&lt;br /&gt;
      arena_mysecondmap.vertex&lt;br /&gt;
  GrimwarLibrary/                       shared by both maps&lt;br /&gt;
    Grimwar.vertexsdk&lt;br /&gt;
    Authoring/&lt;br /&gt;
      Grimwar.vertexgame&lt;br /&gt;
      my_custom_assets.vertexassets     exported catalog&lt;br /&gt;
      previews/                         generated catalog previews&lt;br /&gt;
    Compiler/                           open this folder in Unity Hub&lt;br /&gt;
      Assets/&lt;br /&gt;
        CustomContent/&lt;br /&gt;
          my_custom_assets.asset        catalog profile created in step 5&lt;br /&gt;
          Textures/&lt;br /&gt;
            my_brick_wall_01_basecolor.png&lt;br /&gt;
            my_crate_01_basecolor.png&lt;br /&gt;
          Materials/&lt;br /&gt;
            my_brick_wall_01.mat&lt;br /&gt;
            my_crate_01.mat&lt;br /&gt;
          Models/&lt;br /&gt;
            my_crate_01.fbx&lt;br /&gt;
          Prefabs/&lt;br /&gt;
            my_crate_01.prefab&lt;br /&gt;
        VertexSdk/                      supplied SDK assets&lt;br /&gt;
      Packages/&lt;br /&gt;
      ProjectSettings/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt; is the path &#039;&#039;&#039;inside Unity&#039;&#039;&#039;. &amp;lt;code&amp;gt;Documents/GrimwarLibrary/Compiler/Assets/CustomContent&amp;lt;/code&amp;gt; is the same folder on disk. &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; is outside the Unity project&#039;s &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder. Neither map folder contains the library&#039;s source assets.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;texture&#039;&#039;&#039; is an image. A &#039;&#039;&#039;material&#039;&#039;&#039; combines a shader, textures, and surface settings. A &#039;&#039;&#039;model&#039;&#039;&#039; supplies meshes. A &#039;&#039;&#039;prefab&#039;&#039;&#039; saves a model&#039;s hierarchy, assigned materials, and components such as colliders. Vertex uses the material on a brush face and the model or prefab as a placed object.&lt;br /&gt;
&lt;br /&gt;
Use lowercase names with underscores and numbered asset variants, as shown in the [[Grimwar/Custom content#Naming examples|naming examples]]. Keep the supplied SDK filenames and folder names unchanged.&lt;br /&gt;
&lt;br /&gt;
== 3. Create a wall material ==&lt;br /&gt;
&lt;br /&gt;
# Drag &amp;lt;code&amp;gt;my_brick_wall_01_basecolor.png&amp;lt;/code&amp;gt; from your file manager into &amp;lt;code&amp;gt;Assets/CustomContent/Textures&amp;lt;/code&amp;gt; in Unity&#039;s Project window. Wait for import to finish.&lt;br /&gt;
# Right-click the &amp;lt;code&amp;gt;Materials&amp;lt;/code&amp;gt; folder and choose &#039;&#039;&#039;Create → Material&#039;&#039;&#039;. Name it &amp;lt;code&amp;gt;my_brick_wall_01&amp;lt;/code&amp;gt;; Unity saves &amp;lt;code&amp;gt;my_brick_wall_01.mat&amp;lt;/code&amp;gt; there.&lt;br /&gt;
# Select the material. In the Inspector, set &#039;&#039;&#039;Shader&#039;&#039;&#039; to &#039;&#039;&#039;Universal Render Pipeline/Lit&#039;&#039;&#039;. Use &#039;&#039;&#039;Surface Type: Opaque&#039;&#039;&#039; for an ordinary solid wall.&lt;br /&gt;
# Drag the imported image into &#039;&#039;&#039;Base Map&#039;&#039;&#039; under Surface Inputs. Leave the adjacent color white to use the image&#039;s original colors.&lt;br /&gt;
# For a plain non-metallic wall, start with &#039;&#039;&#039;Metallic: 0&#039;&#039;&#039; and &#039;&#039;&#039;Smoothness: 0&#039;&#039;&#039;. Increase Smoothness only if you want a shinier surface. For a matte surface without specular shine, also disable &#039;&#039;&#039;Specular Highlights&#039;&#039;&#039; and &#039;&#039;&#039;Environment Reflections&#039;&#039;&#039; under Advanced Options.&lt;br /&gt;
# If you have a normal map, import it into &amp;lt;code&amp;gt;Textures&amp;lt;/code&amp;gt;, select that texture, set &#039;&#039;&#039;Texture Type: Normal map&#039;&#039;&#039;, and click &#039;&#039;&#039;Apply&#039;&#039;&#039;. Assign it to the material&#039;s &#039;&#039;&#039;Normal Map&#039;&#039;&#039; field. A normal map is optional.&lt;br /&gt;
# Save your project changes. The asset you will choose in Vertex is &#039;&#039;&#039;my_brick_wall_01&#039;&#039;&#039;, the material, rather than the raw PNG.&lt;br /&gt;
&lt;br /&gt;
Use an SDK-supported shader such as URP/Lit. A custom material can use that shader with your own textures and settings; add-on maps cannot bring arbitrary custom shaders or Shader Graph shaders from &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; &amp;lt;code&amp;gt;Materials/my_brick_wall_01.mat&amp;lt;/code&amp;gt; exists and its Base Map references your texture. Vertex&#039;s preview shows basic color and transparency; judge normal maps, reflections, and final lighting in the compiled game. For the remaining material controls, see [https://docs.unity3d.com/6000.3/Documentation/Manual/urp/lit-shader.html Unity&#039;s URP Lit reference].&lt;br /&gt;
&lt;br /&gt;
== 4. Import a model and save a prefab ==&lt;br /&gt;
&lt;br /&gt;
# Export a model such as &amp;lt;code&amp;gt;my_crate_01.fbx&amp;lt;/code&amp;gt; from your modeling tool. Use metres, a deliberate pivot, and UVs for the material. Put its image files in your &amp;lt;code&amp;gt;Textures&amp;lt;/code&amp;gt; folder and the model in &amp;lt;code&amp;gt;Models&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Select &amp;lt;code&amp;gt;my_crate_01.fbx&amp;lt;/code&amp;gt; in Unity&#039;s Project window. Check its import scale and orientation. Apply changed import settings. As a size check, compare it with a Unity cube, which is one unit across at scale 1; one Unity unit represents one metre here.&lt;br /&gt;
# Create &amp;lt;code&amp;gt;Materials/my_crate_01.mat&amp;lt;/code&amp;gt; using the material steps above and its own Base Map. If the model already contains embedded materials, its &#039;&#039;&#039;Materials&#039;&#039;&#039; import tab can &#039;&#039;&#039;Extract Materials…&#039;&#039;&#039; into your &amp;lt;code&amp;gt;Materials&amp;lt;/code&amp;gt; folder. Check extracted materials&#039; shaders and texture assignments. See [https://docs.unity3d.com/6000.3/Documentation/Manual/FBXImporter-Materials.html Unity&#039;s model material settings].&lt;br /&gt;
# Drag &amp;lt;code&amp;gt;my_crate_01.fbx&amp;lt;/code&amp;gt; from the Project window into a temporary scene. On each relevant Mesh Renderer, assign &amp;lt;code&amp;gt;my_crate_01.mat&amp;lt;/code&amp;gt; to its &#039;&#039;&#039;Materials&#039;&#039;&#039; slots. For a model with several submeshes, assign the material for each slot.&lt;br /&gt;
# For a solid crate, add a &#039;&#039;&#039;Box Collider&#039;&#039;&#039; and adjust its Center and Size to fit. A renderer alone does not make an object solid. Keep the example a static prop; arbitrary custom C# components are not a substitute for supported Grimwar entities or map scripts.&lt;br /&gt;
# Name the scene object &amp;lt;code&amp;gt;my_crate_01&amp;lt;/code&amp;gt;. Drag it from the &#039;&#039;&#039;Hierarchy&#039;&#039;&#039; into &amp;lt;code&amp;gt;Assets/CustomContent/Prefabs&amp;lt;/code&amp;gt; in the &#039;&#039;&#039;Project&#039;&#039;&#039; window. If Unity asks whether to create an Original Prefab or Prefab Variant, choose &#039;&#039;&#039;Original Prefab&#039;&#039;&#039; for this example. This creates &amp;lt;code&amp;gt;my_crate_01.prefab&amp;lt;/code&amp;gt;. See [https://docs.unity3d.com/6000.3/Documentation/Manual/CreatingPrefabs.html Unity&#039;s prefab creation guide].&lt;br /&gt;
# Select the saved prefab in the Project window and confirm it contains the renderer&#039;s material assignments and the collider. Later changes must be saved to this prefab, not left only on a scene instance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; &amp;lt;code&amp;gt;Prefabs/my_crate_01.prefab&amp;lt;/code&amp;gt; is the assembled prop you will place in Vertex. The raw &amp;lt;code&amp;gt;Models/my_crate_01.fbx&amp;lt;/code&amp;gt; can also appear in the browser, but choosing it does not include overrides or colliders that you added only to the prefab.&lt;br /&gt;
&lt;br /&gt;
Keep the model, prefab, materials, and textures beneath &amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt;. To reuse a model&#039;s material on brush faces, use a separate &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; file: embedded model materials are hidden from Vertex&#039;s material picker.&lt;br /&gt;
&lt;br /&gt;
== 5. Export a catalog for Vertex ==&lt;br /&gt;
&lt;br /&gt;
A catalog tells Vertex which assets exist and provides their previews. The original Unity assets remain in &amp;lt;code&amp;gt;Compiler/Assets&amp;lt;/code&amp;gt; for the map compiler to use.&lt;br /&gt;
&lt;br /&gt;
# In the Project window, right-click &amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt; and choose &#039;&#039;&#039;Create → Vertex → Asset catalog profile&#039;&#039;&#039;. Name the asset &amp;lt;code&amp;gt;my_custom_assets&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Select it and set &#039;&#039;&#039;Catalog Id&#039;&#039;&#039; to &amp;lt;code&amp;gt;my_library.assets&amp;lt;/code&amp;gt; and &#039;&#039;&#039;Catalog Version&#039;&#039;&#039; to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Keep these values stable as you edit this asset library.&lt;br /&gt;
# Expand &#039;&#039;&#039;Folders&#039;&#039;&#039; in the Inspector and add one element. Set that element&#039;s &#039;&#039;&#039;Folder&#039;&#039;&#039; to &amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt; and &#039;&#039;&#039;Ownership&#039;&#039;&#039; to &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Enable &#039;&#039;&#039;Materials&#039;&#039;&#039;, &#039;&#039;&#039;Models&#039;&#039;&#039;, &#039;&#039;&#039;Prefabs&#039;&#039;&#039;, and &#039;&#039;&#039;Textures&#039;&#039;&#039; for that element. Leave &#039;&#039;&#039;Material Dependencies Only&#039;&#039;&#039; disabled so your standalone materials appear in the picker. Leave the other settings at their defaults.&lt;br /&gt;
# Save the project. With &amp;lt;code&amp;gt;my_custom_assets&amp;lt;/code&amp;gt; still selected, choose &#039;&#039;&#039;Tools → Vertex → Export Selected Asset Catalog&#039;&#039;&#039;.&lt;br /&gt;
# In the save dialog, navigate out of &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; to your copy&#039;s &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; folder. Save as &amp;lt;code&amp;gt;my_custom_assets.vertexassets&amp;lt;/code&amp;gt;. The exporter also writes a &amp;lt;code&amp;gt;previews&amp;lt;/code&amp;gt; folder beside it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; Both &amp;lt;code&amp;gt;GrimwarLibrary/Authoring/my_custom_assets.vertexassets&amp;lt;/code&amp;gt; and its preview files exist. Keep the catalog and previews together. Do not replace the supplied &amp;lt;code&amp;gt;Assets/VertexSdk/Assets.asset&amp;lt;/code&amp;gt; profile or the base-game catalog.&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; ownership for your own files. &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; means the asset already ships with Grimwar; it does not mean “shared between my maps.” Incorrectly marking a new asset as base prevents the map from carrying the asset players need. You do not need to add your files to the base game&#039;s Addressables groups.&lt;br /&gt;
&lt;br /&gt;
== 6. Connect your maps to the shared library ==&lt;br /&gt;
&lt;br /&gt;
Edit the library&#039;s connection once, then choose it for each map. Two small JSON edits connect its editable Unity project and exported catalog. Use a plain-text editor, preserve the other fields, and keep the original files as backups outside the Unity &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
=== Tell Vertex to build from your Unity project ===&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;Documents/GrimwarLibrary/Grimwar.vertexsdk&amp;lt;/code&amp;gt; in a text editor.&lt;br /&gt;
&lt;br /&gt;
# Keep &amp;lt;code&amp;gt;&amp;quot;compilerProject&amp;quot;: &amp;quot;Compiler&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Remove the &amp;lt;code&amp;gt;compilerInputs&amp;lt;/code&amp;gt; property and its value. That inventory describes the unmodified distributed SDK.&lt;br /&gt;
# Add &amp;lt;code&amp;gt;&amp;quot;editorProject&amp;quot;: &amp;quot;Compiler&amp;quot;&amp;lt;/code&amp;gt; alongside &amp;lt;code&amp;gt;compilerProject&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Preserve &amp;lt;code&amp;gt;formatVersion&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;game&amp;lt;/code&amp;gt;, and any &amp;lt;code&amp;gt;resourceTools&amp;lt;/code&amp;gt; entries exactly as supplied. Separate neighboring properties with commas and leave no trailing comma before &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The two project properties should now read as follows. This fragment shows only those properties; &#039;&#039;&#039;do not replace the whole file&#039;&#039;&#039; with it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;compilerProject&amp;quot;: &amp;quot;Compiler&amp;quot;,&lt;br /&gt;
  &amp;quot;editorProject&amp;quot;: &amp;quot;Compiler&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This makes the copy a local developer connection: Vertex captures the saved assets from your &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; project when building. Leaving the distributed connection unchanged would use its prepared compiler cache instead.&lt;br /&gt;
&lt;br /&gt;
=== Add your catalog to the game&#039;s asset list ===&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;Documents/GrimwarLibrary/Authoring/Grimwar.vertexgame&amp;lt;/code&amp;gt;. Find the &amp;lt;code&amp;gt;assetCatalogs&amp;lt;/code&amp;gt; array. Keep every existing entry, including &amp;lt;code&amp;gt;grimwar.base&amp;lt;/code&amp;gt;. Add a comma after its last existing entry, then insert this additional object before the array&#039;s closing &amp;lt;code&amp;gt;]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;my_library.assets&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
  &amp;quot;path&amp;quot;: &amp;quot;my_custom_assets.vertexassets&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The path is relative to &amp;lt;code&amp;gt;Authoring/Grimwar.vertexgame&amp;lt;/code&amp;gt;, so do not prepend &amp;lt;code&amp;gt;Authoring/&amp;lt;/code&amp;gt; again. Keep the game&#039;s ID, version, entity catalogs, and build configuration unchanged. The new entry&#039;s ID and version must match the Unity catalog profile from step 5.&lt;br /&gt;
&lt;br /&gt;
=== Choose this connection in Vertex ===&lt;br /&gt;
&lt;br /&gt;
# Save both JSON files and your Unity asset changes. Let Unity finish importing.&lt;br /&gt;
# Open your map in Vertex. Under &#039;&#039;&#039;Settings → Game and resources&#039;&#039;&#039;, select &#039;&#039;&#039;Choose game SDK…&#039;&#039;&#039;. Choose &amp;lt;code&amp;gt;Documents/GrimwarLibrary/Grimwar.vertexsdk&amp;lt;/code&amp;gt;, the file in your shared library. &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039; opens the same chooser.&lt;br /&gt;
# Save the map. Open your other maps and choose that same connection. Saved maps remember their own SDK connection; each map can reference this one library without another SDK copy or asset import.&lt;br /&gt;
# Use &#039;&#039;&#039;Settings → Game and resources → Reload resources&#039;&#039;&#039; after subsequent catalog exports.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; Open either example map. Its &#039;&#039;&#039;Materials&#039;&#039;&#039; browser contains &amp;lt;code&amp;gt;my_brick_wall_01&amp;lt;/code&amp;gt; and its &#039;&#039;&#039;Models&#039;&#039;&#039; browser contains your crate entries. Both maps select from the same library. Base-game materials and entities should still be available. If the base assets disappear, restore the original entries in &amp;lt;code&amp;gt;assetCatalogs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Do not use &#039;&#039;&#039;Load engine assets…&#039;&#039;&#039; as a substitute for this setup. Loading a loose preview catalog does not connect a map&#039;s compiler to the Unity source assets.&lt;br /&gt;
&lt;br /&gt;
== 7. Use the assets and test the add-on ==&lt;br /&gt;
&lt;br /&gt;
# In Vertex&#039;s material browser, search for &amp;lt;code&amp;gt;my_brick_wall_01&amp;lt;/code&amp;gt;. Drag it onto a brush face; hold &#039;&#039;&#039;Shift&#039;&#039;&#039; while dropping to apply it to the whole brush. Adjust the face&#039;s texture scale and alignment as needed.&lt;br /&gt;
# In the model browser, search for &amp;lt;code&amp;gt;my_crate_01&amp;lt;/code&amp;gt;. Choose the entry whose source is &amp;lt;code&amp;gt;Prefabs/my_crate_01.prefab&amp;lt;/code&amp;gt; and drag it into a viewport. Place it, then check its size and orientation.&lt;br /&gt;
# Save the map. In Build, select &#039;&#039;&#039;Preview&#039;&#039;&#039; and your desktop platform, then &#039;&#039;&#039;Play in Game&#039;&#039;&#039;. If requested, select the pinned Unity executable and your Grimwar installation in the build settings.&lt;br /&gt;
# Walk around the crate in Grimwar to check collision. Inspect the wall&#039;s tiling, material, and lighting. Test the actual game even when the Vertex preview looks correct.&lt;br /&gt;
# When ready, use &#039;&#039;&#039;Export add-on&#039;&#039;&#039; with the Release profile and follow [[Grimwar/Steam Workshop addons|the publication guide]].&lt;br /&gt;
&lt;br /&gt;
The build includes referenced custom Unity assets and their required custom dependencies. The exported catalog is a browser index, not an installable add-on; distribute the built add-on rather than loose &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;.vertexassets&amp;lt;/code&amp;gt; files. Players do not need your Unity project to play the compiled map.&lt;br /&gt;
&lt;br /&gt;
Grimwar&#039;s SDK still uses &#039;&#039;&#039;Play in Game&#039;&#039;&#039; and &#039;&#039;&#039;Export add-on&#039;&#039;&#039; with this connection. It does not provide the base game&#039;s playable Unity project or a &#039;&#039;&#039;Save to Unity&#039;&#039;&#039; workflow.&lt;br /&gt;
&lt;br /&gt;
== Updating assets, sharing source, and SDK updates ==&lt;br /&gt;
&lt;br /&gt;
For each edit: &#039;&#039;&#039;change the Unity asset → save/apply it → export my_custom_assets to the same my_custom_assets.vertexassets file → Reload resources in Vertex → rebuild and playtest&#039;&#039;&#039;. All connected maps use this library update when reloaded; rebuild each map you want to distribute with the changed asset. Editing only the PNG or prefab on disk does not refresh an already exported catalog. Changing a prefab instance in a temporary scene does not update the prefab until you apply or save those changes.&lt;br /&gt;
&lt;br /&gt;
Keep existing &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files and the catalog ID. Vertex references Unity assets by their GUID and local file ID, not just by filename. Move assets inside Unity when reorganizing; deleting and recreating an asset can break map references even if you reuse its name.&lt;br /&gt;
&lt;br /&gt;
To hand editable source to another creator, share the map and scripts plus the library&#039;s custom asset folder with all &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files and its catalog profile, the catalog with its previews, and the connection setup for the matching SDK release. They can keep the library in their own general asset folder and connect the map to it. A &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; map alone does not contain these Unity source assets.&lt;br /&gt;
&lt;br /&gt;
If you already created a library inside a map project, move its complete SDK folder to a general location such as &amp;lt;code&amp;gt;Documents/GrimwarLibrary&amp;lt;/code&amp;gt;, then choose its new &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; location in each map. Keep its existing catalog ID, asset names, and &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files; you do not need to rename existing assets to match this guide&#039;s example names.&lt;br /&gt;
&lt;br /&gt;
Your personal SDK copy does not update when Steam updates. For a new SDK release, make a fresh working copy, transfer your custom folder with its &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files, repeat the connection edits on the newly supplied files, and re-export the catalog with the required Unity version. Keep the old working copy until your map builds and playtests successfully. Do not overwrite new SDK packages or the new game profile with old versions.&lt;br /&gt;
&lt;br /&gt;
Your editable source stays in the shared library. An exported add-on includes the custom assets its map references and their required dependencies; selecting one crate does not bundle the whole library. Referenced custom assets can therefore appear in more than one built add-on. The SDK&#039;s shared developer materials are already base-game assets. For reusable imported media distributed once as a separate dependency, see [[Grimwar/Custom content#Make a reusable media pack|media packs]]; the file importer there still accepts the formats listed on that page, not arbitrary Unity prefabs or materials.&lt;br /&gt;
&lt;br /&gt;
== If something is missing or wrong ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What you see !! What to check&lt;br /&gt;
|-&lt;br /&gt;
| Asset exists in Unity but is absent from Vertex || Confirm the file is under the catalog&#039;s folder rule, its type is enabled, and you exported the selected custom profile. Confirm the custom catalog entry is in the connected copy&#039;s &amp;lt;code&amp;gt;Authoring/Grimwar.vertexgame&amp;lt;/code&amp;gt;, then reload resources.&lt;br /&gt;
|-&lt;br /&gt;
| Model appears, but its material cannot be chosen for a brush || Extract or create a standalone &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt;. Embedded materials are hidden. Disable Material Dependencies Only on your custom folder rule and remove a &amp;lt;code&amp;gt;VertexHidden&amp;lt;/code&amp;gt; asset label if you intentionally added one.&lt;br /&gt;
|-&lt;br /&gt;
| Asset previews correctly, but the build says the asset or profile is missing || Check the map&#039;s chosen &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt;. Its local &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; project must contain both the original assets and &amp;lt;code&amp;gt;my_custom_assets.asset&amp;lt;/code&amp;gt;. A copied catalog alone is insufficient. Check the &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt; edit and preserve &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files.&lt;br /&gt;
|-&lt;br /&gt;
| Material is pink, gray, or missing a texture || Check the shader and renderer material slots in Unity, and confirm all texture references resolve. Use URP/Lit and check Unity&#039;s render pipeline assignment from step 1, then save, export, reload, and rebuild. A Vertex preview does not prove that an unsupported shader can run in the game.&lt;br /&gt;
|-&lt;br /&gt;
| Crate looks correct but the player walks through it || Check the saved prefab&#039;s enabled collider, the placed model&#039;s collision setting in Vertex, and whether you placed the prefab rather than the raw model. Test collision in Grimwar.&lt;br /&gt;
|-&lt;br /&gt;
| Crate is too large, too small, or rotated incorrectly || Correct the model import scale/orientation or the saved prefab transform in Unity. Apply, re-export, reload, and rebuild. Compare against a one-metre cube.&lt;br /&gt;
|-&lt;br /&gt;
| Connection fails after editing JSON || Check commas and brackets, preserve the supplied fields, and match the catalog&#039;s ID/version exactly. The catalog path is relative to the game profile; both project paths are relative to &amp;lt;code&amp;gt;Grimwar.vertexsdk&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Compiler setup reports unresolved packages or missing package-resolution data || Open the copied &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; project in the pinned Unity editor and let Package Manager and asset import finish successfully before building from Vertex.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Mapping]] [[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Mapping&amp;diff=274</id>
		<title>Grimwar/Mapping</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Mapping&amp;diff=274"/>
		<updated>2026-10-04T16:11:50Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Keep custom assets in one library shared across maps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Create the map in Vertex, build it with the Grimwar SDK, and test it in the installed game. Complete [[Grimwar/SDK setup#Install the SDK|SDK setup]] first.&lt;br /&gt;
&lt;br /&gt;
== Create and name the map ==&lt;br /&gt;
&lt;br /&gt;
Save a new map in a source folder you own, such as &amp;lt;code&amp;gt;Maps/my_arena/my_arena.vertex&amp;lt;/code&amp;gt;. Keep the companion script, thumbnail, and custom media there. Use &#039;&#039;&#039;File → Welcome… → Open repository…&#039;&#039;&#039; to find existing editable maps in a local checkout.&lt;br /&gt;
&lt;br /&gt;
The filename sets the map ID and exported add-on ID. &amp;lt;code&amp;gt;sb_developer.vertex&amp;lt;/code&amp;gt; produces &amp;lt;code&amp;gt;sb_developer&amp;lt;/code&amp;gt;, including the underscore. Set &#039;&#039;&#039;Map → Title&#039;&#039;&#039; to a readable display name. Changing the title does not rename the ID; &#039;&#039;&#039;Save As / Copy…&#039;&#039;&#039; with a different filename does.&lt;br /&gt;
&lt;br /&gt;
Choose an ID that does not collide with a built-in map or another installed add-on. An &amp;lt;code&amp;gt;sb_&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;koth_&amp;lt;/code&amp;gt;, or other filename prefix is a naming convention, not a game-mode switch. Choose the mode when hosting. The current Vertex SDK connection uses King of the Hill for its default playtest launch.&lt;br /&gt;
&lt;br /&gt;
== Build a playable space ==&lt;br /&gt;
&lt;br /&gt;
Start with a floor, walls, and a route between spawn areas. See [[Vertex/Editing]] for drawing, clipping, materials, models, terrain, and collision controls.&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Auto&#039;&#039;&#039; collision for ordinary geometry and inspect it with &#039;&#039;&#039;Shift+C&#039;&#039;&#039;. Box or Convex collision can seal a visible doorway. For moving doors and platforms, put their geometry beneath the corresponding entity in the hierarchy so it moves with the entity.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Prefabs&#039;&#039;&#039; browser includes a burn barrel and Order/Union spawn-door assemblies. Place an assembly to inspect how its models, triggers, doors, audio, and script host fit together. Linked instances remain editable.&lt;br /&gt;
&lt;br /&gt;
== Place spawns and objectives ==&lt;br /&gt;
&lt;br /&gt;
Use the entity creation controls and give the objects readable, stable names.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Purpose !! Entities and setup&lt;br /&gt;
|-&lt;br /&gt;
| Team spawn || [[Grimwar/Entities/info_player_spawn|info_player_spawn]]. Set Team explicitly; the default is Union. Provide usable spawns for each participating team.&lt;br /&gt;
|-&lt;br /&gt;
| King of the Hill or capture objectives || [[Grimwar/Entities/game_capture_point|game_capture_point]]. Set the starting owner and capture times.&lt;br /&gt;
|-&lt;br /&gt;
| Uplink || [[Grimwar/Entities/game_capture_flag|game_capture_flag]]. Configure the prerequisite graph and exactly one middle flag.&lt;br /&gt;
|-&lt;br /&gt;
| Blitz || [[Grimwar/Entities/game_blitz_tank|game_blitz_tank]] with path points and child [[Grimwar/Entities/game_blitz_checkpoint|checkpoints]].&lt;br /&gt;
|-&lt;br /&gt;
| Gravewar facilities || [[Grimwar/Entities/trigger_gravewar_skull_deposit|Skull deposit]] and [[Grimwar/Entities/trigger_gravewar_upgrade_zone|upgrade zone]].&lt;br /&gt;
|-&lt;br /&gt;
| Supplies || [[Grimwar/Entities/item_pickup|item_pickup]] or [[Grimwar/Entities/func_resupply|func_resupply]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The [[Grimwar/Entities|entity reference]] lists entity types. Its individual pages include placement, settings, defaults, and script signals.&lt;br /&gt;
&lt;br /&gt;
Volumes use their authored orientation and size. Keep a trigger large enough to overlap a player, and check its team/activator filters. A new &amp;lt;code&amp;gt;trigger_multiple&amp;lt;/code&amp;gt; has &#039;&#039;&#039;Allowed Teams: None&#039;&#039;&#039;, which blocks participants until you select the intended teams.&lt;br /&gt;
&lt;br /&gt;
== Optional map settings and music ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Map Settings&#039;&#039;&#039; (&amp;lt;code&amp;gt;info_map_settings&amp;lt;/code&amp;gt;) is optional. You can compile, export, and play a map without placing one or choosing music. Omitted settings use the game defaults; the default loading and gameplay score is &#039;&#039;&#039;Ordainment&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To override the score, place one Map Settings entity and choose &#039;&#039;&#039;Compound&#039;&#039;&#039;, &#039;&#039;&#039;Ritual&#039;&#039;&#039;, &#039;&#039;&#039;Arcade&#039;&#039;&#039;, or &#039;&#039;&#039;Ordainment&#039;&#039;&#039; in &#039;&#039;&#039;Music Set&#039;&#039;&#039;. Leaving Music Set at &#039;&#039;&#039;Unassigned&#039;&#039;&#039; also uses Ordainment. The map filename and title do not select music.&lt;br /&gt;
&lt;br /&gt;
Do not put objects beneath Map Settings: the compiler reads its overrides and removes the settings object from the compiled scene. Duplicate settings entities and invalid music values remain build errors. A package with no &amp;lt;code&amp;gt;musicSet&amp;lt;/code&amp;gt; value also uses the default score.&lt;br /&gt;
&lt;br /&gt;
== Add logic and media ==&lt;br /&gt;
&lt;br /&gt;
Vertex associates a &amp;lt;code&amp;gt;.vsig&amp;lt;/code&amp;gt; script with the map. Use the Code workspace to connect entity outputs to inputs, such as a trigger opening a door. [[Grimwar/VSig]] gives a complete example.&lt;br /&gt;
&lt;br /&gt;
For C# behavior tied to this map, use &#039;&#039;&#039;Map → SDK resources → VMod → Create…&#039;&#039;&#039; or attach an existing resource inside the source folder. The map build includes it; you do not need a second installed package. See [[Grimwar/VMod#Attach a VMod to a map|map-bound VMods]].&lt;br /&gt;
&lt;br /&gt;
For custom materials, models, and prefabs in your general asset selection, follow [[Grimwar/Unity custom content|the shared Unity asset library guide]]. Keep the library outside your map folders and connect each map to it. &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039; imports files owned by this map; references to another installed package become dependencies. See [[Grimwar/Custom content]].&lt;br /&gt;
&lt;br /&gt;
== Set lighting and a thumbnail ==&lt;br /&gt;
&lt;br /&gt;
Set the sky, sun, ambient light, and fog in Map Environment. Place &amp;lt;code&amp;gt;env_light&amp;lt;/code&amp;gt; entities for local lights. Use Mixed or Dynamic lighting for animated or scripted lights; Area lights are baked only.&lt;br /&gt;
&lt;br /&gt;
Choose a lightmap quality for your test. &#039;&#039;&#039;None&#039;&#039;&#039; skips lightmap/APV baking but does not skip Grimwar&#039;s required navigation, spatial, and occlusion work. Check the compiled lighting in the game.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;&#039;Map → Thumbnail&#039;&#039;&#039;, choose a PNG or JPEG. Vertex uses it for the add-on thumbnail and in-game map image. Use 1920 × 1080 for release artwork. Vertex copies an image from outside the source folder beside the map, so include that copy when sharing the source.&lt;br /&gt;
&lt;br /&gt;
== Compile and play ==&lt;br /&gt;
&lt;br /&gt;
# Save the map and any externally edited script or media files.&lt;br /&gt;
# Select &#039;&#039;&#039;Preview&#039;&#039;&#039; and your desktop target in Build.&lt;br /&gt;
# Select &#039;&#039;&#039;Play in Game&#039;&#039;&#039;. Vertex captures the inputs, compiles, installs the add-on, and launches Grimwar.&lt;br /&gt;
# In &#039;&#039;&#039;Addons&#039;&#039;&#039;, confirm the package is valid and enabled. Choose &#039;&#039;&#039;Use This Copy&#039;&#039;&#039; if a Workshop or older local copy is selected.&lt;br /&gt;
# Open &#039;&#039;&#039;Host&#039;&#039;&#039;, select the map and intended game mode, and use &#039;&#039;&#039;Local&#039;&#039;&#039; access for an unpublished build.&lt;br /&gt;
# Test collision, spawns, objectives, sounds, scripts, and more than one round. Reload the map to check initialization again.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export add-on&#039;&#039;&#039; performs the build without launching the game. &#039;&#039;&#039;Open current output&#039;&#039;&#039; shows the generated package. Close a running playtest before replacing its loaded bundles.&lt;br /&gt;
&lt;br /&gt;
The default install location is Grimwar&#039;s user add-on library; [[Grimwar/Addons#Install a local package|Using add-ons]] lists the platform paths. You can choose a separate output folder in Build&#039;s Advanced settings for isolated tests.&lt;br /&gt;
&lt;br /&gt;
== Build for publishing ==&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Release&#039;&#039;&#039; and export the map. Release includes Windows client, macOS client, and Linux dedicated-server output. Install every required Unity target module and resolve all build errors before publishing.&lt;br /&gt;
&lt;br /&gt;
Keep the generated folder intact. It contains &amp;lt;code&amp;gt;addon.json&amp;lt;/code&amp;gt;, platform files, and build receipts used to verify the package. Editing generated files breaks that verification; change the source and rebuild instead.&lt;br /&gt;
&lt;br /&gt;
Publish from Grimwar&#039;s Addons screen following [[Grimwar/Steam Workshop addons]]. Publish required media packs first. An unpublished local package has no download source for other players and is restricted to local testing.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/SDK_setup&amp;diff=273</id>
		<title>Grimwar/SDK setup</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/SDK_setup&amp;diff=273"/>
		<updated>2026-10-04T16:11:49Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Keep custom assets in one library shared across maps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
The Grimwar SDK includes Vertex for maps, VSDK for setup and standalone resources, and Grimwar&#039;s assets and compiler. This wiki is the maintained source for Vellocet SDK guidance.&lt;br /&gt;
&lt;br /&gt;
== Install the SDK ==&lt;br /&gt;
&lt;br /&gt;
# In Steam&#039;s Library, enable the &#039;&#039;&#039;Tools&#039;&#039;&#039; filter and install &#039;&#039;&#039;Grimwar SDK&#039;&#039;&#039;. Install Grimwar too if you want to playtest.&lt;br /&gt;
# Launch the SDK to open VSDK.&lt;br /&gt;
# For map builds, install and activate Unity &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt; through Unity Hub. Add build support for the targets you will use. VSDK detects standard installations; choose the Unity executable if detection misses yours.&lt;br /&gt;
# Choose your installed Grimwar executable or macOS app for playtesting.&lt;br /&gt;
# Select &#039;&#039;&#039;Finish setup and open Vertex&#039;&#039;&#039;. Setup prepares a writable compiler cache and registers the game.&lt;br /&gt;
# Create a map and save it outside the SDK installation.&lt;br /&gt;
&lt;br /&gt;
Map compilation runs Unity through the SDK. You author in Vertex and play in Grimwar. You do not need to create a Unity project or install a Unity package by hand for this workflow.&lt;br /&gt;
&lt;br /&gt;
A VMod containing only scripts, sounds, or ordinary data can be validated and built without Unity. Imported models, materials, textures, fonts, and video use the Unity compiler. Map lighting also needs a working graphics device.&lt;br /&gt;
&lt;br /&gt;
== Choose a workflow ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What you are making !! Start here&lt;br /&gt;
|-&lt;br /&gt;
| Map || Open Vertex, then [[Grimwar/Mapping|make a map]].&lt;br /&gt;
|-&lt;br /&gt;
| Map logic || Open the map&#039;s Code workspace and follow [[Grimwar/VSig|VSig]].&lt;br /&gt;
|-&lt;br /&gt;
| Standalone server mod || In VSDK, select &#039;&#039;&#039;VMod&#039;&#039;&#039; and &#039;&#039;&#039;Create…&#039;&#039;&#039;. See [[Grimwar/VMod]].&lt;br /&gt;
|-&lt;br /&gt;
| C# behavior attached to one map || Use &#039;&#039;&#039;Map → SDK resources → VMod → Create…&#039;&#039;&#039; in Vertex.&lt;br /&gt;
|-&lt;br /&gt;
| Reusable media || In VSDK, select &#039;&#039;&#039;Media pack&#039;&#039;&#039;, create it, and open &#039;&#039;&#039;Content…&#039;&#039;&#039;. See [[Grimwar/Custom content]].&lt;br /&gt;
|-&lt;br /&gt;
| Shared custom materials, models, and prefabs || Follow [[Grimwar/Unity custom content]] to keep one asset library outside your map folders. Author assets in its &amp;lt;code&amp;gt;Compiler/Assets/CustomContent/&amp;lt;/code&amp;gt; and connect your maps to the same Materials and Models selection.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Files and updates ==&lt;br /&gt;
&lt;br /&gt;
Keep your maps, scripts, thumbnails, &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt;, and imported files together in a source folder you control. Keep build output separate. Steam can replace SDK files during an update.&lt;br /&gt;
&lt;br /&gt;
Update the complete SDK through Steam and launch VSDK again. Do not mix an editor executable from one SDK release with the catalogs or compiler from another. Your source files and local preferences stay outside the installation.&lt;br /&gt;
&lt;br /&gt;
In Vertex, use &#039;&#039;&#039;Settings → Game and resources → Reload resources&#039;&#039;&#039; after changing or refreshing the game connection. Engine and game executable paths are under &#039;&#039;&#039;Build → Advanced&#039;&#039;&#039;. Standalone Vertex can open the same installation through &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Build profiles ==&lt;br /&gt;
&lt;br /&gt;
Vertex&#039;s &#039;&#039;&#039;Preview&#039;&#039;&#039; profile builds for local testing on the selected platform. VSDK calls its local standalone-resource output a Development package. These packages are for testing and cannot be published to Workshop.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release&#039;&#039;&#039; map exports include Windows client, macOS client, and Linux dedicated-server artifacts. Install the matching Unity build modules. The SDK enforces the required navigation, spatial, occlusion, and lighting policy.&lt;br /&gt;
&lt;br /&gt;
Choose a 1920 × 1080 thumbnail before publishing. Vertex maps accept PNG or JPEG through &#039;&#039;&#039;Map → Thumbnail&#039;&#039;&#039;; standalone VMods use a PNG path in &amp;lt;code&amp;gt;mod.json.thumbnail&amp;lt;/code&amp;gt;. A map can compile without artwork, but Workshop publication requires it. See [[Grimwar/Steam Workshop addons]].&lt;br /&gt;
&lt;br /&gt;
== If you are integrating your own game ==&lt;br /&gt;
&lt;br /&gt;
Read [[Vertex/Integrating your game]]. Your game supplies its own catalogs, entity behavior, compiler, and runtime loader. A local developer connection can offer &#039;&#039;&#039;Save to Unity&#039;&#039;&#039; for that game project. Grimwar&#039;s public SDK supplies a compiler, so its community workflow is &#039;&#039;&#039;Export add-on&#039;&#039;&#039; and &#039;&#039;&#039;Play in Game&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Content&amp;diff=272</id>
		<title>Vertex/Content</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Content&amp;diff=272"/>
		<updated>2026-10-04T16:11:48Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Keep custom assets in one library shared across maps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Content&#039;&#039;&#039; manages files owned by a map or SDK resource and references to assets from other packages. The connected game decides which file types it supports and how those files become usable in the game.&lt;br /&gt;
&lt;br /&gt;
== Import your files ==&lt;br /&gt;
&lt;br /&gt;
# Save the map, then open &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039;. For a standalone resource, open its &#039;&#039;&#039;Content…&#039;&#039;&#039; controls in VSDK.&lt;br /&gt;
# Choose a content type and select &#039;&#039;&#039;Import files&#039;&#039;&#039;.&lt;br /&gt;
# Review the imported names and settings. The SDK may offer controls such as audio playback type or volume.&lt;br /&gt;
# Select the new asset in the appropriate material, model, entity, or script field.&lt;br /&gt;
&lt;br /&gt;
Vertex keeps imported source under &amp;lt;code&amp;gt;Content/&amp;lt;/code&amp;gt; and records it in &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt;. Keep both beside the map or resource manifest. Importing a file makes it available; you still need to place it or reference it.&lt;br /&gt;
&lt;br /&gt;
An asset key identifies the package and asset, for example &amp;lt;code&amp;gt;asset:shared_sounds/wind_loop&amp;lt;/code&amp;gt;. Display names can change without changing that key. Use &#039;&#039;&#039;Replace media&#039;&#039;&#039; to replace a file while retaining its references. Reimporting it as a new asset creates a different entry.&lt;br /&gt;
&lt;br /&gt;
Models may have companion materials and textures. Keep those files together when importing. &#039;&#039;&#039;Rebuild model previews&#039;&#039;&#039; refreshes the editor preview after external changes; the game compiler still builds the runtime model.&lt;br /&gt;
&lt;br /&gt;
== Materials and prefabs authored in Unity ==&lt;br /&gt;
&lt;br /&gt;
For a general selection of custom assets across Grimwar maps, follow [[Grimwar/Unity custom content|Unity materials and models for Vertex]]. Keep one personal SDK copy in a shared library folder outside your map projects, create assets beneath its &amp;lt;code&amp;gt;Compiler/Assets/CustomContent/&amp;lt;/code&amp;gt;, and export its catalog. Connect each map to that same library to select its assets in the Materials and Models browsers. The guide covers each folder and setting with a wall material and a crate prefab. Dropping files into a Unity folder alone does not add them to Vertex, and Content&#039;s file importer does not accept &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== Use an installed package ==&lt;br /&gt;
&lt;br /&gt;
Select an installed asset in Content and choose &#039;&#039;&#039;Use this package&#039;&#039;&#039;. Vertex records the provider&#039;s add-on ID and references the asset by key. The resulting build depends on that package and does not include another copy of its files.&lt;br /&gt;
&lt;br /&gt;
The provider must be installed and enabled in the game. Publish and distribute the provider as well as the map or mod that uses it. A different display title or Workshop item number does not replace the stable package ID.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Copy files into this package&#039;&#039;&#039; creates an owned copy when you want to distribute and maintain the files yourself. References to other packages that you keep using remain dependencies. Check that the asset&#039;s terms permit redistribution.&lt;br /&gt;
&lt;br /&gt;
== Check what ships ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check build contents&#039;&#039;&#039; lists selected files, sizes, and the references or inclusion settings that bring them into the build. Use it before publishing a large package.&lt;br /&gt;
&lt;br /&gt;
Enable &#039;&#039;&#039;Include in build&#039;&#039;&#039; for files used only through dynamically constructed script references. An unchecked asset is still included when the map or another included asset needs it.&lt;br /&gt;
&lt;br /&gt;
Missing providers, cycles, unsupported formats, or changed source files can stop a build. Fix the reported source or dependency and rebuild. Avoid editing the generated package manifest to bypass an error.&lt;br /&gt;
&lt;br /&gt;
For supported formats, a complete sound example, and reusable media packs, see [[Grimwar/Custom content]]. For another game&#039;s support, use that game&#039;s SDK documentation.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Custom_content&amp;diff=271</id>
		<title>Grimwar/Custom content</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Custom_content&amp;diff=271"/>
		<updated>2026-10-04T16:11:47Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Keep custom assets in one library shared across maps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Use Content in Vertex or VSDK to import your own media. A map or VMod can own its files, or reference assets from another installed add-on. The SDK builds the required files and records those dependencies.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For custom assets shared across maps,&#039;&#039;&#039; follow [[Grimwar/Unity custom content|Unity materials and models for Vertex]]. Keep one shared library outside your map folders, create your textures, &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; files, models, and &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files there, and connect each map to its catalog. They appear in your general Materials and Models selection. The file-import workflow on this page owns files within the map or resource; it does not import Unity &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== Add a sound to a map ==&lt;br /&gt;
&lt;br /&gt;
# Save the map, for example &amp;lt;code&amp;gt;my_arena.vertex&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039;, choose &#039;&#039;&#039;Sound&#039;&#039;&#039;, then &#039;&#039;&#039;Import files&#039;&#039;&#039;. Select &amp;lt;code&amp;gt;wind_loop.wav&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Set &#039;&#039;&#039;Playback&#039;&#039;&#039; to &#039;&#039;&#039;AmbientLoop&#039;&#039;&#039; for a looping sound with a world position. Adjust &#039;&#039;&#039;Volume&#039;&#039;&#039; between 0 and 1.&lt;br /&gt;
# Place an [[Grimwar/Entities/env_ambient|env_ambient]] entity and select the imported sound in &#039;&#039;&#039;Custom Cue&#039;&#039;&#039;. Leave &#039;&#039;&#039;Play On Start&#039;&#039;&#039; enabled to hear it when the map loads.&lt;br /&gt;
# Build with &#039;&#039;&#039;Play in Game&#039;&#039;&#039; and check the volume and placement in Grimwar.&lt;br /&gt;
&lt;br /&gt;
The imported sound has a key such as &amp;lt;code&amp;gt;asset:my_arena/wind_loop&amp;lt;/code&amp;gt;. Custom Cue takes priority over the entity&#039;s base-game Event Name. You do not need to build Wwise banks or write an audio manifest.&lt;br /&gt;
&lt;br /&gt;
The source stays under &amp;lt;code&amp;gt;Content/&amp;lt;/code&amp;gt;, with its settings in &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt;. Keep both with the map. Use &#039;&#039;&#039;Replace media&#039;&#039;&#039; to update the sound without changing its key.&lt;br /&gt;
&lt;br /&gt;
=== Pick the playback type ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Use&lt;br /&gt;
|-&lt;br /&gt;
| Announcer || Non-spatial announcements.&lt;br /&gt;
|-&lt;br /&gt;
| Sfx2D || A non-spatial one-shot sound.&lt;br /&gt;
|-&lt;br /&gt;
| Sfx3D || A one-shot sound at a world position.&lt;br /&gt;
|-&lt;br /&gt;
| AmbientLoop || A looping sound at a world position.&lt;br /&gt;
|-&lt;br /&gt;
| MusicLoop || Looping music.&lt;br /&gt;
|-&lt;br /&gt;
| Ambience2DLoop || Looping non-spatial ambience.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For a sound that starts from a door or objective, disable Play On Start and call the ambient entity from a client VSig handler. See [[Grimwar/VSig#Server and client logic|Server and client logic]].&lt;br /&gt;
&lt;br /&gt;
An ambient entity&#039;s &#039;&#039;&#039;Audible Distance&#039;&#039;&#039; is its emitter radius, not a guaranteed cutoff distance. Point mode stays at the marker. Volumetric mode follows the nearest boundary of its oriented box when the listener is outside and plays in 2D inside.&lt;br /&gt;
&lt;br /&gt;
== Make a reusable media pack ==&lt;br /&gt;
&lt;br /&gt;
# Open VSDK and select &#039;&#039;&#039;Media pack&#039;&#039;&#039;, then &#039;&#039;&#039;Create…&#039;&#039;&#039;. Choose a new source folder outside the SDK installation, such as &amp;lt;code&amp;gt;shared_sounds&amp;lt;/code&amp;gt;. The folder name becomes the pack&#039;s stable ID.&lt;br /&gt;
# Open &#039;&#039;&#039;Content…&#039;&#039;&#039; and set its title, author, and version.&lt;br /&gt;
# Import your files and choose their settings. Mark assets intended for other packages with &#039;&#039;&#039;Include in build&#039;&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;&#039;Check build contents&#039;&#039;&#039; and review the file list and size.&lt;br /&gt;
# Build into Grimwar&#039;s add-on folder and enable the package in the game.&lt;br /&gt;
&lt;br /&gt;
In another map or VMod&#039;s Content window, select an installed asset from this pack and choose &#039;&#039;&#039;Use this package&#039;&#039;&#039;. A reference such as &amp;lt;code&amp;gt;asset:shared_sounds/wind_loop&amp;lt;/code&amp;gt; points to the provider. The consuming build records &amp;lt;code&amp;gt;shared_sounds&amp;lt;/code&amp;gt; as a requirement and leaves the sound bytes in the provider&#039;s package.&lt;br /&gt;
&lt;br /&gt;
Install and enable both packages to test them. Publish the media pack first, then the map or mod that depends on it. Keep the provider ID and asset keys stable in updates. Removing or renaming a published key can break consumers even if the pack&#039;s display title stays the same.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Copy files into this package&#039;&#039;&#039; when you want an independent copy you can edit and distribute. Check the creator&#039;s redistribution terms first. Other external references still keep their own dependencies.&lt;br /&gt;
&lt;br /&gt;
== Use media in a VMod ==&lt;br /&gt;
&lt;br /&gt;
Open the VMod&#039;s &#039;&#039;&#039;Content…&#039;&#039;&#039; controls in VSDK. For an attached VMod, select it under the map&#039;s SDK resources and use that resource&#039;s Content button. Importing there gives the script local names for its own assets.&lt;br /&gt;
&lt;br /&gt;
For a sound imported as &amp;lt;code&amp;gt;round_start&amp;lt;/code&amp;gt; with the Announcer or Sfx2D playback type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var result = context.Audio.PlayToAll(&amp;quot;round_start&amp;quot;);&lt;br /&gt;
if (!result.Success)&lt;br /&gt;
    context.Log.Warn(result.Message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use a full asset key for a sound from a shared pack:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var result = context.Audio.PlayFromPlayer(&lt;br /&gt;
    playerId, &amp;quot;asset:shared_sounds/wind_loop&amp;quot;, 0.5f);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here &amp;lt;code&amp;gt;context&amp;lt;/code&amp;gt; is the &amp;lt;code&amp;gt;IModContext&amp;lt;/code&amp;gt; saved in &amp;lt;code&amp;gt;OnLoad&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; identifies a connected player. This second example needs an AmbientLoop or Sfx3D cue. &amp;lt;code&amp;gt;PlayFromPlayer&amp;lt;/code&amp;gt; uses the player&#039;s authoritative pawn position. Save &amp;lt;code&amp;gt;result.Value&amp;lt;/code&amp;gt; from a successful play if you need to stop it later with &amp;lt;code&amp;gt;context.Audio.Stop&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PlayToAll&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PlayToPlayer&amp;lt;/code&amp;gt; accept non-spatial cue types. &amp;lt;code&amp;gt;PlayAt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PlayFromPlayer&amp;lt;/code&amp;gt; accept Sfx3D and AmbientLoop. Playback gain multiplies the cue&#039;s own volume.&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Use this package&#039;&#039;&#039; to record a selected provider. When declaring a dependency directly in a VMod manifest, put its add-on ID in &amp;lt;code&amp;gt;requires&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;dependencies&amp;lt;/code&amp;gt; instead lists VMod IDs for script load order.&lt;br /&gt;
&lt;br /&gt;
API 15 also exposes declared text/data through &amp;lt;code&amp;gt;Content&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
string rules;&lt;br /&gt;
if (context.Content.TryReadText(&amp;quot;rules&amp;quot;, out rules))&lt;br /&gt;
    context.Log.Write(rules);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the file through the resource&#039;s Content window and keep it included in the build. &amp;lt;code&amp;gt;Content.Describe(key)&amp;lt;/code&amp;gt; reads asset metadata. These APIs operate on declared assets; they do not give a VMod access to arbitrary files.&lt;br /&gt;
&lt;br /&gt;
== Supported imports ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Source formats !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Sound || WAV, Ogg Vorbis, MP3 || Up to 32 MiB per source. Set the playback type and volume.&lt;br /&gt;
|-&lt;br /&gt;
| Surface material || PNG, JPG/JPEG, TGA || Creates a surface material from an image. Up to 16 MiB per source.&lt;br /&gt;
|-&lt;br /&gt;
| Image / texture || PNG, JPG/JPEG, TGA || Up to 16 MiB per source. Select the type the consuming field expects.&lt;br /&gt;
|-&lt;br /&gt;
| Model || FBX, OBJ || Import supported MTL and image companions alongside it. Review scale and collision.&lt;br /&gt;
|-&lt;br /&gt;
| Font || TTF, OTF || Requires a supported game consumer.&lt;br /&gt;
|-&lt;br /&gt;
| Video || MP4, WebM, MOV || Requires a supported game consumer; importing a clip does not place a video screen.&lt;br /&gt;
|-&lt;br /&gt;
| Text / data || TXT, JSON, CSV, Markdown || Up to 8 MiB per source; usable through the VMod Content API.&lt;br /&gt;
|-&lt;br /&gt;
| Binary data || BIN || Packaged data for supported consumers, not executable code.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Native Unity media, including models, materials, textures, fonts, and video, needs the SDK&#039;s pinned Unity compiler and target modules. Sounds and ordinary data use platform-independent files. Import support does not imply that every entity or VMod service can consume every type.&lt;br /&gt;
&lt;br /&gt;
== Keep builds small and repeatable ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Check build contents&#039;&#039;&#039; to see what is included and why. Unreferenced files can stay in your source folder without shipping. &#039;&#039;&#039;Include in build&#039;&#039;&#039; keeps an asset available when code chooses its key at runtime; a referenced asset is included even if that checkbox is off.&lt;br /&gt;
&lt;br /&gt;
Keep model companion files together. Use &#039;&#039;&#039;Rebuild model previews&#039;&#039;&#039; after editing a model externally. Rebuild the package after any source change; the compiler reuses matching verified output where it can.&lt;br /&gt;
&lt;br /&gt;
Avoid copying the same large library into every map. Put shared assets in a media pack when you want a common update and dependency. Use an owned copy when a map needs to keep its own version.&lt;br /&gt;
&lt;br /&gt;
== Artwork and distribution ==&lt;br /&gt;
&lt;br /&gt;
Set a media pack&#039;s title, author, version, and PNG thumbnail in Content. Use a 1920 × 1080 thumbnail for Release. Enable &#039;&#039;&#039;Release package&#039;&#039;&#039; in VSDK, build, and publish the result as &#039;&#039;&#039;Content&#039;&#039;&#039; from Grimwar&#039;s Addons screen.&lt;br /&gt;
&lt;br /&gt;
Keep the entire output folder, including its generated &amp;lt;code&amp;gt;addon.json&amp;lt;/code&amp;gt; and catalogs. The editable &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt; is source; it is not an installable package by itself. See [[Grimwar/Steam Workshop addons]] for dependencies and updates.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Unity_custom_content&amp;diff=270</id>
		<title>Grimwar/Unity custom content</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Unity_custom_content&amp;diff=270"/>
		<updated>2026-10-04T16:11:45Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Keep custom assets in one library shared across maps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Build one personal asset library for Vertex&#039;s &#039;&#039;&#039;Materials&#039;&#039;&#039; and &#039;&#039;&#039;Models&#039;&#039;&#039; browsers. Every map connected to that library can select the same custom materials, models, and prefabs. This walkthrough adds a wall material and a crate prefab to that shared selection.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Keep the library in &amp;lt;code&amp;gt;Documents/GrimwarLibrary/&amp;lt;/code&amp;gt;, and create your assets under its &amp;lt;code&amp;gt;Compiler/Assets/CustomContent/&amp;lt;/code&amp;gt; folder.&#039;&#039;&#039; Keep map projects separately, for example under &amp;lt;code&amp;gt;Documents/GrimwarMaps/&amp;lt;/code&amp;gt;. Set up the library once, export its catalog, and connect your maps to the same SDK copy. A folder alone does not register its contents with Vertex.&lt;br /&gt;
&lt;br /&gt;
Use this library for textures, Unity &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; files, models, and &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files that you want in your general selection. Vertex&#039;s &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039; imports files into the map&#039;s own source folder; those imports are covered separately by [[Grimwar/Custom content]]. Content&#039;s file importer does not accept &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== 1. Set up your shared asset library ==&lt;br /&gt;
&lt;br /&gt;
# Complete [[Grimwar/SDK setup|SDK setup]]. Install Unity &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt; and the build modules you need.&lt;br /&gt;
# In Steam, open Grimwar SDK&#039;s &#039;&#039;&#039;Manage → Browse local files&#039;&#039;&#039;. Locate &amp;lt;code&amp;gt;Grimwar.vertexsdk&amp;lt;/code&amp;gt; and its sibling &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; folders.&lt;br /&gt;
# Copy that SDK folder, with all its contents, to &amp;lt;code&amp;gt;Documents/GrimwarLibrary/&amp;lt;/code&amp;gt; outside Steam. This is your shared working copy for all your maps; create it once.&lt;br /&gt;
# Keep your Vertex maps in separate folders, for example &amp;lt;code&amp;gt;Documents/GrimwarMaps/MyArena/my_arena.vertex&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Documents/GrimwarMaps/MyOutpost/my_outpost.vertex&amp;lt;/code&amp;gt;. Both will use the same library.&lt;br /&gt;
# In Unity Hub, add the existing project at &amp;lt;code&amp;gt;Documents/GrimwarLibrary/Compiler&amp;lt;/code&amp;gt; and open it with the pinned Unity version. Select &#039;&#039;&#039;Compiler&#039;&#039;&#039;, not its parent folder or its &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder. Let package resolution, script compilation, and asset imports finish.&lt;br /&gt;
# For Unity&#039;s scene and material previews, open &#039;&#039;&#039;Edit → Project Settings → Graphics&#039;&#039;&#039;. If &#039;&#039;&#039;Default Render Pipeline&#039;&#039;&#039; is empty, assign the supplied &amp;lt;code&amp;gt;Assets/VertexSdk/Rendering/Pipeline.asset&amp;lt;/code&amp;gt;. Keep the SDK&#039;s quality settings. See [https://docs.unity3d.com/6000.3/Documentation/Manual/srp-setting-render-pipeline-asset.html Unity&#039;s render pipeline settings].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; Unity&#039;s Project window shows &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;, including &amp;lt;code&amp;gt;CustomContent&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;VertexSdk&amp;lt;/code&amp;gt;. Resolve any Console errors before continuing. This is the SDK&#039;s asset-authoring and compiler project; playtest the map in Grimwar.&lt;br /&gt;
&lt;br /&gt;
The Steam installation and Vertex&#039;s generated compiler cache are replaceable. Neither is a place to keep your original work. Keep the SDK&#039;s supplied packages and base assets intact in your working copy.&lt;br /&gt;
&lt;br /&gt;
== 2. Create the content folders ==&lt;br /&gt;
&lt;br /&gt;
In Unity&#039;s &#039;&#039;&#039;Project&#039;&#039;&#039; window, expand &amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt;. Right-click it and use &#039;&#039;&#039;Create → Folder&#039;&#039;&#039; to create &amp;lt;code&amp;gt;Textures&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Materials&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Models&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;Prefabs&amp;lt;/code&amp;gt; directly inside it. These folders belong to your general asset library. You can add subfolders for themes or asset packs as the library grows.&lt;br /&gt;
&lt;br /&gt;
After completing the guide, your files will look like this. Unity also creates &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files beside assets and folders; keep those files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Documents/&lt;br /&gt;
  GrimwarMaps/&lt;br /&gt;
    MyArena/&lt;br /&gt;
      my_arena.vertex&lt;br /&gt;
    MyOutpost/&lt;br /&gt;
      my_outpost.vertex&lt;br /&gt;
  GrimwarLibrary/                   shared by both maps&lt;br /&gt;
    Grimwar.vertexsdk&lt;br /&gt;
    Authoring/&lt;br /&gt;
      Grimwar.vertexgame&lt;br /&gt;
      CustomAssets.vertexassets    exported catalog&lt;br /&gt;
      previews/                    generated catalog previews&lt;br /&gt;
    Compiler/                      open this folder in Unity Hub&lt;br /&gt;
      Assets/&lt;br /&gt;
        CustomContent/&lt;br /&gt;
          CustomAssets.asset       catalog profile created in step 5&lt;br /&gt;
          Textures/&lt;br /&gt;
            BrickWall_BaseColor.png&lt;br /&gt;
            Crate_BaseColor.png&lt;br /&gt;
          Materials/&lt;br /&gt;
            BrickWall.mat&lt;br /&gt;
            Crate.mat&lt;br /&gt;
          Models/&lt;br /&gt;
            Crate.fbx&lt;br /&gt;
          Prefabs/&lt;br /&gt;
            Crate.prefab&lt;br /&gt;
        VertexSdk/                 supplied SDK assets&lt;br /&gt;
      Packages/&lt;br /&gt;
      ProjectSettings/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt; is the path &#039;&#039;&#039;inside Unity&#039;&#039;&#039;. &amp;lt;code&amp;gt;Documents/GrimwarLibrary/Compiler/Assets/CustomContent&amp;lt;/code&amp;gt; is the same folder on disk. &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; is outside the Unity project&#039;s &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder. Neither map folder contains the library&#039;s source assets.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;texture&#039;&#039;&#039; is an image. A &#039;&#039;&#039;material&#039;&#039;&#039; combines a shader, textures, and surface settings. A &#039;&#039;&#039;model&#039;&#039;&#039; supplies meshes. A &#039;&#039;&#039;prefab&#039;&#039;&#039; saves a model&#039;s hierarchy, assigned materials, and components such as colliders. Vertex uses the material on a brush face and the model or prefab as a placed object.&lt;br /&gt;
&lt;br /&gt;
== 3. Create a wall material ==&lt;br /&gt;
&lt;br /&gt;
# Drag &amp;lt;code&amp;gt;BrickWall_BaseColor.png&amp;lt;/code&amp;gt; from your file manager into &amp;lt;code&amp;gt;Assets/CustomContent/Textures&amp;lt;/code&amp;gt; in Unity&#039;s Project window. Wait for import to finish.&lt;br /&gt;
# Right-click the &amp;lt;code&amp;gt;Materials&amp;lt;/code&amp;gt; folder and choose &#039;&#039;&#039;Create → Material&#039;&#039;&#039;. Name it &amp;lt;code&amp;gt;BrickWall&amp;lt;/code&amp;gt;; Unity saves &amp;lt;code&amp;gt;BrickWall.mat&amp;lt;/code&amp;gt; there.&lt;br /&gt;
# Select the material. In the Inspector, set &#039;&#039;&#039;Shader&#039;&#039;&#039; to &#039;&#039;&#039;Universal Render Pipeline/Lit&#039;&#039;&#039;. Use &#039;&#039;&#039;Surface Type: Opaque&#039;&#039;&#039; for an ordinary solid wall.&lt;br /&gt;
# Drag the imported image into &#039;&#039;&#039;Base Map&#039;&#039;&#039; under Surface Inputs. Leave the adjacent color white to use the image&#039;s original colors.&lt;br /&gt;
# For a plain non-metallic wall, start with &#039;&#039;&#039;Metallic: 0&#039;&#039;&#039; and &#039;&#039;&#039;Smoothness: 0&#039;&#039;&#039;. Increase Smoothness only if you want a shinier surface. For a matte surface without specular shine, also disable &#039;&#039;&#039;Specular Highlights&#039;&#039;&#039; and &#039;&#039;&#039;Environment Reflections&#039;&#039;&#039; under Advanced Options.&lt;br /&gt;
# If you have a normal map, import it into &amp;lt;code&amp;gt;Textures&amp;lt;/code&amp;gt;, select that texture, set &#039;&#039;&#039;Texture Type: Normal map&#039;&#039;&#039;, and click &#039;&#039;&#039;Apply&#039;&#039;&#039;. Assign it to the material&#039;s &#039;&#039;&#039;Normal Map&#039;&#039;&#039; field. A normal map is optional.&lt;br /&gt;
# Save your project changes. The asset you will choose in Vertex is &#039;&#039;&#039;BrickWall&#039;&#039;&#039;, the material, rather than the raw PNG.&lt;br /&gt;
&lt;br /&gt;
Use an SDK-supported shader such as URP/Lit. A custom material can use that shader with your own textures and settings; add-on maps cannot bring arbitrary custom shaders or Shader Graph shaders from &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; &amp;lt;code&amp;gt;Materials/BrickWall.mat&amp;lt;/code&amp;gt; exists and its Base Map references your texture. Vertex&#039;s preview shows basic color and transparency; judge normal maps, reflections, and final lighting in the compiled game. For the remaining material controls, see [https://docs.unity3d.com/6000.3/Documentation/Manual/urp/lit-shader.html Unity&#039;s URP Lit reference].&lt;br /&gt;
&lt;br /&gt;
== 4. Import a model and save a prefab ==&lt;br /&gt;
&lt;br /&gt;
# Export a model such as &amp;lt;code&amp;gt;Crate.fbx&amp;lt;/code&amp;gt; from your modeling tool. Use metres, a deliberate pivot, and UVs for the material. Put its image files in your &amp;lt;code&amp;gt;Textures&amp;lt;/code&amp;gt; folder and the model in &amp;lt;code&amp;gt;Models&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Select &amp;lt;code&amp;gt;Crate.fbx&amp;lt;/code&amp;gt; in Unity&#039;s Project window. Check its import scale and orientation. Apply changed import settings. As a size check, compare it with a Unity cube, which is one unit across at scale 1; one Unity unit represents one metre here.&lt;br /&gt;
# Create &amp;lt;code&amp;gt;Materials/Crate.mat&amp;lt;/code&amp;gt; using the material steps above and its own Base Map. If the model already contains embedded materials, its &#039;&#039;&#039;Materials&#039;&#039;&#039; import tab can &#039;&#039;&#039;Extract Materials…&#039;&#039;&#039; into your &amp;lt;code&amp;gt;Materials&amp;lt;/code&amp;gt; folder. Check extracted materials&#039; shaders and texture assignments. See [https://docs.unity3d.com/6000.3/Documentation/Manual/FBXImporter-Materials.html Unity&#039;s model material settings].&lt;br /&gt;
# Drag &amp;lt;code&amp;gt;Crate.fbx&amp;lt;/code&amp;gt; from the Project window into a temporary scene. On each relevant Mesh Renderer, assign &amp;lt;code&amp;gt;Crate.mat&amp;lt;/code&amp;gt; to its &#039;&#039;&#039;Materials&#039;&#039;&#039; slots. For a model with several submeshes, assign the material for each slot.&lt;br /&gt;
# For a solid crate, add a &#039;&#039;&#039;Box Collider&#039;&#039;&#039; and adjust its Center and Size to fit. A renderer alone does not make an object solid. Keep the example a static prop; arbitrary custom C# components are not a substitute for supported Grimwar entities or map scripts.&lt;br /&gt;
# Name the scene object &amp;lt;code&amp;gt;Crate&amp;lt;/code&amp;gt;. Drag it from the &#039;&#039;&#039;Hierarchy&#039;&#039;&#039; into &amp;lt;code&amp;gt;Assets/CustomContent/Prefabs&amp;lt;/code&amp;gt; in the &#039;&#039;&#039;Project&#039;&#039;&#039; window. If Unity asks whether to create an Original Prefab or Prefab Variant, choose &#039;&#039;&#039;Original Prefab&#039;&#039;&#039; for this example. This creates &amp;lt;code&amp;gt;Crate.prefab&amp;lt;/code&amp;gt;. See [https://docs.unity3d.com/6000.3/Documentation/Manual/CreatingPrefabs.html Unity&#039;s prefab creation guide].&lt;br /&gt;
# Select the saved prefab in the Project window and confirm it contains the renderer&#039;s material assignments and the collider. Later changes must be saved to this prefab, not left only on a scene instance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; &amp;lt;code&amp;gt;Prefabs/Crate.prefab&amp;lt;/code&amp;gt; is the assembled prop you will place in Vertex. The raw &amp;lt;code&amp;gt;Models/Crate.fbx&amp;lt;/code&amp;gt; can also appear in the browser, but choosing it does not include overrides or colliders that you added only to the prefab.&lt;br /&gt;
&lt;br /&gt;
Keep the model, prefab, materials, and textures beneath &amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt;. To reuse a model&#039;s material on brush faces, use a separate &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; file: embedded model materials are hidden from Vertex&#039;s material picker.&lt;br /&gt;
&lt;br /&gt;
== 5. Export a catalog for Vertex ==&lt;br /&gt;
&lt;br /&gt;
A catalog tells Vertex which assets exist and provides their previews. The original Unity assets remain in &amp;lt;code&amp;gt;Compiler/Assets&amp;lt;/code&amp;gt; for the map compiler to use.&lt;br /&gt;
&lt;br /&gt;
# In the Project window, right-click &amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt; and choose &#039;&#039;&#039;Create → Vertex → Asset catalog profile&#039;&#039;&#039;. Name the asset &amp;lt;code&amp;gt;CustomAssets&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Select it and set &#039;&#039;&#039;Catalog Id&#039;&#039;&#039; to &amp;lt;code&amp;gt;my_library.assets&amp;lt;/code&amp;gt; and &#039;&#039;&#039;Catalog Version&#039;&#039;&#039; to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Keep these values stable as you edit this asset library.&lt;br /&gt;
# Expand &#039;&#039;&#039;Folders&#039;&#039;&#039; in the Inspector and add one element. Set that element&#039;s &#039;&#039;&#039;Folder&#039;&#039;&#039; to &amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt; and &#039;&#039;&#039;Ownership&#039;&#039;&#039; to &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Enable &#039;&#039;&#039;Materials&#039;&#039;&#039;, &#039;&#039;&#039;Models&#039;&#039;&#039;, &#039;&#039;&#039;Prefabs&#039;&#039;&#039;, and &#039;&#039;&#039;Textures&#039;&#039;&#039; for that element. Leave &#039;&#039;&#039;Material Dependencies Only&#039;&#039;&#039; disabled so your standalone materials appear in the picker. Leave the other settings at their defaults.&lt;br /&gt;
# Save the project. With &amp;lt;code&amp;gt;CustomAssets&amp;lt;/code&amp;gt; still selected, choose &#039;&#039;&#039;Tools → Vertex → Export Selected Asset Catalog&#039;&#039;&#039;.&lt;br /&gt;
# In the save dialog, navigate out of &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; to your copy&#039;s &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; folder. Save as &amp;lt;code&amp;gt;CustomAssets.vertexassets&amp;lt;/code&amp;gt;. The exporter also writes a &amp;lt;code&amp;gt;previews&amp;lt;/code&amp;gt; folder beside it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; Both &amp;lt;code&amp;gt;GrimwarLibrary/Authoring/CustomAssets.vertexassets&amp;lt;/code&amp;gt; and its preview files exist. Keep the catalog and previews together. Do not replace the supplied &amp;lt;code&amp;gt;Assets/VertexSdk/Assets.asset&amp;lt;/code&amp;gt; profile or the base-game catalog.&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; ownership for your own files. &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; means the asset already ships with Grimwar; it does not mean “shared between my maps.” Incorrectly marking a new asset as base prevents the map from carrying the asset players need. You do not need to add your files to the base game&#039;s Addressables groups.&lt;br /&gt;
&lt;br /&gt;
== 6. Connect your maps to the shared library ==&lt;br /&gt;
&lt;br /&gt;
Edit the library&#039;s connection once, then choose it for each map. Two small JSON edits connect its editable Unity project and exported catalog. Use a plain-text editor, preserve the other fields, and keep the original files as backups outside the Unity &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
=== Tell Vertex to build from your Unity project ===&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;Documents/GrimwarLibrary/Grimwar.vertexsdk&amp;lt;/code&amp;gt; in a text editor.&lt;br /&gt;
&lt;br /&gt;
# Keep &amp;lt;code&amp;gt;&amp;quot;compilerProject&amp;quot;: &amp;quot;Compiler&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Remove the &amp;lt;code&amp;gt;compilerInputs&amp;lt;/code&amp;gt; property and its value. That inventory describes the unmodified distributed SDK.&lt;br /&gt;
# Add &amp;lt;code&amp;gt;&amp;quot;editorProject&amp;quot;: &amp;quot;Compiler&amp;quot;&amp;lt;/code&amp;gt; alongside &amp;lt;code&amp;gt;compilerProject&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Preserve &amp;lt;code&amp;gt;formatVersion&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;game&amp;lt;/code&amp;gt;, and any &amp;lt;code&amp;gt;resourceTools&amp;lt;/code&amp;gt; entries exactly as supplied. Separate neighboring properties with commas and leave no trailing comma before &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The two project properties should now read as follows. This fragment shows only those properties; &#039;&#039;&#039;do not replace the whole file&#039;&#039;&#039; with it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;compilerProject&amp;quot;: &amp;quot;Compiler&amp;quot;,&lt;br /&gt;
  &amp;quot;editorProject&amp;quot;: &amp;quot;Compiler&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This makes the copy a local developer connection: Vertex captures the saved assets from your &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; project when building. Leaving the distributed connection unchanged would use its prepared compiler cache instead.&lt;br /&gt;
&lt;br /&gt;
=== Add your catalog to the game&#039;s asset list ===&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;Documents/GrimwarLibrary/Authoring/Grimwar.vertexgame&amp;lt;/code&amp;gt;. Find the &amp;lt;code&amp;gt;assetCatalogs&amp;lt;/code&amp;gt; array. Keep every existing entry, including &amp;lt;code&amp;gt;grimwar.base&amp;lt;/code&amp;gt;. Add a comma after its last existing entry, then insert this additional object before the array&#039;s closing &amp;lt;code&amp;gt;]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;my_library.assets&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
  &amp;quot;path&amp;quot;: &amp;quot;CustomAssets.vertexassets&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The path is relative to &amp;lt;code&amp;gt;Authoring/Grimwar.vertexgame&amp;lt;/code&amp;gt;, so do not prepend &amp;lt;code&amp;gt;Authoring/&amp;lt;/code&amp;gt; again. Keep the game&#039;s ID, version, entity catalogs, and build configuration unchanged. The new entry&#039;s ID and version must match the Unity catalog profile from step 5.&lt;br /&gt;
&lt;br /&gt;
=== Choose this connection in Vertex ===&lt;br /&gt;
&lt;br /&gt;
# Save both JSON files and your Unity asset changes. Let Unity finish importing.&lt;br /&gt;
# Open your map in Vertex. Under &#039;&#039;&#039;Settings → Game and resources&#039;&#039;&#039;, select &#039;&#039;&#039;Choose game SDK…&#039;&#039;&#039;. Choose &amp;lt;code&amp;gt;Documents/GrimwarLibrary/Grimwar.vertexsdk&amp;lt;/code&amp;gt;, the file in your shared library. &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039; opens the same chooser.&lt;br /&gt;
# Save the map. Open your other maps and choose that same connection. Saved maps remember their own SDK connection; each map can reference this one library without another SDK copy or asset import.&lt;br /&gt;
# Use &#039;&#039;&#039;Settings → Game and resources → Reload resources&#039;&#039;&#039; after subsequent catalog exports.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; Open either example map. Its &#039;&#039;&#039;Materials&#039;&#039;&#039; browser contains &amp;lt;code&amp;gt;BrickWall&amp;lt;/code&amp;gt; and its &#039;&#039;&#039;Models&#039;&#039;&#039; browser contains your crate entries. Both maps select from the same library. Base-game materials and entities should still be available. If the base assets disappear, restore the original entries in &amp;lt;code&amp;gt;assetCatalogs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Do not use &#039;&#039;&#039;Load engine assets…&#039;&#039;&#039; as a substitute for this setup. Loading a loose preview catalog does not connect a map&#039;s compiler to the Unity source assets.&lt;br /&gt;
&lt;br /&gt;
== 7. Use the assets and test the add-on ==&lt;br /&gt;
&lt;br /&gt;
# In Vertex&#039;s material browser, search for &amp;lt;code&amp;gt;BrickWall&amp;lt;/code&amp;gt;. Drag it onto a brush face; hold &#039;&#039;&#039;Shift&#039;&#039;&#039; while dropping to apply it to the whole brush. Adjust the face&#039;s texture scale and alignment as needed.&lt;br /&gt;
# In the model browser, search for &amp;lt;code&amp;gt;Crate&amp;lt;/code&amp;gt;. Choose the entry whose source is &amp;lt;code&amp;gt;Prefabs/Crate.prefab&amp;lt;/code&amp;gt; and drag it into a viewport. Place it, then check its size and orientation.&lt;br /&gt;
# Save the map. In Build, select &#039;&#039;&#039;Preview&#039;&#039;&#039; and your desktop platform, then &#039;&#039;&#039;Play in Game&#039;&#039;&#039;. If requested, select the pinned Unity executable and your Grimwar installation in the build settings.&lt;br /&gt;
# Walk around the crate in Grimwar to check collision. Inspect the wall&#039;s tiling, material, and lighting. Test the actual game even when the Vertex preview looks correct.&lt;br /&gt;
# When ready, use &#039;&#039;&#039;Export add-on&#039;&#039;&#039; with the Release profile and follow [[Grimwar/Steam Workshop addons|the publication guide]].&lt;br /&gt;
&lt;br /&gt;
The build includes referenced custom Unity assets and their required custom dependencies. The exported catalog is a browser index, not an installable add-on; distribute the built add-on rather than loose &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;.vertexassets&amp;lt;/code&amp;gt; files. Players do not need your Unity project to play the compiled map.&lt;br /&gt;
&lt;br /&gt;
Grimwar&#039;s SDK still uses &#039;&#039;&#039;Play in Game&#039;&#039;&#039; and &#039;&#039;&#039;Export add-on&#039;&#039;&#039; with this connection. It does not provide the base game&#039;s playable Unity project or a &#039;&#039;&#039;Save to Unity&#039;&#039;&#039; workflow.&lt;br /&gt;
&lt;br /&gt;
== Updating assets, sharing source, and SDK updates ==&lt;br /&gt;
&lt;br /&gt;
For each edit: &#039;&#039;&#039;change the Unity asset → save/apply it → export CustomAssets to the same CustomAssets.vertexassets file → Reload resources in Vertex → rebuild and playtest&#039;&#039;&#039;. All connected maps use this library update when reloaded; rebuild each map you want to distribute with the changed asset. Editing only the PNG or prefab on disk does not refresh an already exported catalog. Changing a prefab instance in a temporary scene does not update the prefab until you apply or save those changes.&lt;br /&gt;
&lt;br /&gt;
Keep existing &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files and the catalog ID. Vertex references Unity assets by their GUID and local file ID, not just by filename. Move assets inside Unity when reorganizing; deleting and recreating an asset can break map references even if you reuse its name.&lt;br /&gt;
&lt;br /&gt;
To hand editable source to another creator, share the map and scripts plus the library&#039;s custom asset folder with all &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files and its catalog profile, the catalog with its previews, and the connection setup for the matching SDK release. They can keep the library in their own general asset folder and connect the map to it. A &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; map alone does not contain these Unity source assets.&lt;br /&gt;
&lt;br /&gt;
If you already created a library inside a map project, move its complete SDK folder to a general location such as &amp;lt;code&amp;gt;Documents/GrimwarLibrary&amp;lt;/code&amp;gt;, then choose its new &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt; location in each map. Keep its existing catalog ID, asset names, and &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files; you do not need to rename existing assets to match this guide&#039;s example names.&lt;br /&gt;
&lt;br /&gt;
Your personal SDK copy does not update when Steam updates. For a new SDK release, make a fresh working copy, transfer your custom folder with its &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files, repeat the connection edits on the newly supplied files, and re-export the catalog with the required Unity version. Keep the old working copy until your map builds and playtests successfully. Do not overwrite new SDK packages or the new game profile with old versions.&lt;br /&gt;
&lt;br /&gt;
Your editable source stays in the shared library. An exported add-on includes the custom assets its map references and their required dependencies; selecting one crate does not bundle the whole library. Referenced custom assets can therefore appear in more than one built add-on. The SDK&#039;s shared developer materials are already base-game assets. For reusable imported media distributed once as a separate dependency, see [[Grimwar/Custom content#Make a reusable media pack|media packs]]; the file importer there still accepts the formats listed on that page, not arbitrary Unity prefabs or materials.&lt;br /&gt;
&lt;br /&gt;
== If something is missing or wrong ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What you see !! What to check&lt;br /&gt;
|-&lt;br /&gt;
| Asset exists in Unity but is absent from Vertex || Confirm the file is under the catalog&#039;s folder rule, its type is enabled, and you exported the selected custom profile. Confirm the custom catalog entry is in the connected copy&#039;s &amp;lt;code&amp;gt;Authoring/Grimwar.vertexgame&amp;lt;/code&amp;gt;, then reload resources.&lt;br /&gt;
|-&lt;br /&gt;
| Model appears, but its material cannot be chosen for a brush || Extract or create a standalone &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt;. Embedded materials are hidden. Disable Material Dependencies Only on your custom folder rule and remove a &amp;lt;code&amp;gt;VertexHidden&amp;lt;/code&amp;gt; asset label if you intentionally added one.&lt;br /&gt;
|-&lt;br /&gt;
| Asset previews correctly, but the build says the asset or profile is missing || Check the map&#039;s chosen &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt;. Its local &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; project must contain both the original assets and &amp;lt;code&amp;gt;CustomAssets.asset&amp;lt;/code&amp;gt;. A copied catalog alone is insufficient. Check the &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt; edit and preserve &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files.&lt;br /&gt;
|-&lt;br /&gt;
| Material is pink, gray, or missing a texture || Check the shader and renderer material slots in Unity, and confirm all texture references resolve. Use URP/Lit and check Unity&#039;s render pipeline assignment from step 1, then save, export, reload, and rebuild. A Vertex preview does not prove that an unsupported shader can run in the game.&lt;br /&gt;
|-&lt;br /&gt;
| Crate looks correct but the player walks through it || Check the saved prefab&#039;s enabled collider, the placed model&#039;s collision setting in Vertex, and whether you placed the prefab rather than the raw model. Test collision in Grimwar.&lt;br /&gt;
|-&lt;br /&gt;
| Crate is too large, too small, or rotated incorrectly || Correct the model import scale/orientation or the saved prefab transform in Unity. Apply, re-export, reload, and rebuild. Compare against a one-metre cube.&lt;br /&gt;
|-&lt;br /&gt;
| Connection fails after editing JSON || Check commas and brackets, preserve the supplied fields, and match the catalog&#039;s ID/version exactly. The catalog path is relative to the game profile; both project paths are relative to &amp;lt;code&amp;gt;Grimwar.vertexsdk&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Compiler setup reports unresolved packages or missing package-resolution data || Open the copied &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; project in the pinned Unity editor and let Package Manager and asset import finish successfully before building from Vertex.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Mapping]] [[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Mapping&amp;diff=269</id>
		<title>Grimwar/Mapping</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Mapping&amp;diff=269"/>
		<updated>2026-10-04T15:55:12Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Guide custom Unity materials and models into Vertex&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Create the map in Vertex, build it with the Grimwar SDK, and test it in the installed game. Complete [[Grimwar/SDK setup#Install the SDK|SDK setup]] first.&lt;br /&gt;
&lt;br /&gt;
== Create and name the map ==&lt;br /&gt;
&lt;br /&gt;
Save a new map in a source folder you own, such as &amp;lt;code&amp;gt;Maps/my_arena/my_arena.vertex&amp;lt;/code&amp;gt;. Keep the companion script, thumbnail, and custom media there. Use &#039;&#039;&#039;File → Welcome… → Open repository…&#039;&#039;&#039; to find existing editable maps in a local checkout.&lt;br /&gt;
&lt;br /&gt;
The filename sets the map ID and exported add-on ID. &amp;lt;code&amp;gt;sb_developer.vertex&amp;lt;/code&amp;gt; produces &amp;lt;code&amp;gt;sb_developer&amp;lt;/code&amp;gt;, including the underscore. Set &#039;&#039;&#039;Map → Title&#039;&#039;&#039; to a readable display name. Changing the title does not rename the ID; &#039;&#039;&#039;Save As / Copy…&#039;&#039;&#039; with a different filename does.&lt;br /&gt;
&lt;br /&gt;
Choose an ID that does not collide with a built-in map or another installed add-on. An &amp;lt;code&amp;gt;sb_&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;koth_&amp;lt;/code&amp;gt;, or other filename prefix is a naming convention, not a game-mode switch. Choose the mode when hosting. The current Vertex SDK connection uses King of the Hill for its default playtest launch.&lt;br /&gt;
&lt;br /&gt;
== Build a playable space ==&lt;br /&gt;
&lt;br /&gt;
Start with a floor, walls, and a route between spawn areas. See [[Vertex/Editing]] for drawing, clipping, materials, models, terrain, and collision controls.&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Auto&#039;&#039;&#039; collision for ordinary geometry and inspect it with &#039;&#039;&#039;Shift+C&#039;&#039;&#039;. Box or Convex collision can seal a visible doorway. For moving doors and platforms, put their geometry beneath the corresponding entity in the hierarchy so it moves with the entity.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Prefabs&#039;&#039;&#039; browser includes a burn barrel and Order/Union spawn-door assemblies. Place an assembly to inspect how its models, triggers, doors, audio, and script host fit together. Linked instances remain editable.&lt;br /&gt;
&lt;br /&gt;
== Place spawns and objectives ==&lt;br /&gt;
&lt;br /&gt;
Use the entity creation controls and give the objects readable, stable names.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Purpose !! Entities and setup&lt;br /&gt;
|-&lt;br /&gt;
| Team spawn || [[Grimwar/Entities/info_player_spawn|info_player_spawn]]. Set Team explicitly; the default is Union. Provide usable spawns for each participating team.&lt;br /&gt;
|-&lt;br /&gt;
| King of the Hill or capture objectives || [[Grimwar/Entities/game_capture_point|game_capture_point]]. Set the starting owner and capture times.&lt;br /&gt;
|-&lt;br /&gt;
| Uplink || [[Grimwar/Entities/game_capture_flag|game_capture_flag]]. Configure the prerequisite graph and exactly one middle flag.&lt;br /&gt;
|-&lt;br /&gt;
| Blitz || [[Grimwar/Entities/game_blitz_tank|game_blitz_tank]] with path points and child [[Grimwar/Entities/game_blitz_checkpoint|checkpoints]].&lt;br /&gt;
|-&lt;br /&gt;
| Gravewar facilities || [[Grimwar/Entities/trigger_gravewar_skull_deposit|Skull deposit]] and [[Grimwar/Entities/trigger_gravewar_upgrade_zone|upgrade zone]].&lt;br /&gt;
|-&lt;br /&gt;
| Supplies || [[Grimwar/Entities/item_pickup|item_pickup]] or [[Grimwar/Entities/func_resupply|func_resupply]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The [[Grimwar/Entities|entity reference]] lists entity types. Its individual pages include placement, settings, defaults, and script signals.&lt;br /&gt;
&lt;br /&gt;
Volumes use their authored orientation and size. Keep a trigger large enough to overlap a player, and check its team/activator filters. A new &amp;lt;code&amp;gt;trigger_multiple&amp;lt;/code&amp;gt; has &#039;&#039;&#039;Allowed Teams: None&#039;&#039;&#039;, which blocks participants until you select the intended teams.&lt;br /&gt;
&lt;br /&gt;
== Optional map settings and music ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Map Settings&#039;&#039;&#039; (&amp;lt;code&amp;gt;info_map_settings&amp;lt;/code&amp;gt;) is optional. You can compile, export, and play a map without placing one or choosing music. Omitted settings use the game defaults; the default loading and gameplay score is &#039;&#039;&#039;Ordainment&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To override the score, place one Map Settings entity and choose &#039;&#039;&#039;Compound&#039;&#039;&#039;, &#039;&#039;&#039;Ritual&#039;&#039;&#039;, &#039;&#039;&#039;Arcade&#039;&#039;&#039;, or &#039;&#039;&#039;Ordainment&#039;&#039;&#039; in &#039;&#039;&#039;Music Set&#039;&#039;&#039;. Leaving Music Set at &#039;&#039;&#039;Unassigned&#039;&#039;&#039; also uses Ordainment. The map filename and title do not select music.&lt;br /&gt;
&lt;br /&gt;
Do not put objects beneath Map Settings: the compiler reads its overrides and removes the settings object from the compiled scene. Duplicate settings entities and invalid music values remain build errors. A package with no &amp;lt;code&amp;gt;musicSet&amp;lt;/code&amp;gt; value also uses the default score.&lt;br /&gt;
&lt;br /&gt;
== Add logic and media ==&lt;br /&gt;
&lt;br /&gt;
Vertex associates a &amp;lt;code&amp;gt;.vsig&amp;lt;/code&amp;gt; script with the map. Use the Code workspace to connect entity outputs to inputs, such as a trigger opening a door. [[Grimwar/VSig]] gives a complete example.&lt;br /&gt;
&lt;br /&gt;
For C# behavior tied to this map, use &#039;&#039;&#039;Map → SDK resources → VMod → Create…&#039;&#039;&#039; or attach an existing resource inside the source folder. The map build includes it; you do not need a second installed package. See [[Grimwar/VMod#Attach a VMod to a map|map-bound VMods]].&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039; to import custom sounds, models, textures, and data. References to another installed package become dependencies. See [[Grimwar/Custom content]]. For Unity-authored materials and model prefabs, follow [[Grimwar/Unity custom content|the guided Unity asset workflow]], including the exact source folders and catalog setup.&lt;br /&gt;
&lt;br /&gt;
== Set lighting and a thumbnail ==&lt;br /&gt;
&lt;br /&gt;
Set the sky, sun, ambient light, and fog in Map Environment. Place &amp;lt;code&amp;gt;env_light&amp;lt;/code&amp;gt; entities for local lights. Use Mixed or Dynamic lighting for animated or scripted lights; Area lights are baked only.&lt;br /&gt;
&lt;br /&gt;
Choose a lightmap quality for your test. &#039;&#039;&#039;None&#039;&#039;&#039; skips lightmap/APV baking but does not skip Grimwar&#039;s required navigation, spatial, and occlusion work. Check the compiled lighting in the game.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;&#039;Map → Thumbnail&#039;&#039;&#039;, choose a PNG or JPEG. Vertex uses it for the add-on thumbnail and in-game map image. Use 1920 × 1080 for release artwork. Vertex copies an image from outside the source folder beside the map, so include that copy when sharing the source.&lt;br /&gt;
&lt;br /&gt;
== Compile and play ==&lt;br /&gt;
&lt;br /&gt;
# Save the map and any externally edited script or media files.&lt;br /&gt;
# Select &#039;&#039;&#039;Preview&#039;&#039;&#039; and your desktop target in Build.&lt;br /&gt;
# Select &#039;&#039;&#039;Play in Game&#039;&#039;&#039;. Vertex captures the inputs, compiles, installs the add-on, and launches Grimwar.&lt;br /&gt;
# In &#039;&#039;&#039;Addons&#039;&#039;&#039;, confirm the package is valid and enabled. Choose &#039;&#039;&#039;Use This Copy&#039;&#039;&#039; if a Workshop or older local copy is selected.&lt;br /&gt;
# Open &#039;&#039;&#039;Host&#039;&#039;&#039;, select the map and intended game mode, and use &#039;&#039;&#039;Local&#039;&#039;&#039; access for an unpublished build.&lt;br /&gt;
# Test collision, spawns, objectives, sounds, scripts, and more than one round. Reload the map to check initialization again.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export add-on&#039;&#039;&#039; performs the build without launching the game. &#039;&#039;&#039;Open current output&#039;&#039;&#039; shows the generated package. Close a running playtest before replacing its loaded bundles.&lt;br /&gt;
&lt;br /&gt;
The default install location is Grimwar&#039;s user add-on library; [[Grimwar/Addons#Install a local package|Using add-ons]] lists the platform paths. You can choose a separate output folder in Build&#039;s Advanced settings for isolated tests.&lt;br /&gt;
&lt;br /&gt;
== Build for publishing ==&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Release&#039;&#039;&#039; and export the map. Release includes Windows client, macOS client, and Linux dedicated-server output. Install every required Unity target module and resolve all build errors before publishing.&lt;br /&gt;
&lt;br /&gt;
Keep the generated folder intact. It contains &amp;lt;code&amp;gt;addon.json&amp;lt;/code&amp;gt;, platform files, and build receipts used to verify the package. Editing generated files breaks that verification; change the source and rebuild instead.&lt;br /&gt;
&lt;br /&gt;
Publish from Grimwar&#039;s Addons screen following [[Grimwar/Steam Workshop addons]]. Publish required media packs first. An unpublished local package has no download source for other players and is restricted to local testing.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/SDK_setup&amp;diff=268</id>
		<title>Grimwar/SDK setup</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/SDK_setup&amp;diff=268"/>
		<updated>2026-10-04T15:55:11Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Guide custom Unity materials and models into Vertex&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
The Grimwar SDK includes Vertex for maps, VSDK for setup and standalone resources, and Grimwar&#039;s assets and compiler. This wiki is the maintained source for Vellocet SDK guidance.&lt;br /&gt;
&lt;br /&gt;
== Install the SDK ==&lt;br /&gt;
&lt;br /&gt;
# In Steam&#039;s Library, enable the &#039;&#039;&#039;Tools&#039;&#039;&#039; filter and install &#039;&#039;&#039;Grimwar SDK&#039;&#039;&#039;. Install Grimwar too if you want to playtest.&lt;br /&gt;
# Launch the SDK to open VSDK.&lt;br /&gt;
# For map builds, install and activate Unity &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt; through Unity Hub. Add build support for the targets you will use. VSDK detects standard installations; choose the Unity executable if detection misses yours.&lt;br /&gt;
# Choose your installed Grimwar executable or macOS app for playtesting.&lt;br /&gt;
# Select &#039;&#039;&#039;Finish setup and open Vertex&#039;&#039;&#039;. Setup prepares a writable compiler cache and registers the game.&lt;br /&gt;
# Create a map and save it outside the SDK installation.&lt;br /&gt;
&lt;br /&gt;
Map compilation runs Unity through the SDK. You author in Vertex and play in Grimwar. You do not need to create a Unity project or install a Unity package by hand for this workflow.&lt;br /&gt;
&lt;br /&gt;
A VMod containing only scripts, sounds, or ordinary data can be validated and built without Unity. Imported models, materials, textures, fonts, and video use the Unity compiler. Map lighting also needs a working graphics device.&lt;br /&gt;
&lt;br /&gt;
== Choose a workflow ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What you are making !! Start here&lt;br /&gt;
|-&lt;br /&gt;
| Map || Open Vertex, then [[Grimwar/Mapping|make a map]].&lt;br /&gt;
|-&lt;br /&gt;
| Map logic || Open the map&#039;s Code workspace and follow [[Grimwar/VSig|VSig]].&lt;br /&gt;
|-&lt;br /&gt;
| Standalone server mod || In VSDK, select &#039;&#039;&#039;VMod&#039;&#039;&#039; and &#039;&#039;&#039;Create…&#039;&#039;&#039;. See [[Grimwar/VMod]].&lt;br /&gt;
|-&lt;br /&gt;
| C# behavior attached to one map || Use &#039;&#039;&#039;Map → SDK resources → VMod → Create…&#039;&#039;&#039; in Vertex.&lt;br /&gt;
|-&lt;br /&gt;
| Reusable media || In VSDK, select &#039;&#039;&#039;Media pack&#039;&#039;&#039;, create it, and open &#039;&#039;&#039;Content…&#039;&#039;&#039;. See [[Grimwar/Custom content]].&lt;br /&gt;
|-&lt;br /&gt;
| Unity materials or model prefabs for a map || Follow [[Grimwar/Unity custom content]] to make a personal SDK copy, author assets in &amp;lt;code&amp;gt;Compiler/Assets/CustomContent/&amp;lt;/code&amp;gt;, and register them with Vertex.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Files and updates ==&lt;br /&gt;
&lt;br /&gt;
Keep your maps, scripts, thumbnails, &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt;, and imported files together in a source folder you control. Keep build output separate. Steam can replace SDK files during an update.&lt;br /&gt;
&lt;br /&gt;
Update the complete SDK through Steam and launch VSDK again. Do not mix an editor executable from one SDK release with the catalogs or compiler from another. Your source files and local preferences stay outside the installation.&lt;br /&gt;
&lt;br /&gt;
In Vertex, use &#039;&#039;&#039;Settings → Game and resources → Reload resources&#039;&#039;&#039; after changing or refreshing the game connection. Engine and game executable paths are under &#039;&#039;&#039;Build → Advanced&#039;&#039;&#039;. Standalone Vertex can open the same installation through &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Build profiles ==&lt;br /&gt;
&lt;br /&gt;
Vertex&#039;s &#039;&#039;&#039;Preview&#039;&#039;&#039; profile builds for local testing on the selected platform. VSDK calls its local standalone-resource output a Development package. These packages are for testing and cannot be published to Workshop.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release&#039;&#039;&#039; map exports include Windows client, macOS client, and Linux dedicated-server artifacts. Install the matching Unity build modules. The SDK enforces the required navigation, spatial, occlusion, and lighting policy.&lt;br /&gt;
&lt;br /&gt;
Choose a 1920 × 1080 thumbnail before publishing. Vertex maps accept PNG or JPEG through &#039;&#039;&#039;Map → Thumbnail&#039;&#039;&#039;; standalone VMods use a PNG path in &amp;lt;code&amp;gt;mod.json.thumbnail&amp;lt;/code&amp;gt;. A map can compile without artwork, but Workshop publication requires it. See [[Grimwar/Steam Workshop addons]].&lt;br /&gt;
&lt;br /&gt;
== If you are integrating your own game ==&lt;br /&gt;
&lt;br /&gt;
Read [[Vertex/Integrating your game]]. Your game supplies its own catalogs, entity behavior, compiler, and runtime loader. A local developer connection can offer &#039;&#039;&#039;Save to Unity&#039;&#039;&#039; for that game project. Grimwar&#039;s public SDK supplies a compiler, so its community workflow is &#039;&#039;&#039;Export add-on&#039;&#039;&#039; and &#039;&#039;&#039;Play in Game&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Content&amp;diff=267</id>
		<title>Vertex/Content</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Content&amp;diff=267"/>
		<updated>2026-10-04T15:55:09Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Guide custom Unity materials and models into Vertex&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Content&#039;&#039;&#039; manages files owned by a map or SDK resource and references to assets from other packages. The connected game decides which file types it supports and how those files become usable in the game.&lt;br /&gt;
&lt;br /&gt;
== Import your files ==&lt;br /&gt;
&lt;br /&gt;
# Save the map, then open &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039;. For a standalone resource, open its &#039;&#039;&#039;Content…&#039;&#039;&#039; controls in VSDK.&lt;br /&gt;
# Choose a content type and select &#039;&#039;&#039;Import files&#039;&#039;&#039;.&lt;br /&gt;
# Review the imported names and settings. The SDK may offer controls such as audio playback type or volume.&lt;br /&gt;
# Select the new asset in the appropriate material, model, entity, or script field.&lt;br /&gt;
&lt;br /&gt;
Vertex keeps imported source under &amp;lt;code&amp;gt;Content/&amp;lt;/code&amp;gt; and records it in &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt;. Keep both beside the map or resource manifest. Importing a file makes it available; you still need to place it or reference it.&lt;br /&gt;
&lt;br /&gt;
An asset key identifies the package and asset, for example &amp;lt;code&amp;gt;asset:shared_sounds/wind_loop&amp;lt;/code&amp;gt;. Display names can change without changing that key. Use &#039;&#039;&#039;Replace media&#039;&#039;&#039; to replace a file while retaining its references. Reimporting it as a new asset creates a different entry.&lt;br /&gt;
&lt;br /&gt;
Models may have companion materials and textures. Keep those files together when importing. &#039;&#039;&#039;Rebuild model previews&#039;&#039;&#039; refreshes the editor preview after external changes; the game compiler still builds the runtime model.&lt;br /&gt;
&lt;br /&gt;
== Materials and prefabs authored in Unity ==&lt;br /&gt;
&lt;br /&gt;
For Grimwar, follow [[Grimwar/Unity custom content|Unity materials and models for Vertex]]. Create the Unity assets beneath &amp;lt;code&amp;gt;Compiler/Assets/CustomContent/&amp;lt;/code&amp;gt; in a personal SDK copy, export a catalog, and connect Vertex to that copy. The guide covers each folder and setting with a wall material and a crate prefab. Dropping files into a Unity folder alone does not add them to Vertex, and Content&#039;s file importer does not accept &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== Use an installed package ==&lt;br /&gt;
&lt;br /&gt;
Select an installed asset in Content and choose &#039;&#039;&#039;Use this package&#039;&#039;&#039;. Vertex records the provider&#039;s add-on ID and references the asset by key. The resulting build depends on that package and does not include another copy of its files.&lt;br /&gt;
&lt;br /&gt;
The provider must be installed and enabled in the game. Publish and distribute the provider as well as the map or mod that uses it. A different display title or Workshop item number does not replace the stable package ID.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Copy files into this package&#039;&#039;&#039; creates an owned copy when you want to distribute and maintain the files yourself. References to other packages that you keep using remain dependencies. Check that the asset&#039;s terms permit redistribution.&lt;br /&gt;
&lt;br /&gt;
== Check what ships ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Check build contents&#039;&#039;&#039; lists selected files, sizes, and the references or inclusion settings that bring them into the build. Use it before publishing a large package.&lt;br /&gt;
&lt;br /&gt;
Enable &#039;&#039;&#039;Include in build&#039;&#039;&#039; for files used only through dynamically constructed script references. An unchecked asset is still included when the map or another included asset needs it.&lt;br /&gt;
&lt;br /&gt;
Missing providers, cycles, unsupported formats, or changed source files can stop a build. Fix the reported source or dependency and rebuild. Avoid editing the generated package manifest to bypass an error.&lt;br /&gt;
&lt;br /&gt;
For supported formats, a complete sound example, and reusable media packs, see [[Grimwar/Custom content]]. For another game&#039;s support, use that game&#039;s SDK documentation.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Custom_content&amp;diff=266</id>
		<title>Grimwar/Custom content</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Custom_content&amp;diff=266"/>
		<updated>2026-10-04T15:55:08Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Guide custom Unity materials and models into Vertex&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Use Content in Vertex or VSDK to import your own media. A map or VMod can own its files, or reference assets from another installed add-on. The SDK builds the required files and records those dependencies.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Creating materials or model prefabs in Unity?&#039;&#039;&#039; Follow [[Grimwar/Unity custom content|Unity materials and models for Vertex]]. It shows exactly where to create your textures, &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; files, models, and &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files, how to export their catalog, and how to use them in an add-on map. The file-import workflow on this page creates content from supported source files; it does not import Unity &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== Add a sound to a map ==&lt;br /&gt;
&lt;br /&gt;
# Save the map, for example &amp;lt;code&amp;gt;my_arena.vertex&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Open &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039;, choose &#039;&#039;&#039;Sound&#039;&#039;&#039;, then &#039;&#039;&#039;Import files&#039;&#039;&#039;. Select &amp;lt;code&amp;gt;wind_loop.wav&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Set &#039;&#039;&#039;Playback&#039;&#039;&#039; to &#039;&#039;&#039;AmbientLoop&#039;&#039;&#039; for a looping sound with a world position. Adjust &#039;&#039;&#039;Volume&#039;&#039;&#039; between 0 and 1.&lt;br /&gt;
# Place an [[Grimwar/Entities/env_ambient|env_ambient]] entity and select the imported sound in &#039;&#039;&#039;Custom Cue&#039;&#039;&#039;. Leave &#039;&#039;&#039;Play On Start&#039;&#039;&#039; enabled to hear it when the map loads.&lt;br /&gt;
# Build with &#039;&#039;&#039;Play in Game&#039;&#039;&#039; and check the volume and placement in Grimwar.&lt;br /&gt;
&lt;br /&gt;
The imported sound has a key such as &amp;lt;code&amp;gt;asset:my_arena/wind_loop&amp;lt;/code&amp;gt;. Custom Cue takes priority over the entity&#039;s base-game Event Name. You do not need to build Wwise banks or write an audio manifest.&lt;br /&gt;
&lt;br /&gt;
The source stays under &amp;lt;code&amp;gt;Content/&amp;lt;/code&amp;gt;, with its settings in &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt;. Keep both with the map. Use &#039;&#039;&#039;Replace media&#039;&#039;&#039; to update the sound without changing its key.&lt;br /&gt;
&lt;br /&gt;
=== Pick the playback type ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Use&lt;br /&gt;
|-&lt;br /&gt;
| Announcer || Non-spatial announcements.&lt;br /&gt;
|-&lt;br /&gt;
| Sfx2D || A non-spatial one-shot sound.&lt;br /&gt;
|-&lt;br /&gt;
| Sfx3D || A one-shot sound at a world position.&lt;br /&gt;
|-&lt;br /&gt;
| AmbientLoop || A looping sound at a world position.&lt;br /&gt;
|-&lt;br /&gt;
| MusicLoop || Looping music.&lt;br /&gt;
|-&lt;br /&gt;
| Ambience2DLoop || Looping non-spatial ambience.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For a sound that starts from a door or objective, disable Play On Start and call the ambient entity from a client VSig handler. See [[Grimwar/VSig#Server and client logic|Server and client logic]].&lt;br /&gt;
&lt;br /&gt;
An ambient entity&#039;s &#039;&#039;&#039;Audible Distance&#039;&#039;&#039; is its emitter radius, not a guaranteed cutoff distance. Point mode stays at the marker. Volumetric mode follows the nearest boundary of its oriented box when the listener is outside and plays in 2D inside.&lt;br /&gt;
&lt;br /&gt;
== Make a reusable media pack ==&lt;br /&gt;
&lt;br /&gt;
# Open VSDK and select &#039;&#039;&#039;Media pack&#039;&#039;&#039;, then &#039;&#039;&#039;Create…&#039;&#039;&#039;. Choose a new source folder outside the SDK installation, such as &amp;lt;code&amp;gt;shared_sounds&amp;lt;/code&amp;gt;. The folder name becomes the pack&#039;s stable ID.&lt;br /&gt;
# Open &#039;&#039;&#039;Content…&#039;&#039;&#039; and set its title, author, and version.&lt;br /&gt;
# Import your files and choose their settings. Mark assets intended for other packages with &#039;&#039;&#039;Include in build&#039;&#039;&#039;.&lt;br /&gt;
# Select &#039;&#039;&#039;Check build contents&#039;&#039;&#039; and review the file list and size.&lt;br /&gt;
# Build into Grimwar&#039;s add-on folder and enable the package in the game.&lt;br /&gt;
&lt;br /&gt;
In another map or VMod&#039;s Content window, select an installed asset from this pack and choose &#039;&#039;&#039;Use this package&#039;&#039;&#039;. A reference such as &amp;lt;code&amp;gt;asset:shared_sounds/wind_loop&amp;lt;/code&amp;gt; points to the provider. The consuming build records &amp;lt;code&amp;gt;shared_sounds&amp;lt;/code&amp;gt; as a requirement and leaves the sound bytes in the provider&#039;s package.&lt;br /&gt;
&lt;br /&gt;
Install and enable both packages to test them. Publish the media pack first, then the map or mod that depends on it. Keep the provider ID and asset keys stable in updates. Removing or renaming a published key can break consumers even if the pack&#039;s display title stays the same.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Copy files into this package&#039;&#039;&#039; when you want an independent copy you can edit and distribute. Check the creator&#039;s redistribution terms first. Other external references still keep their own dependencies.&lt;br /&gt;
&lt;br /&gt;
== Use media in a VMod ==&lt;br /&gt;
&lt;br /&gt;
Open the VMod&#039;s &#039;&#039;&#039;Content…&#039;&#039;&#039; controls in VSDK. For an attached VMod, select it under the map&#039;s SDK resources and use that resource&#039;s Content button. Importing there gives the script local names for its own assets.&lt;br /&gt;
&lt;br /&gt;
For a sound imported as &amp;lt;code&amp;gt;round_start&amp;lt;/code&amp;gt; with the Announcer or Sfx2D playback type:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var result = context.Audio.PlayToAll(&amp;quot;round_start&amp;quot;);&lt;br /&gt;
if (!result.Success)&lt;br /&gt;
    context.Log.Warn(result.Message);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use a full asset key for a sound from a shared pack:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var result = context.Audio.PlayFromPlayer(&lt;br /&gt;
    playerId, &amp;quot;asset:shared_sounds/wind_loop&amp;quot;, 0.5f);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here &amp;lt;code&amp;gt;context&amp;lt;/code&amp;gt; is the &amp;lt;code&amp;gt;IModContext&amp;lt;/code&amp;gt; saved in &amp;lt;code&amp;gt;OnLoad&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;playerId&amp;lt;/code&amp;gt; identifies a connected player. This second example needs an AmbientLoop or Sfx3D cue. &amp;lt;code&amp;gt;PlayFromPlayer&amp;lt;/code&amp;gt; uses the player&#039;s authoritative pawn position. Save &amp;lt;code&amp;gt;result.Value&amp;lt;/code&amp;gt; from a successful play if you need to stop it later with &amp;lt;code&amp;gt;context.Audio.Stop&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PlayToAll&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PlayToPlayer&amp;lt;/code&amp;gt; accept non-spatial cue types. &amp;lt;code&amp;gt;PlayAt&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;PlayFromPlayer&amp;lt;/code&amp;gt; accept Sfx3D and AmbientLoop. Playback gain multiplies the cue&#039;s own volume.&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Use this package&#039;&#039;&#039; to record a selected provider. When declaring a dependency directly in a VMod manifest, put its add-on ID in &amp;lt;code&amp;gt;requires&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;dependencies&amp;lt;/code&amp;gt; instead lists VMod IDs for script load order.&lt;br /&gt;
&lt;br /&gt;
API 15 also exposes declared text/data through &amp;lt;code&amp;gt;Content&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
string rules;&lt;br /&gt;
if (context.Content.TryReadText(&amp;quot;rules&amp;quot;, out rules))&lt;br /&gt;
    context.Log.Write(rules);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Import the file through the resource&#039;s Content window and keep it included in the build. &amp;lt;code&amp;gt;Content.Describe(key)&amp;lt;/code&amp;gt; reads asset metadata. These APIs operate on declared assets; they do not give a VMod access to arbitrary files.&lt;br /&gt;
&lt;br /&gt;
== Supported imports ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Source formats !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Sound || WAV, Ogg Vorbis, MP3 || Up to 32 MiB per source. Set the playback type and volume.&lt;br /&gt;
|-&lt;br /&gt;
| Surface material || PNG, JPG/JPEG, TGA || Creates a surface material from an image. Up to 16 MiB per source.&lt;br /&gt;
|-&lt;br /&gt;
| Image / texture || PNG, JPG/JPEG, TGA || Up to 16 MiB per source. Select the type the consuming field expects.&lt;br /&gt;
|-&lt;br /&gt;
| Model || FBX, OBJ || Import supported MTL and image companions alongside it. Review scale and collision.&lt;br /&gt;
|-&lt;br /&gt;
| Font || TTF, OTF || Requires a supported game consumer.&lt;br /&gt;
|-&lt;br /&gt;
| Video || MP4, WebM, MOV || Requires a supported game consumer; importing a clip does not place a video screen.&lt;br /&gt;
|-&lt;br /&gt;
| Text / data || TXT, JSON, CSV, Markdown || Up to 8 MiB per source; usable through the VMod Content API.&lt;br /&gt;
|-&lt;br /&gt;
| Binary data || BIN || Packaged data for supported consumers, not executable code.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Native Unity media, including models, materials, textures, fonts, and video, needs the SDK&#039;s pinned Unity compiler and target modules. Sounds and ordinary data use platform-independent files. Import support does not imply that every entity or VMod service can consume every type.&lt;br /&gt;
&lt;br /&gt;
== Keep builds small and repeatable ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Check build contents&#039;&#039;&#039; to see what is included and why. Unreferenced files can stay in your source folder without shipping. &#039;&#039;&#039;Include in build&#039;&#039;&#039; keeps an asset available when code chooses its key at runtime; a referenced asset is included even if that checkbox is off.&lt;br /&gt;
&lt;br /&gt;
Keep model companion files together. Use &#039;&#039;&#039;Rebuild model previews&#039;&#039;&#039; after editing a model externally. Rebuild the package after any source change; the compiler reuses matching verified output where it can.&lt;br /&gt;
&lt;br /&gt;
Avoid copying the same large library into every map. Put shared assets in a media pack when you want a common update and dependency. Use an owned copy when a map needs to keep its own version.&lt;br /&gt;
&lt;br /&gt;
== Artwork and distribution ==&lt;br /&gt;
&lt;br /&gt;
Set a media pack&#039;s title, author, version, and PNG thumbnail in Content. Use a 1920 × 1080 thumbnail for Release. Enable &#039;&#039;&#039;Release package&#039;&#039;&#039; in VSDK, build, and publish the result as &#039;&#039;&#039;Content&#039;&#039;&#039; from Grimwar&#039;s Addons screen.&lt;br /&gt;
&lt;br /&gt;
Keep the entire output folder, including its generated &amp;lt;code&amp;gt;addon.json&amp;lt;/code&amp;gt; and catalogs. The editable &amp;lt;code&amp;gt;content.json&amp;lt;/code&amp;gt; is source; it is not an installable package by itself. See [[Grimwar/Steam Workshop addons]] for dependencies and updates.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Unity_custom_content&amp;diff=265</id>
		<title>Grimwar/Unity custom content</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Unity_custom_content&amp;diff=265"/>
		<updated>2026-10-04T15:55:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Guide custom Unity materials and models into Vertex&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Create Unity materials and model prefabs for a Grimwar add-on map, then make them available in Vertex. This walkthrough creates a wall material and a crate prefab in a Unity project you own.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Put your Unity source assets in &amp;lt;code&amp;gt;Compiler/Assets/CustomContent/MyArena/&amp;lt;/code&amp;gt; inside a personal copy of the Grimwar SDK.&#039;&#039;&#039; Export a Vertex asset catalog from that project and connect Vertex to that copy. A folder alone does not register its contents with Vertex.&lt;br /&gt;
&lt;br /&gt;
If you only want to import an image as a surface material or an FBX/OBJ with its companion files, use &#039;&#039;&#039;Settings → Map details → Content…&#039;&#039;&#039; in Vertex instead. That simpler workflow is covered by [[Grimwar/Custom content]]. The walkthrough below is for authored Unity &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; files, material assignments, import settings, and &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files. Content&#039;s file importer does not accept &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== 1. Make your own working copy ==&lt;br /&gt;
&lt;br /&gt;
# Complete [[Grimwar/SDK setup|SDK setup]]. Install Unity &amp;lt;code&amp;gt;6000.3.17f1&amp;lt;/code&amp;gt; and the build modules you need.&lt;br /&gt;
# In Steam, open Grimwar SDK&#039;s &#039;&#039;&#039;Manage → Browse local files&#039;&#039;&#039;. Locate &amp;lt;code&amp;gt;Grimwar.vertexsdk&amp;lt;/code&amp;gt; and its sibling &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; folders.&lt;br /&gt;
# Copy that SDK folder, with all its contents, to a folder you control outside Steam. This guide calls the copy &amp;lt;code&amp;gt;MyArena/GrimwarSDK/&amp;lt;/code&amp;gt;. Work in the copy from now on.&lt;br /&gt;
# Keep your Vertex maps separately, for example in &amp;lt;code&amp;gt;MyArena/Maps/&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In Unity Hub, add the existing project at &amp;lt;code&amp;gt;MyArena/GrimwarSDK/Compiler&amp;lt;/code&amp;gt; and open it with the pinned Unity version. Select &#039;&#039;&#039;Compiler&#039;&#039;&#039;, not its parent folder or its &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder. Let package resolution, script compilation, and asset imports finish.&lt;br /&gt;
# For Unity&#039;s scene and material previews, open &#039;&#039;&#039;Edit → Project Settings → Graphics&#039;&#039;&#039;. If &#039;&#039;&#039;Default Render Pipeline&#039;&#039;&#039; is empty, assign the supplied &amp;lt;code&amp;gt;Assets/VertexSdk/Rendering/Pipeline.asset&amp;lt;/code&amp;gt;. Keep the SDK&#039;s quality settings. See [https://docs.unity3d.com/6000.3/Documentation/Manual/srp-setting-render-pipeline-asset.html Unity&#039;s render pipeline settings].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; Unity&#039;s Project window shows &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;, including &amp;lt;code&amp;gt;CustomContent&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;VertexSdk&amp;lt;/code&amp;gt;. Resolve any Console errors before continuing. This is the SDK&#039;s asset-authoring and compiler project; playtest the map in Grimwar.&lt;br /&gt;
&lt;br /&gt;
The Steam installation and Vertex&#039;s generated compiler cache are replaceable. Neither is a place to keep your original work. Keep the SDK&#039;s supplied packages and base assets intact in your working copy.&lt;br /&gt;
&lt;br /&gt;
== 2. Create the content folders ==&lt;br /&gt;
&lt;br /&gt;
In Unity&#039;s &#039;&#039;&#039;Project&#039;&#039;&#039; window, expand &amp;lt;code&amp;gt;Assets/CustomContent&amp;lt;/code&amp;gt;. Right-click it and use &#039;&#039;&#039;Create → Folder&#039;&#039;&#039; to make &amp;lt;code&amp;gt;MyArena&amp;lt;/code&amp;gt;. Inside it, create &amp;lt;code&amp;gt;Textures&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Materials&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Models&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;Prefabs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
After completing the guide, your files will look like this. Unity also creates &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files beside assets and folders; keep those files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MyArena/&lt;br /&gt;
  Maps/&lt;br /&gt;
    my_arena.vertex&lt;br /&gt;
  GrimwarSDK/&lt;br /&gt;
    Grimwar.vertexsdk&lt;br /&gt;
    Authoring/&lt;br /&gt;
      Grimwar.vertexgame&lt;br /&gt;
      MyArena.vertexassets          exported catalog&lt;br /&gt;
      previews/                    generated catalog previews&lt;br /&gt;
    Compiler/                      open this folder in Unity Hub&lt;br /&gt;
      Assets/&lt;br /&gt;
        CustomContent/&lt;br /&gt;
          MyArena/&lt;br /&gt;
            MyArenaAssets.asset    catalog profile created in step 5&lt;br /&gt;
            Textures/&lt;br /&gt;
              BrickWall_BaseColor.png&lt;br /&gt;
              Crate_BaseColor.png&lt;br /&gt;
            Materials/&lt;br /&gt;
              BrickWall.mat&lt;br /&gt;
              Crate.mat&lt;br /&gt;
            Models/&lt;br /&gt;
              Crate.fbx&lt;br /&gt;
            Prefabs/&lt;br /&gt;
              Crate.prefab&lt;br /&gt;
        VertexSdk/                 supplied SDK assets&lt;br /&gt;
      Packages/&lt;br /&gt;
      ProjectSettings/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Assets/CustomContent/MyArena&amp;lt;/code&amp;gt; is the path &#039;&#039;&#039;inside Unity&#039;&#039;&#039;. &amp;lt;code&amp;gt;MyArena/GrimwarSDK/Compiler/Assets/CustomContent/MyArena&amp;lt;/code&amp;gt; is the same folder on disk. &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; is outside the Unity project&#039;s &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;texture&#039;&#039;&#039; is an image. A &#039;&#039;&#039;material&#039;&#039;&#039; combines a shader, textures, and surface settings. A &#039;&#039;&#039;model&#039;&#039;&#039; supplies meshes. A &#039;&#039;&#039;prefab&#039;&#039;&#039; saves a model&#039;s hierarchy, assigned materials, and components such as colliders. Vertex uses the material on a brush face and the model or prefab as a placed object.&lt;br /&gt;
&lt;br /&gt;
== 3. Create a wall material ==&lt;br /&gt;
&lt;br /&gt;
# Drag &amp;lt;code&amp;gt;BrickWall_BaseColor.png&amp;lt;/code&amp;gt; from your file manager into &amp;lt;code&amp;gt;Assets/CustomContent/MyArena/Textures&amp;lt;/code&amp;gt; in Unity&#039;s Project window. Wait for import to finish.&lt;br /&gt;
# Right-click the &amp;lt;code&amp;gt;Materials&amp;lt;/code&amp;gt; folder and choose &#039;&#039;&#039;Create → Material&#039;&#039;&#039;. Name it &amp;lt;code&amp;gt;BrickWall&amp;lt;/code&amp;gt;; Unity saves &amp;lt;code&amp;gt;BrickWall.mat&amp;lt;/code&amp;gt; there.&lt;br /&gt;
# Select the material. In the Inspector, set &#039;&#039;&#039;Shader&#039;&#039;&#039; to &#039;&#039;&#039;Universal Render Pipeline/Lit&#039;&#039;&#039;. Use &#039;&#039;&#039;Surface Type: Opaque&#039;&#039;&#039; for an ordinary solid wall.&lt;br /&gt;
# Drag the imported image into &#039;&#039;&#039;Base Map&#039;&#039;&#039; under Surface Inputs. Leave the adjacent color white to use the image&#039;s original colors.&lt;br /&gt;
# For a plain non-metallic wall, start with &#039;&#039;&#039;Metallic: 0&#039;&#039;&#039; and &#039;&#039;&#039;Smoothness: 0&#039;&#039;&#039;. Increase Smoothness only if you want a shinier surface. For a matte surface without specular shine, also disable &#039;&#039;&#039;Specular Highlights&#039;&#039;&#039; and &#039;&#039;&#039;Environment Reflections&#039;&#039;&#039; under Advanced Options.&lt;br /&gt;
# If you have a normal map, import it into &amp;lt;code&amp;gt;Textures&amp;lt;/code&amp;gt;, select that texture, set &#039;&#039;&#039;Texture Type: Normal map&#039;&#039;&#039;, and click &#039;&#039;&#039;Apply&#039;&#039;&#039;. Assign it to the material&#039;s &#039;&#039;&#039;Normal Map&#039;&#039;&#039; field. A normal map is optional.&lt;br /&gt;
# Save your project changes. The asset you will choose in Vertex is &#039;&#039;&#039;BrickWall&#039;&#039;&#039;, the material, rather than the raw PNG.&lt;br /&gt;
&lt;br /&gt;
Use an SDK-supported shader such as URP/Lit. A custom material can use that shader with your own textures and settings; add-on maps cannot bring arbitrary custom shaders or Shader Graph shaders from &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; &amp;lt;code&amp;gt;Materials/BrickWall.mat&amp;lt;/code&amp;gt; exists and its Base Map references your texture. Vertex&#039;s preview shows basic color and transparency; judge normal maps, reflections, and final lighting in the compiled game. For the remaining material controls, see [https://docs.unity3d.com/6000.3/Documentation/Manual/urp/lit-shader.html Unity&#039;s URP Lit reference].&lt;br /&gt;
&lt;br /&gt;
== 4. Import a model and save a prefab ==&lt;br /&gt;
&lt;br /&gt;
# Export a model such as &amp;lt;code&amp;gt;Crate.fbx&amp;lt;/code&amp;gt; from your modeling tool. Use metres, a deliberate pivot, and UVs for the material. Put its image files in your &amp;lt;code&amp;gt;Textures&amp;lt;/code&amp;gt; folder and the model in &amp;lt;code&amp;gt;Models&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Select &amp;lt;code&amp;gt;Crate.fbx&amp;lt;/code&amp;gt; in Unity&#039;s Project window. Check its import scale and orientation. Apply changed import settings. As a size check, compare it with a Unity cube, which is one unit across at scale 1; one Unity unit represents one metre here.&lt;br /&gt;
# Create &amp;lt;code&amp;gt;Materials/Crate.mat&amp;lt;/code&amp;gt; using the material steps above and its own Base Map. If the model already contains embedded materials, its &#039;&#039;&#039;Materials&#039;&#039;&#039; import tab can &#039;&#039;&#039;Extract Materials…&#039;&#039;&#039; into your &amp;lt;code&amp;gt;Materials&amp;lt;/code&amp;gt; folder. Check extracted materials&#039; shaders and texture assignments. See [https://docs.unity3d.com/6000.3/Documentation/Manual/FBXImporter-Materials.html Unity&#039;s model material settings].&lt;br /&gt;
# Drag &amp;lt;code&amp;gt;Crate.fbx&amp;lt;/code&amp;gt; from the Project window into a temporary scene. On each relevant Mesh Renderer, assign &amp;lt;code&amp;gt;Crate.mat&amp;lt;/code&amp;gt; to its &#039;&#039;&#039;Materials&#039;&#039;&#039; slots. For a model with several submeshes, assign the material for each slot.&lt;br /&gt;
# For a solid crate, add a &#039;&#039;&#039;Box Collider&#039;&#039;&#039; and adjust its Center and Size to fit. A renderer alone does not make an object solid. Keep the example a static prop; arbitrary custom C# components are not a substitute for supported Grimwar entities or map scripts.&lt;br /&gt;
# Name the scene object &amp;lt;code&amp;gt;Crate&amp;lt;/code&amp;gt;. Drag it from the &#039;&#039;&#039;Hierarchy&#039;&#039;&#039; into &amp;lt;code&amp;gt;Assets/CustomContent/MyArena/Prefabs&amp;lt;/code&amp;gt; in the &#039;&#039;&#039;Project&#039;&#039;&#039; window. If Unity asks whether to create an Original Prefab or Prefab Variant, choose &#039;&#039;&#039;Original Prefab&#039;&#039;&#039; for this example. This creates &amp;lt;code&amp;gt;Crate.prefab&amp;lt;/code&amp;gt;. See [https://docs.unity3d.com/6000.3/Documentation/Manual/CreatingPrefabs.html Unity&#039;s prefab creation guide].&lt;br /&gt;
# Select the saved prefab in the Project window and confirm it contains the renderer&#039;s material assignments and the collider. Later changes must be saved to this prefab, not left only on a scene instance.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; &amp;lt;code&amp;gt;Prefabs/Crate.prefab&amp;lt;/code&amp;gt; is the assembled prop you will place in Vertex. The raw &amp;lt;code&amp;gt;Models/Crate.fbx&amp;lt;/code&amp;gt; can also appear in the browser, but choosing it does not include overrides or colliders that you added only to the prefab.&lt;br /&gt;
&lt;br /&gt;
Keep the model, prefab, materials, and textures beneath &amp;lt;code&amp;gt;Assets/CustomContent/MyArena&amp;lt;/code&amp;gt;. To reuse a model&#039;s material on brush faces, use a separate &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt; file: embedded model materials are hidden from Vertex&#039;s material picker.&lt;br /&gt;
&lt;br /&gt;
== 5. Export a catalog for Vertex ==&lt;br /&gt;
&lt;br /&gt;
A catalog tells Vertex which assets exist and provides their previews. The original Unity assets remain in &amp;lt;code&amp;gt;Compiler/Assets&amp;lt;/code&amp;gt; for the map compiler to use.&lt;br /&gt;
&lt;br /&gt;
# In the Project window, right-click &amp;lt;code&amp;gt;Assets/CustomContent/MyArena&amp;lt;/code&amp;gt; and choose &#039;&#039;&#039;Create → Vertex → Asset catalog profile&#039;&#039;&#039;. Name the asset &amp;lt;code&amp;gt;MyArenaAssets&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Select it and set &#039;&#039;&#039;Catalog Id&#039;&#039;&#039; to &amp;lt;code&amp;gt;my_arena.assets&amp;lt;/code&amp;gt; and &#039;&#039;&#039;Catalog Version&#039;&#039;&#039; to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. Keep these values stable as you edit this asset library.&lt;br /&gt;
# Expand &#039;&#039;&#039;Folders&#039;&#039;&#039; in the Inspector and add one element. Set that element&#039;s &#039;&#039;&#039;Folder&#039;&#039;&#039; to &amp;lt;code&amp;gt;Assets/CustomContent/MyArena&amp;lt;/code&amp;gt; and &#039;&#039;&#039;Ownership&#039;&#039;&#039; to &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Enable &#039;&#039;&#039;Materials&#039;&#039;&#039;, &#039;&#039;&#039;Models&#039;&#039;&#039;, &#039;&#039;&#039;Prefabs&#039;&#039;&#039;, and &#039;&#039;&#039;Textures&#039;&#039;&#039; for that element. Leave &#039;&#039;&#039;Material Dependencies Only&#039;&#039;&#039; disabled so your standalone materials appear in the picker. Leave the other settings at their defaults.&lt;br /&gt;
# Save the project. With &amp;lt;code&amp;gt;MyArenaAssets&amp;lt;/code&amp;gt; still selected, choose &#039;&#039;&#039;Tools → Vertex → Export Selected Asset Catalog&#039;&#039;&#039;.&lt;br /&gt;
# In the save dialog, navigate out of &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; to your copy&#039;s &amp;lt;code&amp;gt;Authoring&amp;lt;/code&amp;gt; folder. Save as &amp;lt;code&amp;gt;MyArena.vertexassets&amp;lt;/code&amp;gt;. The exporter also writes a &amp;lt;code&amp;gt;previews&amp;lt;/code&amp;gt; folder beside it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; Both &amp;lt;code&amp;gt;GrimwarSDK/Authoring/MyArena.vertexassets&amp;lt;/code&amp;gt; and its preview files exist. Keep the catalog and previews together. Do not replace the supplied &amp;lt;code&amp;gt;Assets/VertexSdk/Assets.asset&amp;lt;/code&amp;gt; profile or the base-game catalog.&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt; ownership for your own files. &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; means the asset already ships with Grimwar; it does not mean “shared between my maps.” Incorrectly marking a new asset as base prevents the map from carrying the asset players need. You do not need to add your files to the base game&#039;s Addressables groups.&lt;br /&gt;
&lt;br /&gt;
== 6. Connect the working copy ==&lt;br /&gt;
&lt;br /&gt;
This is a one-time setup for this SDK copy. Two small JSON edits connect its editable Unity project and exported catalog. Use a plain-text editor, preserve the other fields, and keep the original files as backups outside the Unity &amp;lt;code&amp;gt;Assets&amp;lt;/code&amp;gt; folder.&lt;br /&gt;
&lt;br /&gt;
=== Tell Vertex to build from your Unity project ===&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;MyArena/GrimwarSDK/Grimwar.vertexsdk&amp;lt;/code&amp;gt; in a text editor.&lt;br /&gt;
&lt;br /&gt;
# Keep &amp;lt;code&amp;gt;&amp;quot;compilerProject&amp;quot;: &amp;quot;Compiler&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Remove the &amp;lt;code&amp;gt;compilerInputs&amp;lt;/code&amp;gt; property and its value. That inventory describes the unmodified distributed SDK.&lt;br /&gt;
# Add &amp;lt;code&amp;gt;&amp;quot;editorProject&amp;quot;: &amp;quot;Compiler&amp;quot;&amp;lt;/code&amp;gt; alongside &amp;lt;code&amp;gt;compilerProject&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Preserve &amp;lt;code&amp;gt;formatVersion&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;game&amp;lt;/code&amp;gt;, and any &amp;lt;code&amp;gt;resourceTools&amp;lt;/code&amp;gt; entries exactly as supplied. Separate neighboring properties with commas and leave no trailing comma before &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The two project properties should now read as follows. This fragment shows only those properties; &#039;&#039;&#039;do not replace the whole file&#039;&#039;&#039; with it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;compilerProject&amp;quot;: &amp;quot;Compiler&amp;quot;,&lt;br /&gt;
  &amp;quot;editorProject&amp;quot;: &amp;quot;Compiler&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This makes the copy a local developer connection: Vertex captures the saved assets from your &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; project when building. Leaving the distributed connection unchanged would use its prepared compiler cache instead.&lt;br /&gt;
&lt;br /&gt;
=== Add your catalog to the game&#039;s asset list ===&lt;br /&gt;
&lt;br /&gt;
Open &amp;lt;code&amp;gt;MyArena/GrimwarSDK/Authoring/Grimwar.vertexgame&amp;lt;/code&amp;gt;. Find the &amp;lt;code&amp;gt;assetCatalogs&amp;lt;/code&amp;gt; array. Keep every existing entry, including &amp;lt;code&amp;gt;grimwar.base&amp;lt;/code&amp;gt;. Add a comma after its last existing entry, then insert this additional object before the array&#039;s closing &amp;lt;code&amp;gt;]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;my_arena.assets&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
  &amp;quot;path&amp;quot;: &amp;quot;MyArena.vertexassets&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The path is relative to &amp;lt;code&amp;gt;Authoring/Grimwar.vertexgame&amp;lt;/code&amp;gt;, so do not prepend &amp;lt;code&amp;gt;Authoring/&amp;lt;/code&amp;gt; again. Keep the game&#039;s ID, version, entity catalogs, and build configuration unchanged. The new entry&#039;s ID and version must match the Unity catalog profile from step 5.&lt;br /&gt;
&lt;br /&gt;
=== Choose this connection in Vertex ===&lt;br /&gt;
&lt;br /&gt;
# Save both JSON files and your Unity asset changes. Let Unity finish importing.&lt;br /&gt;
# Open your map in Vertex. Under &#039;&#039;&#039;Settings → Game and resources&#039;&#039;&#039;, select &#039;&#039;&#039;Choose game SDK…&#039;&#039;&#039;. Choose &amp;lt;code&amp;gt;MyArena/GrimwarSDK/Grimwar.vertexsdk&amp;lt;/code&amp;gt;, the file in your personal copy. &#039;&#039;&#039;File → Open game SDK…&#039;&#039;&#039; opens the same chooser.&lt;br /&gt;
# Save the map. Saved maps remember their own SDK connection, so repeat the chooser step for an existing map that still uses the Steam SDK.&lt;br /&gt;
# Use &#039;&#039;&#039;Settings → Game and resources → Reload resources&#039;&#039;&#039; after subsequent catalog exports.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Checkpoint:&#039;&#039;&#039; The material browser contains &amp;lt;code&amp;gt;BrickWall&amp;lt;/code&amp;gt; and the model browser contains your crate entries. Base-game materials and entities should still be available. If the base assets disappear, restore the original entries in &amp;lt;code&amp;gt;assetCatalogs&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Do not use &#039;&#039;&#039;Load engine assets…&#039;&#039;&#039; as a substitute for this setup. Loading a loose preview catalog does not connect a map&#039;s compiler to the Unity source assets.&lt;br /&gt;
&lt;br /&gt;
== 7. Use the assets and test the add-on ==&lt;br /&gt;
&lt;br /&gt;
# In Vertex&#039;s material browser, search for &amp;lt;code&amp;gt;BrickWall&amp;lt;/code&amp;gt;. Drag it onto a brush face; hold &#039;&#039;&#039;Shift&#039;&#039;&#039; while dropping to apply it to the whole brush. Adjust the face&#039;s texture scale and alignment as needed.&lt;br /&gt;
# In the model browser, search for &amp;lt;code&amp;gt;Crate&amp;lt;/code&amp;gt;. Choose the entry whose source is &amp;lt;code&amp;gt;Prefabs/Crate.prefab&amp;lt;/code&amp;gt; and drag it into a viewport. Place it, then check its size and orientation.&lt;br /&gt;
# Save the map. In Build, select &#039;&#039;&#039;Preview&#039;&#039;&#039; and your desktop platform, then &#039;&#039;&#039;Play in Game&#039;&#039;&#039;. If requested, select the pinned Unity executable and your Grimwar installation in the build settings.&lt;br /&gt;
# Walk around the crate in Grimwar to check collision. Inspect the wall&#039;s tiling, material, and lighting. Test the actual game even when the Vertex preview looks correct.&lt;br /&gt;
# When ready, use &#039;&#039;&#039;Export add-on&#039;&#039;&#039; with the Release profile and follow [[Grimwar/Steam Workshop addons|the publication guide]].&lt;br /&gt;
&lt;br /&gt;
The build includes referenced custom Unity assets and their required custom dependencies. The exported catalog is a browser index, not an installable add-on; distribute the built add-on rather than loose &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.prefab&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;.vertexassets&amp;lt;/code&amp;gt; files. Players do not need your Unity project to play the compiled map.&lt;br /&gt;
&lt;br /&gt;
Grimwar&#039;s SDK still uses &#039;&#039;&#039;Play in Game&#039;&#039;&#039; and &#039;&#039;&#039;Export add-on&#039;&#039;&#039; with this connection. It does not provide the base game&#039;s playable Unity project or a &#039;&#039;&#039;Save to Unity&#039;&#039;&#039; workflow.&lt;br /&gt;
&lt;br /&gt;
== Updating assets, sharing source, and SDK updates ==&lt;br /&gt;
&lt;br /&gt;
For each edit: &#039;&#039;&#039;change the Unity asset → save/apply it → export MyArenaAssets to the same MyArena.vertexassets file → Reload resources in Vertex → rebuild and playtest&#039;&#039;&#039;. Editing only the PNG or prefab on disk does not refresh an already exported catalog. Changing a prefab instance in a temporary scene does not update the prefab until you apply or save those changes.&lt;br /&gt;
&lt;br /&gt;
Keep existing &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files and the catalog ID. Vertex references Unity assets by their GUID and local file ID, not just by filename. Move assets inside Unity when reorganizing; deleting and recreating an asset can break map references even if you reuse its name.&lt;br /&gt;
&lt;br /&gt;
To hand editable source to another creator, include the map and scripts, the custom asset folder with all &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files and its catalog profile, the catalog with its previews, and the connection setup for the matching SDK release. A &amp;lt;code&amp;gt;.vertex&amp;lt;/code&amp;gt; map alone does not contain these Unity source assets.&lt;br /&gt;
&lt;br /&gt;
Your personal SDK copy does not update when Steam updates. For a new SDK release, make a fresh working copy, transfer your custom folder with its &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files, repeat the connection edits on the newly supplied files, and re-export the catalog with the required Unity version. Keep the old working copy until your map builds and playtests successfully. Do not overwrite new SDK packages or the new game profile with old versions.&lt;br /&gt;
&lt;br /&gt;
Reusing this custom library across maps makes authoring convenient, but referenced custom assets are still packaged with each consuming map. The SDK&#039;s shared developer materials are already base-game assets. For reusable imported media distributed once as a separate dependency, see [[Grimwar/Custom content#Make a reusable media pack|media packs]]; the file importer there still accepts the formats listed on that page, not arbitrary Unity prefabs or materials.&lt;br /&gt;
&lt;br /&gt;
== If something is missing or wrong ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What you see !! What to check&lt;br /&gt;
|-&lt;br /&gt;
| Asset exists in Unity but is absent from Vertex || Confirm the file is under the catalog&#039;s folder rule, its type is enabled, and you exported the selected custom profile. Confirm the custom catalog entry is in the connected copy&#039;s &amp;lt;code&amp;gt;Authoring/Grimwar.vertexgame&amp;lt;/code&amp;gt;, then reload resources.&lt;br /&gt;
|-&lt;br /&gt;
| Model appears, but its material cannot be chosen for a brush || Extract or create a standalone &amp;lt;code&amp;gt;.mat&amp;lt;/code&amp;gt;. Embedded materials are hidden. Disable Material Dependencies Only on your custom folder rule and remove a &amp;lt;code&amp;gt;VertexHidden&amp;lt;/code&amp;gt; asset label if you intentionally added one.&lt;br /&gt;
|-&lt;br /&gt;
| Asset previews correctly, but the build says the asset or profile is missing || Check the map&#039;s chosen &amp;lt;code&amp;gt;.vertexsdk&amp;lt;/code&amp;gt;. Its local &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; project must contain both the original assets and &amp;lt;code&amp;gt;MyArenaAssets.asset&amp;lt;/code&amp;gt;. A copied catalog alone is insufficient. Check the &amp;lt;code&amp;gt;editorProject&amp;lt;/code&amp;gt; edit and preserve &amp;lt;code&amp;gt;.meta&amp;lt;/code&amp;gt; files.&lt;br /&gt;
|-&lt;br /&gt;
| Material is pink, gray, or missing a texture || Check the shader and renderer material slots in Unity, and confirm all texture references resolve. Use URP/Lit and check Unity&#039;s render pipeline assignment from step 1, then save, export, reload, and rebuild. A Vertex preview does not prove that an unsupported shader can run in the game.&lt;br /&gt;
|-&lt;br /&gt;
| Crate looks correct but the player walks through it || Check the saved prefab&#039;s enabled collider, the placed model&#039;s collision setting in Vertex, and whether you placed the prefab rather than the raw model. Test collision in Grimwar.&lt;br /&gt;
|-&lt;br /&gt;
| Crate is too large, too small, or rotated incorrectly || Correct the model import scale/orientation or the saved prefab transform in Unity. Apply, re-export, reload, and rebuild. Compare against a one-metre cube.&lt;br /&gt;
|-&lt;br /&gt;
| Connection fails after editing JSON || Check commas and brackets, preserve the supplied fields, and match the catalog&#039;s ID/version exactly. The catalog path is relative to the game profile; both project paths are relative to &amp;lt;code&amp;gt;Grimwar.vertexsdk&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Compiler setup reports unresolved packages or missing package-resolution data || Open the copied &amp;lt;code&amp;gt;Compiler&amp;lt;/code&amp;gt; project in the pinned Unity editor and let Package Manager and asset import finish successfully before building from Vertex.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Mapping]] [[Category:Addons]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=264</id>
		<title>Vertex/Editing</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=264"/>
		<updated>2026-10-03T02:40:49Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Document shared matte developer materials&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Build a small room and test its scale and collision in your game before adding detail. The active game profile sets the map&#039;s units; changing the connected profile does not rescale an existing map.&lt;br /&gt;
&lt;br /&gt;
== Move around and select ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;Z&amp;lt;/kbd&amp;gt;, then &amp;lt;kbd&amp;gt;WASD&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Q&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; || Enter free camera and move. Hold Shift to move faster; Escape exits.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;F&amp;lt;/kbd&amp;gt; || Frame the selection.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;1&amp;lt;/kbd&amp;gt;–&amp;lt;kbd&amp;gt;4&amp;lt;/kbd&amp;gt; / Space || Choose a view / maximize the view.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;S&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;G&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;T&amp;lt;/kbd&amp;gt; || Select / move / rotate / scale.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;V&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;H&amp;lt;/kbd&amp;gt; || Edit vertices / edges / faces.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;B&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+A&amp;lt;/kbd&amp;gt; || Draw / texture tools.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;[&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;]&amp;lt;/kbd&amp;gt; || Decrease / increase the grid size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;I&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+C&amp;lt;/kbd&amp;gt; || Isolate the selection / preview collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Shortcuts yield to text fields and free camera. Select an object before selecting its vertices, edges, or faces. Delete in a component tool removes those components; deleting in the hierarchy removes whole objects.&lt;br /&gt;
&lt;br /&gt;
Switch &#039;&#039;&#039;Global / Local&#039;&#039;&#039; above the views to choose transform axes. Local follows the active object or selected face. Numeric fields accept arithmetic, so you can enter a value such as &amp;lt;code&amp;gt;128*2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Draw geometry ==&lt;br /&gt;
&lt;br /&gt;
# Choose the draw tool and a shape.&lt;br /&gt;
# Set the grid and depth, then drag out the footprint.&lt;br /&gt;
# Apply the preview with Enter or &#039;&#039;&#039;Apply&#039;&#039;&#039;. Escape cancels.&lt;br /&gt;
# Use Move, Rotate, and Scale to position it. Keep large structural pieces on the grid.&lt;br /&gt;
&lt;br /&gt;
Drawing on an existing collider starts the new shape on that surface. Empty space uses the draw plane. Hold Shift while drawing for equal width, height, and depth. Stairs fit the drawn bounds; adjust their step count in the creation settings.&lt;br /&gt;
&lt;br /&gt;
Parametric shapes retain their settings. Use &#039;&#039;&#039;Convert to brush&#039;&#039;&#039; when you need to edit individual components. That conversion gives up the original shape controls.&lt;br /&gt;
&lt;br /&gt;
=== Geometry shortcuts ===&lt;br /&gt;
&lt;br /&gt;
The contextual bar above the viewports shows actions for the current tool and selection: Extrude and Inset for faces, Bevel for edges, Weld for vertices, and construction actions for objects. Each action has an icon and label, with its shortcut in the tooltip, and starts the same live adjustment as the keyboard. Unavailable actions stay disabled.&lt;br /&gt;
&lt;br /&gt;
Select faces, edges, or objects, press the operation&#039;s shortcut, then &#039;&#039;&#039;drag the +/− handle in any viewport&#039;&#039;&#039; or type a value. Release the mouse to pause; grab the handle in another view to continue the same preview. Moving between views does not change the amount. All views show the same value. &#039;&#039;&#039;Enter or a click in empty viewport space applies; Escape or right-click cancels.&#039;&#039;&#039; The entire operation, including drags in different views, is one Undo.&lt;br /&gt;
&lt;br /&gt;
Mouse adjustments snap to the grid. &#039;&#039;&#039;[ / ]&#039;&#039;&#039; changes the grid during an operation without leaving the preview or changing mouse sensitivity. Hold &#039;&#039;&#039;Shift&#039;&#039;&#039; for slower adjustment and a finer grid step, or &#039;&#039;&#039;Ctrl/Cmd&#039;&#039;&#039; to bypass snapping. Typed values and calculations such as &amp;lt;code&amp;gt;128/3&amp;lt;/code&amp;gt; stay exact. Backspace edits the input; clearing it returns to mouse adjustment. Invalid input must be corrected or canceled before applying.&lt;br /&gt;
&lt;br /&gt;
Every viewport shows a &#039;&#039;&#039;+/− adjustment gizmo&#039;&#039;&#039; that follows its view direction. Drag along the arrow to increase the amount, or back toward − to decrease it. Extrude and offset follow the face normal; inset points inward from a face edge. An axis viewed head-on, and operations without a single direction, use a horizontal guide. Movement across the guide does not change the amount.&lt;br /&gt;
&lt;br /&gt;
Mouse sensitivity follows the view&#039;s world scale, independently of grid spacing; copy counts use 10 pixels per copy. The pointer wraps at viewport edges while dragging and is free as soon as you release it. On desktops without pointer warping, release and re-grab the handle to continue.&lt;br /&gt;
&lt;br /&gt;
You can right-drag to orbit or pan, middle-drag to pan, scroll to zoom, frame the selection, and maximize or restore a viewport without ending the operation. &#039;&#039;&#039;Z&#039;&#039;&#039; enters free camera while keeping the preview and exact input. Mouse look and &#039;&#039;&#039;WASD/QE&#039;&#039;&#039; move the camera; &#039;&#039;&#039;Z or Escape&#039;&#039;&#039; returns to adjustment. Escape after leaving free camera cancels the operation. During bevel, scroll changes segments; &#039;&#039;&#039;Ctrl/Cmd+scroll&#039;&#039;&#039; zooms instead. Linear and radial copy shortcuts adjust the number of additional copies, using the configured spacing or angle.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Shortcut !! Operation&lt;br /&gt;
|-&lt;br /&gt;
| Shift+E / Alt+E || Extrude individual faces / extrude a region&lt;br /&gt;
|-&lt;br /&gt;
| Shift+I / Shift+B / Shift+H || Inset faces / bevel edges / hollow walls&lt;br /&gt;
|-&lt;br /&gt;
| Alt+F || Offset faces along their normals&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl/Cmd+J / Shift+S || Combine objects / subtract last selected&lt;br /&gt;
|-&lt;br /&gt;
| Shift+W / Shift+K || Weld vertices / connect vertices&lt;br /&gt;
|-&lt;br /&gt;
| Shift+X / Shift+D || Split edges / dissolve edges&lt;br /&gt;
|-&lt;br /&gt;
| Shift+F / Shift+J || Cap holes / bridge boundaries&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Delete / Alt+R || Delete selected faces / repair mesh seams&lt;br /&gt;
|-&lt;br /&gt;
| Alt+T / Alt+W || Convert a face to terrain / sew terrain patches&lt;br /&gt;
|-&lt;br /&gt;
| Shift+T / Alt+Shift+T || Sculpt terrain / toggle terrain and surface&lt;br /&gt;
|-&lt;br /&gt;
| Alt+B / Alt+Shift+B || Convert to brush / split into brushes&lt;br /&gt;
|-&lt;br /&gt;
| Alt+A || Create an editable array&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+A / Alt+Shift+R || Make linear / radial copies&lt;br /&gt;
|-&lt;br /&gt;
| Alt+M / Alt+Shift+M || Create symmetry / unlink selection&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+C / Alt+Shift+W || Clip at symmetry planes / weld independent symmetry&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+U || Remove all symmetry links&lt;br /&gt;
|-&lt;br /&gt;
| Alt+P / Alt+X / Alt+L || Pick pivot / use face axes / align to another face&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Commands without a numeric adjustment apply immediately; picking, alignment, and sculpting enter their existing tools. Shortcuts appear in the Geometry menu and inspector button tooltips. They only edit the map from the Level workspace, and yield to text fields and free camera.&lt;br /&gt;
&lt;br /&gt;
Press &#039;&#039;&#039;C&#039;&#039;&#039; to draw a clipping plane, then Enter to apply it. While clipping, &#039;&#039;&#039;Alt+C&#039;&#039;&#039; toggles Slice (keep both sides) and &#039;&#039;&#039;Alt+F&#039;&#039;&#039; flips the kept side, including an existing preview. Alt+Left/Right, Alt+Up/Down, and Alt+Page Up/Down flip the selection along the focused view&#039;s axes.&lt;br /&gt;
&lt;br /&gt;
You can still use the inspector. &#039;&#039;&#039;Enter in a construction numeric field&#039;&#039;&#039; creates and applies the operation directly. Changing a distance during an active preview updates that preview; Enter applies and Escape cancels. Enter in an open surface&#039;s extrusion field uses region extrusion. Preview buttons remain available when you want to inspect a result first.&lt;br /&gt;
&lt;br /&gt;
=== Doorways and windows ===&lt;br /&gt;
&lt;br /&gt;
For a doorway through a solid wall, place a box cutter through the wall, select the wall and then the cutter, and apply &#039;&#039;&#039;Subtract last selected&#039;&#039;&#039;. The operation removes the cutter.&lt;br /&gt;
&lt;br /&gt;
For a framed opening, use &#039;&#039;&#039;Inset faces&#039;&#039;&#039;, apply it, scale the selected inner face, and delete that face. A thick wall needs openings on both sides. &#039;&#039;&#039;Bridge boundaries&#039;&#039;&#039; joins compatible open rims to form the inside surfaces.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Auto&#039;&#039;&#039; or &#039;&#039;&#039;Exact&#039;&#039;&#039; collision for a wall with an opening. Box and Convex collision can fill that opening even when the rendered wall looks correct.&lt;br /&gt;
&lt;br /&gt;
== Materials, models, and prefabs ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Built-in&#039;&#039;&#039; material folder provides Developer Gray, Orange, Blue, White, and Red. These grid textures use matte materials without shine. Maps reference the game&#039;s shared developer materials instead of bundling their own copies. Existing compiled maps need rebuilding to replace the older embedded materials.&lt;br /&gt;
&lt;br /&gt;
Drag a material from &#039;&#039;&#039;Materials&#039;&#039;&#039; onto a face. Hold Shift during the drop to apply it to the whole brush. These drops preserve the existing UV alignment.&lt;br /&gt;
&lt;br /&gt;
In Texture mode, left-click samples a face&#039;s material and alignment; right-drag paints them. Adjust texture size and offsets in the inspector. Texture lock keeps the mapping attached while moving or resizing geometry.&lt;br /&gt;
&lt;br /&gt;
Drag models from &#039;&#039;&#039;Models&#039;&#039;&#039; into a view, or use &#039;&#039;&#039;Place at pivot&#039;&#039;&#039;. Game models retain references to the SDK assets. For your own models or textures, use [[Vertex/Content|Content import]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prefabs&#039;&#039;&#039; contains reusable assemblies supplied by the game. They can include geometry, models, entities, and scripts. Linked instances retain local changes when refreshed. &#039;&#039;&#039;Unpack&#039;&#039;&#039; removes the source link. Save your own selections with &#039;&#039;&#039;File → Save selection as prefab…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Terrain ==&lt;br /&gt;
&lt;br /&gt;
Select one four-sided face and press &#039;&#039;&#039;Alt+T&#039;&#039;&#039; (or choose &#039;&#039;&#039;Convert to terrain&#039;&#039;&#039;). Type the subdivision count and press Enter. The terrain replaces that brush with an open patch, so duplicate the brush first if you need to keep the solid.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Base texture&#039;&#039;&#039; and &#039;&#039;&#039;Paint texture&#039;&#039;&#039; in the Terrain inspector. &#039;&#039;&#039;Paint textures&#039;&#039;&#039; reveals the second texture; Shift erases back to the base. &#039;&#039;&#039;Sculpt terrain&#039;&#039;&#039; raises, lowers, or smooths the surface. Use enough subdivisions for the shape you need, and inspect collision after sculpting.&lt;br /&gt;
&lt;br /&gt;
In paint and sculpt modes, &#039;&#039;&#039;scroll up to enlarge the brush and down to shrink it&#039;&#039;&#039;. &#039;&#039;&#039;Shift+scroll&#039;&#039;&#039; adjusts strength; &#039;&#039;&#039;Ctrl/Cmd+scroll&#039;&#039;&#039; zooms the view. The brush outline and radius field update immediately. Changing brush settings does not paint or create an Undo step.&lt;br /&gt;
&lt;br /&gt;
== Collision and lighting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Collision&#039;&#039;&#039; section controls whether an object blocks movement, its collision shape, and its filters. Start with Auto. Use &#039;&#039;&#039;Create collision proxy&#039;&#039;&#039; when a simpler invisible shape would make movement smoother, such as a ramp over stairs. Creating a proxy disables the original collider; deleting the proxy does not restore it.&lt;br /&gt;
&lt;br /&gt;
Set the sun, sky, ambient light, and fog in &#039;&#039;&#039;Map Environment&#039;&#039;&#039;. Game SDKs decide which lighting and spatial bakes are required. Inspect the built map in the game: the Vertex viewport does not reproduce every game shader or baked lighting effect.&lt;br /&gt;
&lt;br /&gt;
== Entities and logic ==&lt;br /&gt;
&lt;br /&gt;
Choose an entity in the creation controls, place it, and edit its properties in the inspector. A point has a position and direction. A bounds entity defines a volume. A brush entity owns geometry placed under it in the hierarchy.&lt;br /&gt;
&lt;br /&gt;
Name entities before wiring them in [[Vertex/VSig|VSig]]. Game-specific reference pages explain their behavior; Grimwar&#039;s [[Grimwar/Entities|entity index]] covers every supplied type.&lt;br /&gt;
&lt;br /&gt;
== Validate and export ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;File → Validate map&#039;&#039;&#039; to find geometry, reference, asset, and collision problems. Validation reports problems without repairing the map.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export compiled meshes…&#039;&#039;&#039; writes &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; for engine import. &#039;&#039;&#039;Export selection as model…&#039;&#039;&#039; writes OBJ or FBX geometry for other tools. Model export does not carry game entities, engine model placements, or collision. Use the game&#039;s Build controls for a playable package.&lt;br /&gt;
&lt;br /&gt;
Hidden objects still export. Hide and isolate are editing aids; delete an object or change its output settings when it should not ship.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=263</id>
		<title>Vertex/Editing</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=263"/>
		<updated>2026-10-02T23:23:18Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Document free camera during geometry adjustments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Build a small room and test its scale and collision in your game before adding detail. The active game profile sets the map&#039;s units; changing the connected profile does not rescale an existing map.&lt;br /&gt;
&lt;br /&gt;
== Move around and select ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;Z&amp;lt;/kbd&amp;gt;, then &amp;lt;kbd&amp;gt;WASD&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Q&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; || Enter free camera and move. Hold Shift to move faster; Escape exits.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;F&amp;lt;/kbd&amp;gt; || Frame the selection.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;1&amp;lt;/kbd&amp;gt;–&amp;lt;kbd&amp;gt;4&amp;lt;/kbd&amp;gt; / Space || Choose a view / maximize the view.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;S&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;G&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;T&amp;lt;/kbd&amp;gt; || Select / move / rotate / scale.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;V&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;H&amp;lt;/kbd&amp;gt; || Edit vertices / edges / faces.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;B&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+A&amp;lt;/kbd&amp;gt; || Draw / texture tools.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;[&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;]&amp;lt;/kbd&amp;gt; || Decrease / increase the grid size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;I&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+C&amp;lt;/kbd&amp;gt; || Isolate the selection / preview collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Shortcuts yield to text fields and free camera. Select an object before selecting its vertices, edges, or faces. Delete in a component tool removes those components; deleting in the hierarchy removes whole objects.&lt;br /&gt;
&lt;br /&gt;
Switch &#039;&#039;&#039;Global / Local&#039;&#039;&#039; above the views to choose transform axes. Local follows the active object or selected face. Numeric fields accept arithmetic, so you can enter a value such as &amp;lt;code&amp;gt;128*2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Draw geometry ==&lt;br /&gt;
&lt;br /&gt;
# Choose the draw tool and a shape.&lt;br /&gt;
# Set the grid and depth, then drag out the footprint.&lt;br /&gt;
# Apply the preview with Enter or &#039;&#039;&#039;Apply&#039;&#039;&#039;. Escape cancels.&lt;br /&gt;
# Use Move, Rotate, and Scale to position it. Keep large structural pieces on the grid.&lt;br /&gt;
&lt;br /&gt;
Drawing on an existing collider starts the new shape on that surface. Empty space uses the draw plane. Hold Shift while drawing for equal width, height, and depth. Stairs fit the drawn bounds; adjust their step count in the creation settings.&lt;br /&gt;
&lt;br /&gt;
Parametric shapes retain their settings. Use &#039;&#039;&#039;Convert to brush&#039;&#039;&#039; when you need to edit individual components. That conversion gives up the original shape controls.&lt;br /&gt;
&lt;br /&gt;
=== Geometry shortcuts ===&lt;br /&gt;
&lt;br /&gt;
The contextual bar above the viewports shows actions for the current tool and selection: Extrude and Inset for faces, Bevel for edges, Weld for vertices, and construction actions for objects. Each action has an icon and label, with its shortcut in the tooltip, and starts the same live adjustment as the keyboard. Unavailable actions stay disabled.&lt;br /&gt;
&lt;br /&gt;
Select faces, edges, or objects, press the operation&#039;s shortcut, then &#039;&#039;&#039;drag the +/− handle in any viewport&#039;&#039;&#039; or type a value. Release the mouse to pause; grab the handle in another view to continue the same preview. Moving between views does not change the amount. All views show the same value. &#039;&#039;&#039;Enter or a click in empty viewport space applies; Escape or right-click cancels.&#039;&#039;&#039; The entire operation, including drags in different views, is one Undo.&lt;br /&gt;
&lt;br /&gt;
Mouse adjustments snap to the grid. &#039;&#039;&#039;[ / ]&#039;&#039;&#039; changes the grid during an operation without leaving the preview or changing mouse sensitivity. Hold &#039;&#039;&#039;Shift&#039;&#039;&#039; for slower adjustment and a finer grid step, or &#039;&#039;&#039;Ctrl/Cmd&#039;&#039;&#039; to bypass snapping. Typed values and calculations such as &amp;lt;code&amp;gt;128/3&amp;lt;/code&amp;gt; stay exact. Backspace edits the input; clearing it returns to mouse adjustment. Invalid input must be corrected or canceled before applying.&lt;br /&gt;
&lt;br /&gt;
Every viewport shows a &#039;&#039;&#039;+/− adjustment gizmo&#039;&#039;&#039; that follows its view direction. Drag along the arrow to increase the amount, or back toward − to decrease it. Extrude and offset follow the face normal; inset points inward from a face edge. An axis viewed head-on, and operations without a single direction, use a horizontal guide. Movement across the guide does not change the amount.&lt;br /&gt;
&lt;br /&gt;
Mouse sensitivity follows the view&#039;s world scale, independently of grid spacing; copy counts use 10 pixels per copy. The pointer wraps at viewport edges while dragging and is free as soon as you release it. On desktops without pointer warping, release and re-grab the handle to continue.&lt;br /&gt;
&lt;br /&gt;
You can right-drag to orbit or pan, middle-drag to pan, scroll to zoom, frame the selection, and maximize or restore a viewport without ending the operation. &#039;&#039;&#039;Z&#039;&#039;&#039; enters free camera while keeping the preview and exact input. Mouse look and &#039;&#039;&#039;WASD/QE&#039;&#039;&#039; move the camera; &#039;&#039;&#039;Z or Escape&#039;&#039;&#039; returns to adjustment. Escape after leaving free camera cancels the operation. During bevel, scroll changes segments; &#039;&#039;&#039;Ctrl/Cmd+scroll&#039;&#039;&#039; zooms instead. Linear and radial copy shortcuts adjust the number of additional copies, using the configured spacing or angle.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Shortcut !! Operation&lt;br /&gt;
|-&lt;br /&gt;
| Shift+E / Alt+E || Extrude individual faces / extrude a region&lt;br /&gt;
|-&lt;br /&gt;
| Shift+I / Shift+B / Shift+H || Inset faces / bevel edges / hollow walls&lt;br /&gt;
|-&lt;br /&gt;
| Alt+F || Offset faces along their normals&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl/Cmd+J / Shift+S || Combine objects / subtract last selected&lt;br /&gt;
|-&lt;br /&gt;
| Shift+W / Shift+K || Weld vertices / connect vertices&lt;br /&gt;
|-&lt;br /&gt;
| Shift+X / Shift+D || Split edges / dissolve edges&lt;br /&gt;
|-&lt;br /&gt;
| Shift+F / Shift+J || Cap holes / bridge boundaries&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Delete / Alt+R || Delete selected faces / repair mesh seams&lt;br /&gt;
|-&lt;br /&gt;
| Alt+T / Alt+W || Convert a face to terrain / sew terrain patches&lt;br /&gt;
|-&lt;br /&gt;
| Shift+T / Alt+Shift+T || Sculpt terrain / toggle terrain and surface&lt;br /&gt;
|-&lt;br /&gt;
| Alt+B / Alt+Shift+B || Convert to brush / split into brushes&lt;br /&gt;
|-&lt;br /&gt;
| Alt+A || Create an editable array&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+A / Alt+Shift+R || Make linear / radial copies&lt;br /&gt;
|-&lt;br /&gt;
| Alt+M / Alt+Shift+M || Create symmetry / unlink selection&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+C / Alt+Shift+W || Clip at symmetry planes / weld independent symmetry&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+U || Remove all symmetry links&lt;br /&gt;
|-&lt;br /&gt;
| Alt+P / Alt+X / Alt+L || Pick pivot / use face axes / align to another face&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Commands without a numeric adjustment apply immediately; picking, alignment, and sculpting enter their existing tools. Shortcuts appear in the Geometry menu and inspector button tooltips. They only edit the map from the Level workspace, and yield to text fields and free camera.&lt;br /&gt;
&lt;br /&gt;
Press &#039;&#039;&#039;C&#039;&#039;&#039; to draw a clipping plane, then Enter to apply it. While clipping, &#039;&#039;&#039;Alt+C&#039;&#039;&#039; toggles Slice (keep both sides) and &#039;&#039;&#039;Alt+F&#039;&#039;&#039; flips the kept side, including an existing preview. Alt+Left/Right, Alt+Up/Down, and Alt+Page Up/Down flip the selection along the focused view&#039;s axes.&lt;br /&gt;
&lt;br /&gt;
You can still use the inspector. &#039;&#039;&#039;Enter in a construction numeric field&#039;&#039;&#039; creates and applies the operation directly. Changing a distance during an active preview updates that preview; Enter applies and Escape cancels. Enter in an open surface&#039;s extrusion field uses region extrusion. Preview buttons remain available when you want to inspect a result first.&lt;br /&gt;
&lt;br /&gt;
=== Doorways and windows ===&lt;br /&gt;
&lt;br /&gt;
For a doorway through a solid wall, place a box cutter through the wall, select the wall and then the cutter, and apply &#039;&#039;&#039;Subtract last selected&#039;&#039;&#039;. The operation removes the cutter.&lt;br /&gt;
&lt;br /&gt;
For a framed opening, use &#039;&#039;&#039;Inset faces&#039;&#039;&#039;, apply it, scale the selected inner face, and delete that face. A thick wall needs openings on both sides. &#039;&#039;&#039;Bridge boundaries&#039;&#039;&#039; joins compatible open rims to form the inside surfaces.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Auto&#039;&#039;&#039; or &#039;&#039;&#039;Exact&#039;&#039;&#039; collision for a wall with an opening. Box and Convex collision can fill that opening even when the rendered wall looks correct.&lt;br /&gt;
&lt;br /&gt;
== Materials, models, and prefabs ==&lt;br /&gt;
&lt;br /&gt;
Drag a material from &#039;&#039;&#039;Materials&#039;&#039;&#039; onto a face. Hold Shift during the drop to apply it to the whole brush. These drops preserve the existing UV alignment.&lt;br /&gt;
&lt;br /&gt;
In Texture mode, left-click samples a face&#039;s material and alignment; right-drag paints them. Adjust texture size and offsets in the inspector. Texture lock keeps the mapping attached while moving or resizing geometry.&lt;br /&gt;
&lt;br /&gt;
Drag models from &#039;&#039;&#039;Models&#039;&#039;&#039; into a view, or use &#039;&#039;&#039;Place at pivot&#039;&#039;&#039;. Game models retain references to the SDK assets. For your own models or textures, use [[Vertex/Content|Content import]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prefabs&#039;&#039;&#039; contains reusable assemblies supplied by the game. They can include geometry, models, entities, and scripts. Linked instances retain local changes when refreshed. &#039;&#039;&#039;Unpack&#039;&#039;&#039; removes the source link. Save your own selections with &#039;&#039;&#039;File → Save selection as prefab…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Terrain ==&lt;br /&gt;
&lt;br /&gt;
Select one four-sided face and press &#039;&#039;&#039;Alt+T&#039;&#039;&#039; (or choose &#039;&#039;&#039;Convert to terrain&#039;&#039;&#039;). Type the subdivision count and press Enter. The terrain replaces that brush with an open patch, so duplicate the brush first if you need to keep the solid.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Base texture&#039;&#039;&#039; and &#039;&#039;&#039;Paint texture&#039;&#039;&#039; in the Terrain inspector. &#039;&#039;&#039;Paint textures&#039;&#039;&#039; reveals the second texture; Shift erases back to the base. &#039;&#039;&#039;Sculpt terrain&#039;&#039;&#039; raises, lowers, or smooths the surface. Use enough subdivisions for the shape you need, and inspect collision after sculpting.&lt;br /&gt;
&lt;br /&gt;
In paint and sculpt modes, &#039;&#039;&#039;scroll up to enlarge the brush and down to shrink it&#039;&#039;&#039;. &#039;&#039;&#039;Shift+scroll&#039;&#039;&#039; adjusts strength; &#039;&#039;&#039;Ctrl/Cmd+scroll&#039;&#039;&#039; zooms the view. The brush outline and radius field update immediately. Changing brush settings does not paint or create an Undo step.&lt;br /&gt;
&lt;br /&gt;
== Collision and lighting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Collision&#039;&#039;&#039; section controls whether an object blocks movement, its collision shape, and its filters. Start with Auto. Use &#039;&#039;&#039;Create collision proxy&#039;&#039;&#039; when a simpler invisible shape would make movement smoother, such as a ramp over stairs. Creating a proxy disables the original collider; deleting the proxy does not restore it.&lt;br /&gt;
&lt;br /&gt;
Set the sun, sky, ambient light, and fog in &#039;&#039;&#039;Map Environment&#039;&#039;&#039;. Game SDKs decide which lighting and spatial bakes are required. Inspect the built map in the game: the Vertex viewport does not reproduce every game shader or baked lighting effect.&lt;br /&gt;
&lt;br /&gt;
== Entities and logic ==&lt;br /&gt;
&lt;br /&gt;
Choose an entity in the creation controls, place it, and edit its properties in the inspector. A point has a position and direction. A bounds entity defines a volume. A brush entity owns geometry placed under it in the hierarchy.&lt;br /&gt;
&lt;br /&gt;
Name entities before wiring them in [[Vertex/VSig|VSig]]. Game-specific reference pages explain their behavior; Grimwar&#039;s [[Grimwar/Entities|entity index]] covers every supplied type.&lt;br /&gt;
&lt;br /&gt;
== Validate and export ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;File → Validate map&#039;&#039;&#039; to find geometry, reference, asset, and collision problems. Validation reports problems without repairing the map.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export compiled meshes…&#039;&#039;&#039; writes &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; for engine import. &#039;&#039;&#039;Export selection as model…&#039;&#039;&#039; writes OBJ or FBX geometry for other tools. Model export does not carry game entities, engine model placements, or collision. Use the game&#039;s Build controls for a playable package.&lt;br /&gt;
&lt;br /&gt;
Hidden objects still export. Hide and isolate are editing aids; delete an object or change its output settings when it should not ship.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=262</id>
		<title>Vertex/Editing</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=262"/>
		<updated>2026-10-02T23:04:18Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Document shared geometry handles and adjustment across viewports&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Build a small room and test its scale and collision in your game before adding detail. The active game profile sets the map&#039;s units; changing the connected profile does not rescale an existing map.&lt;br /&gt;
&lt;br /&gt;
== Move around and select ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;Z&amp;lt;/kbd&amp;gt;, then &amp;lt;kbd&amp;gt;WASD&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Q&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; || Enter free camera and move. Hold Shift to move faster; Escape exits.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;F&amp;lt;/kbd&amp;gt; || Frame the selection.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;1&amp;lt;/kbd&amp;gt;–&amp;lt;kbd&amp;gt;4&amp;lt;/kbd&amp;gt; / Space || Choose a view / maximize the view.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;S&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;G&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;T&amp;lt;/kbd&amp;gt; || Select / move / rotate / scale.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;V&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;H&amp;lt;/kbd&amp;gt; || Edit vertices / edges / faces.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;B&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+A&amp;lt;/kbd&amp;gt; || Draw / texture tools.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;[&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;]&amp;lt;/kbd&amp;gt; || Decrease / increase the grid size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;I&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+C&amp;lt;/kbd&amp;gt; || Isolate the selection / preview collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Shortcuts yield to text fields and free camera. Select an object before selecting its vertices, edges, or faces. Delete in a component tool removes those components; deleting in the hierarchy removes whole objects.&lt;br /&gt;
&lt;br /&gt;
Switch &#039;&#039;&#039;Global / Local&#039;&#039;&#039; above the views to choose transform axes. Local follows the active object or selected face. Numeric fields accept arithmetic, so you can enter a value such as &amp;lt;code&amp;gt;128*2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Draw geometry ==&lt;br /&gt;
&lt;br /&gt;
# Choose the draw tool and a shape.&lt;br /&gt;
# Set the grid and depth, then drag out the footprint.&lt;br /&gt;
# Apply the preview with Enter or &#039;&#039;&#039;Apply&#039;&#039;&#039;. Escape cancels.&lt;br /&gt;
# Use Move, Rotate, and Scale to position it. Keep large structural pieces on the grid.&lt;br /&gt;
&lt;br /&gt;
Drawing on an existing collider starts the new shape on that surface. Empty space uses the draw plane. Hold Shift while drawing for equal width, height, and depth. Stairs fit the drawn bounds; adjust their step count in the creation settings.&lt;br /&gt;
&lt;br /&gt;
Parametric shapes retain their settings. Use &#039;&#039;&#039;Convert to brush&#039;&#039;&#039; when you need to edit individual components. That conversion gives up the original shape controls.&lt;br /&gt;
&lt;br /&gt;
=== Geometry shortcuts ===&lt;br /&gt;
&lt;br /&gt;
The contextual bar above the viewports shows actions for the current tool and selection: Extrude and Inset for faces, Bevel for edges, Weld for vertices, and construction actions for objects. Each action has an icon and label, with its shortcut in the tooltip, and starts the same live adjustment as the keyboard. Unavailable actions stay disabled.&lt;br /&gt;
&lt;br /&gt;
Select faces, edges, or objects, press the operation&#039;s shortcut, then &#039;&#039;&#039;drag the +/− handle in any viewport&#039;&#039;&#039; or type a value. Release the mouse to pause; grab the handle in another view to continue the same preview. Moving between views does not change the amount. All views show the same value. &#039;&#039;&#039;Enter or a click in empty viewport space applies; Escape or right-click cancels.&#039;&#039;&#039; The entire operation, including drags in different views, is one Undo.&lt;br /&gt;
&lt;br /&gt;
Mouse adjustments snap to the grid. &#039;&#039;&#039;[ / ]&#039;&#039;&#039; changes the grid during an operation without leaving the preview or changing mouse sensitivity. Hold &#039;&#039;&#039;Shift&#039;&#039;&#039; for slower adjustment and a finer grid step, or &#039;&#039;&#039;Ctrl/Cmd&#039;&#039;&#039; to bypass snapping. Typed values and calculations such as &amp;lt;code&amp;gt;128/3&amp;lt;/code&amp;gt; stay exact. Backspace edits the input; clearing it returns to mouse adjustment. Invalid input must be corrected or canceled before applying.&lt;br /&gt;
&lt;br /&gt;
Every viewport shows a &#039;&#039;&#039;+/− adjustment gizmo&#039;&#039;&#039; that follows its view direction. Drag along the arrow to increase the amount, or back toward − to decrease it. Extrude and offset follow the face normal; inset points inward from a face edge. An axis viewed head-on, and operations without a single direction, use a horizontal guide. Movement across the guide does not change the amount.&lt;br /&gt;
&lt;br /&gt;
Mouse sensitivity follows the view&#039;s world scale, independently of grid spacing; copy counts use 10 pixels per copy. The pointer wraps at viewport edges while dragging and is free as soon as you release it. On desktops without pointer warping, release and re-grab the handle to continue.&lt;br /&gt;
&lt;br /&gt;
You can right-drag to orbit or pan, middle-drag to pan, scroll to zoom, frame the selection, and maximize or restore a viewport without ending the operation. During bevel, scroll changes segments; &#039;&#039;&#039;Ctrl/Cmd+scroll&#039;&#039;&#039; zooms instead. Linear and radial copy shortcuts adjust the number of additional copies, using the configured spacing or angle.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Shortcut !! Operation&lt;br /&gt;
|-&lt;br /&gt;
| Shift+E / Alt+E || Extrude individual faces / extrude a region&lt;br /&gt;
|-&lt;br /&gt;
| Shift+I / Shift+B / Shift+H || Inset faces / bevel edges / hollow walls&lt;br /&gt;
|-&lt;br /&gt;
| Alt+F || Offset faces along their normals&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl/Cmd+J / Shift+S || Combine objects / subtract last selected&lt;br /&gt;
|-&lt;br /&gt;
| Shift+W / Shift+K || Weld vertices / connect vertices&lt;br /&gt;
|-&lt;br /&gt;
| Shift+X / Shift+D || Split edges / dissolve edges&lt;br /&gt;
|-&lt;br /&gt;
| Shift+F / Shift+J || Cap holes / bridge boundaries&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Delete / Alt+R || Delete selected faces / repair mesh seams&lt;br /&gt;
|-&lt;br /&gt;
| Alt+T / Alt+W || Convert a face to terrain / sew terrain patches&lt;br /&gt;
|-&lt;br /&gt;
| Shift+T / Alt+Shift+T || Sculpt terrain / toggle terrain and surface&lt;br /&gt;
|-&lt;br /&gt;
| Alt+B / Alt+Shift+B || Convert to brush / split into brushes&lt;br /&gt;
|-&lt;br /&gt;
| Alt+A || Create an editable array&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+A / Alt+Shift+R || Make linear / radial copies&lt;br /&gt;
|-&lt;br /&gt;
| Alt+M / Alt+Shift+M || Create symmetry / unlink selection&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+C / Alt+Shift+W || Clip at symmetry planes / weld independent symmetry&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+U || Remove all symmetry links&lt;br /&gt;
|-&lt;br /&gt;
| Alt+P / Alt+X / Alt+L || Pick pivot / use face axes / align to another face&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Commands without a numeric adjustment apply immediately; picking, alignment, and sculpting enter their existing tools. Shortcuts appear in the Geometry menu and inspector button tooltips. They only edit the map from the Level workspace, and yield to text fields and free camera.&lt;br /&gt;
&lt;br /&gt;
Press &#039;&#039;&#039;C&#039;&#039;&#039; to draw a clipping plane, then Enter to apply it. While clipping, &#039;&#039;&#039;Alt+C&#039;&#039;&#039; toggles Slice (keep both sides) and &#039;&#039;&#039;Alt+F&#039;&#039;&#039; flips the kept side, including an existing preview. Alt+Left/Right, Alt+Up/Down, and Alt+Page Up/Down flip the selection along the focused view&#039;s axes.&lt;br /&gt;
&lt;br /&gt;
You can still use the inspector. &#039;&#039;&#039;Enter in a construction numeric field&#039;&#039;&#039; creates and applies the operation directly. Changing a distance during an active preview updates that preview; Enter applies and Escape cancels. Enter in an open surface&#039;s extrusion field uses region extrusion. Preview buttons remain available when you want to inspect a result first.&lt;br /&gt;
&lt;br /&gt;
=== Doorways and windows ===&lt;br /&gt;
&lt;br /&gt;
For a doorway through a solid wall, place a box cutter through the wall, select the wall and then the cutter, and apply &#039;&#039;&#039;Subtract last selected&#039;&#039;&#039;. The operation removes the cutter.&lt;br /&gt;
&lt;br /&gt;
For a framed opening, use &#039;&#039;&#039;Inset faces&#039;&#039;&#039;, apply it, scale the selected inner face, and delete that face. A thick wall needs openings on both sides. &#039;&#039;&#039;Bridge boundaries&#039;&#039;&#039; joins compatible open rims to form the inside surfaces.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Auto&#039;&#039;&#039; or &#039;&#039;&#039;Exact&#039;&#039;&#039; collision for a wall with an opening. Box and Convex collision can fill that opening even when the rendered wall looks correct.&lt;br /&gt;
&lt;br /&gt;
== Materials, models, and prefabs ==&lt;br /&gt;
&lt;br /&gt;
Drag a material from &#039;&#039;&#039;Materials&#039;&#039;&#039; onto a face. Hold Shift during the drop to apply it to the whole brush. These drops preserve the existing UV alignment.&lt;br /&gt;
&lt;br /&gt;
In Texture mode, left-click samples a face&#039;s material and alignment; right-drag paints them. Adjust texture size and offsets in the inspector. Texture lock keeps the mapping attached while moving or resizing geometry.&lt;br /&gt;
&lt;br /&gt;
Drag models from &#039;&#039;&#039;Models&#039;&#039;&#039; into a view, or use &#039;&#039;&#039;Place at pivot&#039;&#039;&#039;. Game models retain references to the SDK assets. For your own models or textures, use [[Vertex/Content|Content import]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prefabs&#039;&#039;&#039; contains reusable assemblies supplied by the game. They can include geometry, models, entities, and scripts. Linked instances retain local changes when refreshed. &#039;&#039;&#039;Unpack&#039;&#039;&#039; removes the source link. Save your own selections with &#039;&#039;&#039;File → Save selection as prefab…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Terrain ==&lt;br /&gt;
&lt;br /&gt;
Select one four-sided face and press &#039;&#039;&#039;Alt+T&#039;&#039;&#039; (or choose &#039;&#039;&#039;Convert to terrain&#039;&#039;&#039;). Type the subdivision count and press Enter. The terrain replaces that brush with an open patch, so duplicate the brush first if you need to keep the solid.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Base texture&#039;&#039;&#039; and &#039;&#039;&#039;Paint texture&#039;&#039;&#039; in the Terrain inspector. &#039;&#039;&#039;Paint textures&#039;&#039;&#039; reveals the second texture; Shift erases back to the base. &#039;&#039;&#039;Sculpt terrain&#039;&#039;&#039; raises, lowers, or smooths the surface. Use enough subdivisions for the shape you need, and inspect collision after sculpting.&lt;br /&gt;
&lt;br /&gt;
In paint and sculpt modes, &#039;&#039;&#039;scroll up to enlarge the brush and down to shrink it&#039;&#039;&#039;. &#039;&#039;&#039;Shift+scroll&#039;&#039;&#039; adjusts strength; &#039;&#039;&#039;Ctrl/Cmd+scroll&#039;&#039;&#039; zooms the view. The brush outline and radius field update immediately. Changing brush settings does not paint or create an Undo step.&lt;br /&gt;
&lt;br /&gt;
== Collision and lighting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Collision&#039;&#039;&#039; section controls whether an object blocks movement, its collision shape, and its filters. Start with Auto. Use &#039;&#039;&#039;Create collision proxy&#039;&#039;&#039; when a simpler invisible shape would make movement smoother, such as a ramp over stairs. Creating a proxy disables the original collider; deleting the proxy does not restore it.&lt;br /&gt;
&lt;br /&gt;
Set the sun, sky, ambient light, and fog in &#039;&#039;&#039;Map Environment&#039;&#039;&#039;. Game SDKs decide which lighting and spatial bakes are required. Inspect the built map in the game: the Vertex viewport does not reproduce every game shader or baked lighting effect.&lt;br /&gt;
&lt;br /&gt;
== Entities and logic ==&lt;br /&gt;
&lt;br /&gt;
Choose an entity in the creation controls, place it, and edit its properties in the inspector. A point has a position and direction. A bounds entity defines a volume. A brush entity owns geometry placed under it in the hierarchy.&lt;br /&gt;
&lt;br /&gt;
Name entities before wiring them in [[Vertex/VSig|VSig]]. Game-specific reference pages explain their behavior; Grimwar&#039;s [[Grimwar/Entities|entity index]] covers every supplied type.&lt;br /&gt;
&lt;br /&gt;
== Validate and export ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;File → Validate map&#039;&#039;&#039; to find geometry, reference, asset, and collision problems. Validation reports problems without repairing the map.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export compiled meshes…&#039;&#039;&#039; writes &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; for engine import. &#039;&#039;&#039;Export selection as model…&#039;&#039;&#039; writes OBJ or FBX geometry for other tools. Model export does not carry game entities, engine model placements, or collision. Use the game&#039;s Build controls for a playable package.&lt;br /&gt;
&lt;br /&gt;
Hidden objects still export. Hide and isolate are editing aids; delete an object or change its output settings when it should not ship.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=261</id>
		<title>Vertex/Editing</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=261"/>
		<updated>2026-10-02T22:23:17Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Document geometry gizmos, pointer wrapping and grid shortcuts during adjustment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Build a small room and test its scale and collision in your game before adding detail. The active game profile sets the map&#039;s units; changing the connected profile does not rescale an existing map.&lt;br /&gt;
&lt;br /&gt;
== Move around and select ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;Z&amp;lt;/kbd&amp;gt;, then &amp;lt;kbd&amp;gt;WASD&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Q&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; || Enter free camera and move. Hold Shift to move faster; Escape exits.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;F&amp;lt;/kbd&amp;gt; || Frame the selection.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;1&amp;lt;/kbd&amp;gt;–&amp;lt;kbd&amp;gt;4&amp;lt;/kbd&amp;gt; / Space || Choose a view / maximize the view.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;S&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;G&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;T&amp;lt;/kbd&amp;gt; || Select / move / rotate / scale.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;V&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;H&amp;lt;/kbd&amp;gt; || Edit vertices / edges / faces.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;B&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+A&amp;lt;/kbd&amp;gt; || Draw / texture tools.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;[&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;]&amp;lt;/kbd&amp;gt; || Decrease / increase the grid size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;I&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+C&amp;lt;/kbd&amp;gt; || Isolate the selection / preview collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Shortcuts yield to text fields and free camera. Select an object before selecting its vertices, edges, or faces. Delete in a component tool removes those components; deleting in the hierarchy removes whole objects.&lt;br /&gt;
&lt;br /&gt;
Switch &#039;&#039;&#039;Global / Local&#039;&#039;&#039; above the views to choose transform axes. Local follows the active object or selected face. Numeric fields accept arithmetic, so you can enter a value such as &amp;lt;code&amp;gt;128*2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Draw geometry ==&lt;br /&gt;
&lt;br /&gt;
# Choose the draw tool and a shape.&lt;br /&gt;
# Set the grid and depth, then drag out the footprint.&lt;br /&gt;
# Apply the preview with Enter or &#039;&#039;&#039;Apply&#039;&#039;&#039;. Escape cancels.&lt;br /&gt;
# Use Move, Rotate, and Scale to position it. Keep large structural pieces on the grid.&lt;br /&gt;
&lt;br /&gt;
Drawing on an existing collider starts the new shape on that surface. Empty space uses the draw plane. Hold Shift while drawing for equal width, height, and depth. Stairs fit the drawn bounds; adjust their step count in the creation settings.&lt;br /&gt;
&lt;br /&gt;
Parametric shapes retain their settings. Use &#039;&#039;&#039;Convert to brush&#039;&#039;&#039; when you need to edit individual components. That conversion gives up the original shape controls.&lt;br /&gt;
&lt;br /&gt;
=== Geometry shortcuts ===&lt;br /&gt;
&lt;br /&gt;
The contextual bar above the viewports shows actions for the current tool and selection: Extrude and Inset for faces, Bevel for edges, Weld for vertices, and construction actions for objects. Each action has an icon and label, with its shortcut in the tooltip, and starts the same live adjustment as the keyboard. Unavailable actions stay disabled.&lt;br /&gt;
&lt;br /&gt;
Select faces, edges, or objects, press the operation&#039;s shortcut, then &#039;&#039;&#039;move the mouse or type a value&#039;&#039;&#039;. &#039;&#039;&#039;Enter or left-click applies; Escape or right-click cancels.&#039;&#039;&#039; The status bar shows the current value and controls. Each completed operation is one Undo.&lt;br /&gt;
&lt;br /&gt;
Mouse adjustments snap to the grid. &#039;&#039;&#039;[ / ]&#039;&#039;&#039; changes the grid during an operation without leaving the preview or changing mouse sensitivity. Hold &#039;&#039;&#039;Shift&#039;&#039;&#039; for slower adjustment and a finer grid step, or &#039;&#039;&#039;Ctrl/Cmd&#039;&#039;&#039; to bypass snapping. Typed values and calculations such as &amp;lt;code&amp;gt;128/3&amp;lt;/code&amp;gt; stay exact. Backspace edits the input; clearing it returns to mouse adjustment. Invalid input must be corrected or canceled before applying.&lt;br /&gt;
&lt;br /&gt;
The active viewport shows the value and a &#039;&#039;&#039;+/− adjustment gizmo&#039;&#039;&#039;. Move along the arrow to increase the amount, or back toward − to decrease it. Extrude and offset follow the face normal; inset points inward from a face edge. An axis viewed head-on, and operations without a single direction, use a horizontal guide. Movement across the guide does not change the amount.&lt;br /&gt;
&lt;br /&gt;
Mouse sensitivity follows the view&#039;s world scale, independently of grid spacing; copy counts use 10 pixels per copy. The pointer moves to the handle when you start and wraps at the viewport edges, so adjustment has no screen-edge limit. On desktops without pointer warping, leaving the viewport pauses adjustment; re-entry anchors the pointer without a jump.&lt;br /&gt;
&lt;br /&gt;
During bevel, the mouse wheel changes the segment count. Linear and radial copy shortcuts adjust the number of additional copies, using the configured spacing or angle.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Shortcut !! Operation&lt;br /&gt;
|-&lt;br /&gt;
| Shift+E / Alt+E || Extrude individual faces / extrude a region&lt;br /&gt;
|-&lt;br /&gt;
| Shift+I / Shift+B / Shift+H || Inset faces / bevel edges / hollow walls&lt;br /&gt;
|-&lt;br /&gt;
| Alt+F || Offset faces along their normals&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl/Cmd+J / Shift+S || Combine objects / subtract last selected&lt;br /&gt;
|-&lt;br /&gt;
| Shift+W / Shift+K || Weld vertices / connect vertices&lt;br /&gt;
|-&lt;br /&gt;
| Shift+X / Shift+D || Split edges / dissolve edges&lt;br /&gt;
|-&lt;br /&gt;
| Shift+F / Shift+J || Cap holes / bridge boundaries&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Delete / Alt+R || Delete selected faces / repair mesh seams&lt;br /&gt;
|-&lt;br /&gt;
| Alt+T / Alt+W || Convert a face to terrain / sew terrain patches&lt;br /&gt;
|-&lt;br /&gt;
| Shift+T / Alt+Shift+T || Sculpt terrain / toggle terrain and surface&lt;br /&gt;
|-&lt;br /&gt;
| Alt+B / Alt+Shift+B || Convert to brush / split into brushes&lt;br /&gt;
|-&lt;br /&gt;
| Alt+A || Create an editable array&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+A / Alt+Shift+R || Make linear / radial copies&lt;br /&gt;
|-&lt;br /&gt;
| Alt+M / Alt+Shift+M || Create symmetry / unlink selection&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+C / Alt+Shift+W || Clip at symmetry planes / weld independent symmetry&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+U || Remove all symmetry links&lt;br /&gt;
|-&lt;br /&gt;
| Alt+P / Alt+X / Alt+L || Pick pivot / use face axes / align to another face&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Commands without a numeric adjustment apply immediately; picking, alignment, and sculpting enter their existing tools. Shortcuts appear in the Geometry menu and inspector button tooltips. They only edit the map from the Level workspace, and yield to text fields and free camera.&lt;br /&gt;
&lt;br /&gt;
Press &#039;&#039;&#039;C&#039;&#039;&#039; to draw a clipping plane, then Enter to apply it. While clipping, &#039;&#039;&#039;Alt+C&#039;&#039;&#039; toggles Slice (keep both sides) and &#039;&#039;&#039;Alt+F&#039;&#039;&#039; flips the kept side, including an existing preview. Alt+Left/Right, Alt+Up/Down, and Alt+Page Up/Down flip the selection along the focused view&#039;s axes.&lt;br /&gt;
&lt;br /&gt;
You can still use the inspector. &#039;&#039;&#039;Enter in a construction numeric field&#039;&#039;&#039; creates and applies the operation directly. Changing a distance during an active preview updates that preview; Enter applies and Escape cancels. Enter in an open surface&#039;s extrusion field uses region extrusion. Preview buttons remain available when you want to inspect a result first.&lt;br /&gt;
&lt;br /&gt;
=== Doorways and windows ===&lt;br /&gt;
&lt;br /&gt;
For a doorway through a solid wall, place a box cutter through the wall, select the wall and then the cutter, and apply &#039;&#039;&#039;Subtract last selected&#039;&#039;&#039;. The operation removes the cutter.&lt;br /&gt;
&lt;br /&gt;
For a framed opening, use &#039;&#039;&#039;Inset faces&#039;&#039;&#039;, apply it, scale the selected inner face, and delete that face. A thick wall needs openings on both sides. &#039;&#039;&#039;Bridge boundaries&#039;&#039;&#039; joins compatible open rims to form the inside surfaces.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Auto&#039;&#039;&#039; or &#039;&#039;&#039;Exact&#039;&#039;&#039; collision for a wall with an opening. Box and Convex collision can fill that opening even when the rendered wall looks correct.&lt;br /&gt;
&lt;br /&gt;
== Materials, models, and prefabs ==&lt;br /&gt;
&lt;br /&gt;
Drag a material from &#039;&#039;&#039;Materials&#039;&#039;&#039; onto a face. Hold Shift during the drop to apply it to the whole brush. These drops preserve the existing UV alignment.&lt;br /&gt;
&lt;br /&gt;
In Texture mode, left-click samples a face&#039;s material and alignment; right-drag paints them. Adjust texture size and offsets in the inspector. Texture lock keeps the mapping attached while moving or resizing geometry.&lt;br /&gt;
&lt;br /&gt;
Drag models from &#039;&#039;&#039;Models&#039;&#039;&#039; into a view, or use &#039;&#039;&#039;Place at pivot&#039;&#039;&#039;. Game models retain references to the SDK assets. For your own models or textures, use [[Vertex/Content|Content import]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prefabs&#039;&#039;&#039; contains reusable assemblies supplied by the game. They can include geometry, models, entities, and scripts. Linked instances retain local changes when refreshed. &#039;&#039;&#039;Unpack&#039;&#039;&#039; removes the source link. Save your own selections with &#039;&#039;&#039;File → Save selection as prefab…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Terrain ==&lt;br /&gt;
&lt;br /&gt;
Select one four-sided face and press &#039;&#039;&#039;Alt+T&#039;&#039;&#039; (or choose &#039;&#039;&#039;Convert to terrain&#039;&#039;&#039;). Type the subdivision count and press Enter. The terrain replaces that brush with an open patch, so duplicate the brush first if you need to keep the solid.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Base texture&#039;&#039;&#039; and &#039;&#039;&#039;Paint texture&#039;&#039;&#039; in the Terrain inspector. &#039;&#039;&#039;Paint textures&#039;&#039;&#039; reveals the second texture; Shift erases back to the base. &#039;&#039;&#039;Sculpt terrain&#039;&#039;&#039; raises, lowers, or smooths the surface. Use enough subdivisions for the shape you need, and inspect collision after sculpting.&lt;br /&gt;
&lt;br /&gt;
In paint and sculpt modes, &#039;&#039;&#039;scroll up to enlarge the brush and down to shrink it&#039;&#039;&#039;. &#039;&#039;&#039;Shift+scroll&#039;&#039;&#039; adjusts strength; &#039;&#039;&#039;Ctrl/Cmd+scroll&#039;&#039;&#039; zooms the view. The brush outline and radius field update immediately. Changing brush settings does not paint or create an Undo step.&lt;br /&gt;
&lt;br /&gt;
== Collision and lighting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Collision&#039;&#039;&#039; section controls whether an object blocks movement, its collision shape, and its filters. Start with Auto. Use &#039;&#039;&#039;Create collision proxy&#039;&#039;&#039; when a simpler invisible shape would make movement smoother, such as a ramp over stairs. Creating a proxy disables the original collider; deleting the proxy does not restore it.&lt;br /&gt;
&lt;br /&gt;
Set the sun, sky, ambient light, and fog in &#039;&#039;&#039;Map Environment&#039;&#039;&#039;. Game SDKs decide which lighting and spatial bakes are required. Inspect the built map in the game: the Vertex viewport does not reproduce every game shader or baked lighting effect.&lt;br /&gt;
&lt;br /&gt;
== Entities and logic ==&lt;br /&gt;
&lt;br /&gt;
Choose an entity in the creation controls, place it, and edit its properties in the inspector. A point has a position and direction. A bounds entity defines a volume. A brush entity owns geometry placed under it in the hierarchy.&lt;br /&gt;
&lt;br /&gt;
Name entities before wiring them in [[Vertex/VSig|VSig]]. Game-specific reference pages explain their behavior; Grimwar&#039;s [[Grimwar/Entities|entity index]] covers every supplied type.&lt;br /&gt;
&lt;br /&gt;
== Validate and export ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;File → Validate map&#039;&#039;&#039; to find geometry, reference, asset, and collision problems. Validation reports problems without repairing the map.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export compiled meshes…&#039;&#039;&#039; writes &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; for engine import. &#039;&#039;&#039;Export selection as model…&#039;&#039;&#039; writes OBJ or FBX geometry for other tools. Model export does not carry game entities, engine model placements, or collision. Use the game&#039;s Build controls for a playable package.&lt;br /&gt;
&lt;br /&gt;
Hidden objects still export. Hide and isolate are editing aids; delete an object or change its output settings when it should not ship.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=260</id>
		<title>Vertex/Editing</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=260"/>
		<updated>2026-10-02T20:30:08Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Document predictable mouse sizing and terrain brush wheel controls&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Build a small room and test its scale and collision in your game before adding detail. The active game profile sets the map&#039;s units; changing the connected profile does not rescale an existing map.&lt;br /&gt;
&lt;br /&gt;
== Move around and select ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;Z&amp;lt;/kbd&amp;gt;, then &amp;lt;kbd&amp;gt;WASD&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Q&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; || Enter free camera and move. Hold Shift to move faster; Escape exits.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;F&amp;lt;/kbd&amp;gt; || Frame the selection.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;1&amp;lt;/kbd&amp;gt;–&amp;lt;kbd&amp;gt;4&amp;lt;/kbd&amp;gt; / Space || Choose a view / maximize the view.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;S&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;G&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;T&amp;lt;/kbd&amp;gt; || Select / move / rotate / scale.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;V&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;H&amp;lt;/kbd&amp;gt; || Edit vertices / edges / faces.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;B&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+A&amp;lt;/kbd&amp;gt; || Draw / texture tools.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;[&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;]&amp;lt;/kbd&amp;gt; || Decrease / increase the grid size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;I&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+C&amp;lt;/kbd&amp;gt; || Isolate the selection / preview collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Shortcuts yield to text fields and free camera. Select an object before selecting its vertices, edges, or faces. Delete in a component tool removes those components; deleting in the hierarchy removes whole objects.&lt;br /&gt;
&lt;br /&gt;
Switch &#039;&#039;&#039;Global / Local&#039;&#039;&#039; above the views to choose transform axes. Local follows the active object or selected face. Numeric fields accept arithmetic, so you can enter a value such as &amp;lt;code&amp;gt;128*2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Draw geometry ==&lt;br /&gt;
&lt;br /&gt;
# Choose the draw tool and a shape.&lt;br /&gt;
# Set the grid and depth, then drag out the footprint.&lt;br /&gt;
# Apply the preview with Enter or &#039;&#039;&#039;Apply&#039;&#039;&#039;. Escape cancels.&lt;br /&gt;
# Use Move, Rotate, and Scale to position it. Keep large structural pieces on the grid.&lt;br /&gt;
&lt;br /&gt;
Drawing on an existing collider starts the new shape on that surface. Empty space uses the draw plane. Hold Shift while drawing for equal width, height, and depth. Stairs fit the drawn bounds; adjust their step count in the creation settings.&lt;br /&gt;
&lt;br /&gt;
Parametric shapes retain their settings. Use &#039;&#039;&#039;Convert to brush&#039;&#039;&#039; when you need to edit individual components. That conversion gives up the original shape controls.&lt;br /&gt;
&lt;br /&gt;
=== Geometry shortcuts ===&lt;br /&gt;
&lt;br /&gt;
The contextual bar above the viewports shows actions for the current tool and selection: Extrude and Inset for faces, Bevel for edges, Weld for vertices, and construction actions for objects. Each action has an icon and label, with its shortcut in the tooltip, and starts the same live adjustment as the keyboard. Unavailable actions stay disabled.&lt;br /&gt;
&lt;br /&gt;
Select faces, edges, or objects, press the operation&#039;s shortcut, then &#039;&#039;&#039;move the mouse or type a value&#039;&#039;&#039;. &#039;&#039;&#039;Enter or left-click applies; Escape or right-click cancels.&#039;&#039;&#039; The status bar shows the current value and controls. Each completed operation is one Undo.&lt;br /&gt;
&lt;br /&gt;
Mouse adjustments snap to the grid. Hold &#039;&#039;&#039;Shift&#039;&#039;&#039; for slower adjustment and a finer grid step, or &#039;&#039;&#039;Ctrl/Cmd&#039;&#039;&#039; to bypass snapping. Typed values and calculations such as &amp;lt;code&amp;gt;128/3&amp;lt;/code&amp;gt; stay exact. Backspace edits the input; clearing it returns to mouse adjustment. Invalid input must be corrected or canceled before applying.&lt;br /&gt;
&lt;br /&gt;
The active viewport shows the current value and a direction guide. For every operation and every view, &#039;&#039;&#039;left decreases the value and right increases it&#039;&#039;&#039;; vertical movement does nothing. Distance sensitivity is one grid step per 16 pixels; copy counts use 10 pixels per copy. Leaving the viewport pauses adjustment. Re-entering anchors the mouse at its new position without changing the value. During bevel, the mouse wheel changes the segment count. Linear and radial copy shortcuts adjust the number of additional copies, using the configured spacing or angle.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Shortcut !! Operation&lt;br /&gt;
|-&lt;br /&gt;
| Shift+E / Alt+E || Extrude individual faces / extrude a region&lt;br /&gt;
|-&lt;br /&gt;
| Shift+I / Shift+B / Shift+H || Inset faces / bevel edges / hollow walls&lt;br /&gt;
|-&lt;br /&gt;
| Alt+F || Offset faces along their normals&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl/Cmd+J / Shift+S || Combine objects / subtract last selected&lt;br /&gt;
|-&lt;br /&gt;
| Shift+W / Shift+K || Weld vertices / connect vertices&lt;br /&gt;
|-&lt;br /&gt;
| Shift+X / Shift+D || Split edges / dissolve edges&lt;br /&gt;
|-&lt;br /&gt;
| Shift+F / Shift+J || Cap holes / bridge boundaries&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Delete / Alt+R || Delete selected faces / repair mesh seams&lt;br /&gt;
|-&lt;br /&gt;
| Alt+T / Alt+W || Convert a face to terrain / sew terrain patches&lt;br /&gt;
|-&lt;br /&gt;
| Shift+T / Alt+Shift+T || Sculpt terrain / toggle terrain and surface&lt;br /&gt;
|-&lt;br /&gt;
| Alt+B / Alt+Shift+B || Convert to brush / split into brushes&lt;br /&gt;
|-&lt;br /&gt;
| Alt+A || Create an editable array&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+A / Alt+Shift+R || Make linear / radial copies&lt;br /&gt;
|-&lt;br /&gt;
| Alt+M / Alt+Shift+M || Create symmetry / unlink selection&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+C / Alt+Shift+W || Clip at symmetry planes / weld independent symmetry&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+U || Remove all symmetry links&lt;br /&gt;
|-&lt;br /&gt;
| Alt+P / Alt+X / Alt+L || Pick pivot / use face axes / align to another face&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Commands without a numeric adjustment apply immediately; picking, alignment, and sculpting enter their existing tools. Shortcuts appear in the Geometry menu and inspector button tooltips. They only edit the map from the Level workspace, and yield to text fields and free camera.&lt;br /&gt;
&lt;br /&gt;
Press &#039;&#039;&#039;C&#039;&#039;&#039; to draw a clipping plane, then Enter to apply it. While clipping, &#039;&#039;&#039;Alt+C&#039;&#039;&#039; toggles Slice (keep both sides) and &#039;&#039;&#039;Alt+F&#039;&#039;&#039; flips the kept side, including an existing preview. Alt+Left/Right, Alt+Up/Down, and Alt+Page Up/Down flip the selection along the focused view&#039;s axes.&lt;br /&gt;
&lt;br /&gt;
You can still use the inspector. &#039;&#039;&#039;Enter in a construction numeric field&#039;&#039;&#039; creates and applies the operation directly. Changing a distance during an active preview updates that preview; Enter applies and Escape cancels. Enter in an open surface&#039;s extrusion field uses region extrusion. Preview buttons remain available when you want to inspect a result first.&lt;br /&gt;
&lt;br /&gt;
=== Doorways and windows ===&lt;br /&gt;
&lt;br /&gt;
For a doorway through a solid wall, place a box cutter through the wall, select the wall and then the cutter, and apply &#039;&#039;&#039;Subtract last selected&#039;&#039;&#039;. The operation removes the cutter.&lt;br /&gt;
&lt;br /&gt;
For a framed opening, use &#039;&#039;&#039;Inset faces&#039;&#039;&#039;, apply it, scale the selected inner face, and delete that face. A thick wall needs openings on both sides. &#039;&#039;&#039;Bridge boundaries&#039;&#039;&#039; joins compatible open rims to form the inside surfaces.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Auto&#039;&#039;&#039; or &#039;&#039;&#039;Exact&#039;&#039;&#039; collision for a wall with an opening. Box and Convex collision can fill that opening even when the rendered wall looks correct.&lt;br /&gt;
&lt;br /&gt;
== Materials, models, and prefabs ==&lt;br /&gt;
&lt;br /&gt;
Drag a material from &#039;&#039;&#039;Materials&#039;&#039;&#039; onto a face. Hold Shift during the drop to apply it to the whole brush. These drops preserve the existing UV alignment.&lt;br /&gt;
&lt;br /&gt;
In Texture mode, left-click samples a face&#039;s material and alignment; right-drag paints them. Adjust texture size and offsets in the inspector. Texture lock keeps the mapping attached while moving or resizing geometry.&lt;br /&gt;
&lt;br /&gt;
Drag models from &#039;&#039;&#039;Models&#039;&#039;&#039; into a view, or use &#039;&#039;&#039;Place at pivot&#039;&#039;&#039;. Game models retain references to the SDK assets. For your own models or textures, use [[Vertex/Content|Content import]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prefabs&#039;&#039;&#039; contains reusable assemblies supplied by the game. They can include geometry, models, entities, and scripts. Linked instances retain local changes when refreshed. &#039;&#039;&#039;Unpack&#039;&#039;&#039; removes the source link. Save your own selections with &#039;&#039;&#039;File → Save selection as prefab…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Terrain ==&lt;br /&gt;
&lt;br /&gt;
Select one four-sided face and press &#039;&#039;&#039;Alt+T&#039;&#039;&#039; (or choose &#039;&#039;&#039;Convert to terrain&#039;&#039;&#039;). Type the subdivision count and press Enter. The terrain replaces that brush with an open patch, so duplicate the brush first if you need to keep the solid.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Base texture&#039;&#039;&#039; and &#039;&#039;&#039;Paint texture&#039;&#039;&#039; in the Terrain inspector. &#039;&#039;&#039;Paint textures&#039;&#039;&#039; reveals the second texture; Shift erases back to the base. &#039;&#039;&#039;Sculpt terrain&#039;&#039;&#039; raises, lowers, or smooths the surface. Use enough subdivisions for the shape you need, and inspect collision after sculpting.&lt;br /&gt;
&lt;br /&gt;
In paint and sculpt modes, &#039;&#039;&#039;scroll up to enlarge the brush and down to shrink it&#039;&#039;&#039;. &#039;&#039;&#039;Shift+scroll&#039;&#039;&#039; adjusts strength; &#039;&#039;&#039;Ctrl/Cmd+scroll&#039;&#039;&#039; zooms the view. The brush outline and radius field update immediately. Changing brush settings does not paint or create an Undo step.&lt;br /&gt;
&lt;br /&gt;
== Collision and lighting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Collision&#039;&#039;&#039; section controls whether an object blocks movement, its collision shape, and its filters. Start with Auto. Use &#039;&#039;&#039;Create collision proxy&#039;&#039;&#039; when a simpler invisible shape would make movement smoother, such as a ramp over stairs. Creating a proxy disables the original collider; deleting the proxy does not restore it.&lt;br /&gt;
&lt;br /&gt;
Set the sun, sky, ambient light, and fog in &#039;&#039;&#039;Map Environment&#039;&#039;&#039;. Game SDKs decide which lighting and spatial bakes are required. Inspect the built map in the game: the Vertex viewport does not reproduce every game shader or baked lighting effect.&lt;br /&gt;
&lt;br /&gt;
== Entities and logic ==&lt;br /&gt;
&lt;br /&gt;
Choose an entity in the creation controls, place it, and edit its properties in the inspector. A point has a position and direction. A bounds entity defines a volume. A brush entity owns geometry placed under it in the hierarchy.&lt;br /&gt;
&lt;br /&gt;
Name entities before wiring them in [[Vertex/VSig|VSig]]. Game-specific reference pages explain their behavior; Grimwar&#039;s [[Grimwar/Entities|entity index]] covers every supplied type.&lt;br /&gt;
&lt;br /&gt;
== Validate and export ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;File → Validate map&#039;&#039;&#039; to find geometry, reference, asset, and collision problems. Validation reports problems without repairing the map.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export compiled meshes…&#039;&#039;&#039; writes &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; for engine import. &#039;&#039;&#039;Export selection as model…&#039;&#039;&#039; writes OBJ or FBX geometry for other tools. Model export does not carry game entities, engine model placements, or collision. Use the game&#039;s Build controls for a playable package.&lt;br /&gt;
&lt;br /&gt;
Hidden objects still export. Hide and isolate are editing aids; delete an object or change its output settings when it should not ship.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=259</id>
		<title>Vertex/Editing</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=259"/>
		<updated>2026-10-02T19:39:22Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Document contextual toolbar icons and labels&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Build a small room and test its scale and collision in your game before adding detail. The active game profile sets the map&#039;s units; changing the connected profile does not rescale an existing map.&lt;br /&gt;
&lt;br /&gt;
== Move around and select ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;Z&amp;lt;/kbd&amp;gt;, then &amp;lt;kbd&amp;gt;WASD&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Q&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; || Enter free camera and move. Hold Shift to move faster; Escape exits.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;F&amp;lt;/kbd&amp;gt; || Frame the selection.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;1&amp;lt;/kbd&amp;gt;–&amp;lt;kbd&amp;gt;4&amp;lt;/kbd&amp;gt; / Space || Choose a view / maximize the view.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;S&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;G&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;T&amp;lt;/kbd&amp;gt; || Select / move / rotate / scale.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;V&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;H&amp;lt;/kbd&amp;gt; || Edit vertices / edges / faces.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;B&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+A&amp;lt;/kbd&amp;gt; || Draw / texture tools.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;[&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;]&amp;lt;/kbd&amp;gt; || Decrease / increase the grid size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;I&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+C&amp;lt;/kbd&amp;gt; || Isolate the selection / preview collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Shortcuts yield to text fields and free camera. Select an object before selecting its vertices, edges, or faces. Delete in a component tool removes those components; deleting in the hierarchy removes whole objects.&lt;br /&gt;
&lt;br /&gt;
Switch &#039;&#039;&#039;Global / Local&#039;&#039;&#039; above the views to choose transform axes. Local follows the active object or selected face. Numeric fields accept arithmetic, so you can enter a value such as &amp;lt;code&amp;gt;128*2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Draw geometry ==&lt;br /&gt;
&lt;br /&gt;
# Choose the draw tool and a shape.&lt;br /&gt;
# Set the grid and depth, then drag out the footprint.&lt;br /&gt;
# Apply the preview with Enter or &#039;&#039;&#039;Apply&#039;&#039;&#039;. Escape cancels.&lt;br /&gt;
# Use Move, Rotate, and Scale to position it. Keep large structural pieces on the grid.&lt;br /&gt;
&lt;br /&gt;
Drawing on an existing collider starts the new shape on that surface. Empty space uses the draw plane. Hold Shift while drawing for equal width, height, and depth. Stairs fit the drawn bounds; adjust their step count in the creation settings.&lt;br /&gt;
&lt;br /&gt;
Parametric shapes retain their settings. Use &#039;&#039;&#039;Convert to brush&#039;&#039;&#039; when you need to edit individual components. That conversion gives up the original shape controls.&lt;br /&gt;
&lt;br /&gt;
=== Geometry shortcuts ===&lt;br /&gt;
&lt;br /&gt;
The contextual bar above the viewports shows actions for the current tool and selection: Extrude and Inset for faces, Bevel for edges, Weld for vertices, and construction actions for objects. Each action has an icon and label, with its shortcut in the tooltip, and starts the same live adjustment as the keyboard. Unavailable actions stay disabled.&lt;br /&gt;
&lt;br /&gt;
Select faces, edges, or objects, press the operation&#039;s shortcut, then &#039;&#039;&#039;move the mouse or type a value&#039;&#039;&#039;. &#039;&#039;&#039;Enter or left-click applies; Escape or right-click cancels.&#039;&#039;&#039; The status bar shows the current value and controls. Each completed operation is one Undo.&lt;br /&gt;
&lt;br /&gt;
Mouse adjustments snap to the grid. Hold &#039;&#039;&#039;Shift&#039;&#039;&#039; for slower adjustment and a tenth of the grid step, or &#039;&#039;&#039;Ctrl/Cmd&#039;&#039;&#039; to bypass snapping. Typed values and calculations such as &amp;lt;code&amp;gt;128/3&amp;lt;/code&amp;gt; stay exact. Backspace edits the input; clearing it returns to mouse adjustment. Invalid input must be corrected or canceled before applying.&lt;br /&gt;
&lt;br /&gt;
Extrude and face offset follow the selected face&#039;s normal on screen; use horizontal movement when viewing the face head-on. Other distances use horizontal movement. During bevel, the mouse wheel changes the segment count. Linear and radial copy shortcuts adjust the number of additional copies, using the configured spacing or angle.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Shortcut !! Operation&lt;br /&gt;
|-&lt;br /&gt;
| Shift+E / Alt+E || Extrude individual faces / extrude a region&lt;br /&gt;
|-&lt;br /&gt;
| Shift+I / Shift+B / Shift+H || Inset faces / bevel edges / hollow walls&lt;br /&gt;
|-&lt;br /&gt;
| Alt+F || Offset faces along their normals&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl/Cmd+J / Shift+S || Combine objects / subtract last selected&lt;br /&gt;
|-&lt;br /&gt;
| Shift+W / Shift+K || Weld vertices / connect vertices&lt;br /&gt;
|-&lt;br /&gt;
| Shift+X / Shift+D || Split edges / dissolve edges&lt;br /&gt;
|-&lt;br /&gt;
| Shift+F / Shift+J || Cap holes / bridge boundaries&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Delete / Alt+R || Delete selected faces / repair mesh seams&lt;br /&gt;
|-&lt;br /&gt;
| Alt+T / Alt+W || Convert a face to terrain / sew terrain patches&lt;br /&gt;
|-&lt;br /&gt;
| Shift+T / Alt+Shift+T || Sculpt terrain / toggle terrain and surface&lt;br /&gt;
|-&lt;br /&gt;
| Alt+B / Alt+Shift+B || Convert to brush / split into brushes&lt;br /&gt;
|-&lt;br /&gt;
| Alt+A || Create an editable array&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+A / Alt+Shift+R || Make linear / radial copies&lt;br /&gt;
|-&lt;br /&gt;
| Alt+M / Alt+Shift+M || Create symmetry / unlink selection&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+C / Alt+Shift+W || Clip at symmetry planes / weld independent symmetry&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+U || Remove all symmetry links&lt;br /&gt;
|-&lt;br /&gt;
| Alt+P / Alt+X / Alt+L || Pick pivot / use face axes / align to another face&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Commands without a numeric adjustment apply immediately; picking, alignment, and sculpting enter their existing tools. Shortcuts appear in the Geometry menu and inspector button tooltips. They only edit the map from the Level workspace, and yield to text fields and free camera.&lt;br /&gt;
&lt;br /&gt;
Press &#039;&#039;&#039;C&#039;&#039;&#039; to draw a clipping plane, then Enter to apply it. While clipping, &#039;&#039;&#039;Alt+C&#039;&#039;&#039; toggles Slice (keep both sides) and &#039;&#039;&#039;Alt+F&#039;&#039;&#039; flips the kept side, including an existing preview. Alt+Left/Right, Alt+Up/Down, and Alt+Page Up/Down flip the selection along the focused view&#039;s axes.&lt;br /&gt;
&lt;br /&gt;
You can still use the inspector. &#039;&#039;&#039;Enter in a construction numeric field&#039;&#039;&#039; creates and applies the operation directly. Changing a distance during an active preview updates that preview; Enter applies and Escape cancels. Enter in an open surface&#039;s extrusion field uses region extrusion. Preview buttons remain available when you want to inspect a result first.&lt;br /&gt;
&lt;br /&gt;
=== Doorways and windows ===&lt;br /&gt;
&lt;br /&gt;
For a doorway through a solid wall, place a box cutter through the wall, select the wall and then the cutter, and apply &#039;&#039;&#039;Subtract last selected&#039;&#039;&#039;. The operation removes the cutter.&lt;br /&gt;
&lt;br /&gt;
For a framed opening, use &#039;&#039;&#039;Inset faces&#039;&#039;&#039;, apply it, scale the selected inner face, and delete that face. A thick wall needs openings on both sides. &#039;&#039;&#039;Bridge boundaries&#039;&#039;&#039; joins compatible open rims to form the inside surfaces.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Auto&#039;&#039;&#039; or &#039;&#039;&#039;Exact&#039;&#039;&#039; collision for a wall with an opening. Box and Convex collision can fill that opening even when the rendered wall looks correct.&lt;br /&gt;
&lt;br /&gt;
== Materials, models, and prefabs ==&lt;br /&gt;
&lt;br /&gt;
Drag a material from &#039;&#039;&#039;Materials&#039;&#039;&#039; onto a face. Hold Shift during the drop to apply it to the whole brush. These drops preserve the existing UV alignment.&lt;br /&gt;
&lt;br /&gt;
In Texture mode, left-click samples a face&#039;s material and alignment; right-drag paints them. Adjust texture size and offsets in the inspector. Texture lock keeps the mapping attached while moving or resizing geometry.&lt;br /&gt;
&lt;br /&gt;
Drag models from &#039;&#039;&#039;Models&#039;&#039;&#039; into a view, or use &#039;&#039;&#039;Place at pivot&#039;&#039;&#039;. Game models retain references to the SDK assets. For your own models or textures, use [[Vertex/Content|Content import]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prefabs&#039;&#039;&#039; contains reusable assemblies supplied by the game. They can include geometry, models, entities, and scripts. Linked instances retain local changes when refreshed. &#039;&#039;&#039;Unpack&#039;&#039;&#039; removes the source link. Save your own selections with &#039;&#039;&#039;File → Save selection as prefab…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Terrain ==&lt;br /&gt;
&lt;br /&gt;
Select one four-sided face and press &#039;&#039;&#039;Alt+T&#039;&#039;&#039; (or choose &#039;&#039;&#039;Convert to terrain&#039;&#039;&#039;). Type the subdivision count and press Enter. The terrain replaces that brush with an open patch, so duplicate the brush first if you need to keep the solid.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Base texture&#039;&#039;&#039; and &#039;&#039;&#039;Paint texture&#039;&#039;&#039; in the Terrain inspector. &#039;&#039;&#039;Paint textures&#039;&#039;&#039; reveals the second texture; Shift erases back to the base. &#039;&#039;&#039;Sculpt terrain&#039;&#039;&#039; raises, lowers, or smooths the surface. Use enough subdivisions for the shape you need, and inspect collision after sculpting.&lt;br /&gt;
&lt;br /&gt;
== Collision and lighting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Collision&#039;&#039;&#039; section controls whether an object blocks movement, its collision shape, and its filters. Start with Auto. Use &#039;&#039;&#039;Create collision proxy&#039;&#039;&#039; when a simpler invisible shape would make movement smoother, such as a ramp over stairs. Creating a proxy disables the original collider; deleting the proxy does not restore it.&lt;br /&gt;
&lt;br /&gt;
Set the sun, sky, ambient light, and fog in &#039;&#039;&#039;Map Environment&#039;&#039;&#039;. Game SDKs decide which lighting and spatial bakes are required. Inspect the built map in the game: the Vertex viewport does not reproduce every game shader or baked lighting effect.&lt;br /&gt;
&lt;br /&gt;
== Entities and logic ==&lt;br /&gt;
&lt;br /&gt;
Choose an entity in the creation controls, place it, and edit its properties in the inspector. A point has a position and direction. A bounds entity defines a volume. A brush entity owns geometry placed under it in the hierarchy.&lt;br /&gt;
&lt;br /&gt;
Name entities before wiring them in [[Vertex/VSig|VSig]]. Game-specific reference pages explain their behavior; Grimwar&#039;s [[Grimwar/Entities|entity index]] covers every supplied type.&lt;br /&gt;
&lt;br /&gt;
== Validate and export ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;File → Validate map&#039;&#039;&#039; to find geometry, reference, asset, and collision problems. Validation reports problems without repairing the map.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export compiled meshes…&#039;&#039;&#039; writes &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; for engine import. &#039;&#039;&#039;Export selection as model…&#039;&#039;&#039; writes OBJ or FBX geometry for other tools. Model export does not carry game entities, engine model placements, or collision. Use the game&#039;s Build controls for a playable package.&lt;br /&gt;
&lt;br /&gt;
Hidden objects still export. Hide and isolate are editing aids; delete an object or change its output settings when it should not ship.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=258</id>
		<title>Vertex/Editing</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=258"/>
		<updated>2026-10-02T19:22:34Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Document direct geometry shortcuts and clip modifiers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Build a small room and test its scale and collision in your game before adding detail. The active game profile sets the map&#039;s units; changing the connected profile does not rescale an existing map.&lt;br /&gt;
&lt;br /&gt;
== Move around and select ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;Z&amp;lt;/kbd&amp;gt;, then &amp;lt;kbd&amp;gt;WASD&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Q&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; || Enter free camera and move. Hold Shift to move faster; Escape exits.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;F&amp;lt;/kbd&amp;gt; || Frame the selection.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;1&amp;lt;/kbd&amp;gt;–&amp;lt;kbd&amp;gt;4&amp;lt;/kbd&amp;gt; / Space || Choose a view / maximize the view.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;S&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;G&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;T&amp;lt;/kbd&amp;gt; || Select / move / rotate / scale.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;V&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;H&amp;lt;/kbd&amp;gt; || Edit vertices / edges / faces.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;B&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+A&amp;lt;/kbd&amp;gt; || Draw / texture tools.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;[&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;]&amp;lt;/kbd&amp;gt; || Decrease / increase the grid size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;I&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+C&amp;lt;/kbd&amp;gt; || Isolate the selection / preview collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Shortcuts yield to text fields and free camera. Select an object before selecting its vertices, edges, or faces. Delete in a component tool removes those components; deleting in the hierarchy removes whole objects.&lt;br /&gt;
&lt;br /&gt;
Switch &#039;&#039;&#039;Global / Local&#039;&#039;&#039; above the views to choose transform axes. Local follows the active object or selected face. Numeric fields accept arithmetic, so you can enter a value such as &amp;lt;code&amp;gt;128*2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Draw geometry ==&lt;br /&gt;
&lt;br /&gt;
# Choose the draw tool and a shape.&lt;br /&gt;
# Set the grid and depth, then drag out the footprint.&lt;br /&gt;
# Apply the preview with Enter or &#039;&#039;&#039;Apply&#039;&#039;&#039;. Escape cancels.&lt;br /&gt;
# Use Move, Rotate, and Scale to position it. Keep large structural pieces on the grid.&lt;br /&gt;
&lt;br /&gt;
Drawing on an existing collider starts the new shape on that surface. Empty space uses the draw plane. Hold Shift while drawing for equal width, height, and depth. Stairs fit the drawn bounds; adjust their step count in the creation settings.&lt;br /&gt;
&lt;br /&gt;
Parametric shapes retain their settings. Use &#039;&#039;&#039;Convert to brush&#039;&#039;&#039; when you need to edit individual components. That conversion gives up the original shape controls.&lt;br /&gt;
&lt;br /&gt;
=== Geometry shortcuts ===&lt;br /&gt;
&lt;br /&gt;
The contextual bar above the viewports shows actions for the current tool and selection: Extrude and Inset for faces, Bevel for edges, Weld for vertices, and construction actions for objects. Buttons show their shortcuts in tooltips and start the same live adjustment as the keyboard. Unavailable actions stay disabled.&lt;br /&gt;
&lt;br /&gt;
Select faces, edges, or objects, press the operation&#039;s shortcut, then &#039;&#039;&#039;move the mouse or type a value&#039;&#039;&#039;. &#039;&#039;&#039;Enter or left-click applies; Escape or right-click cancels.&#039;&#039;&#039; The status bar shows the current value and controls. Each completed operation is one Undo.&lt;br /&gt;
&lt;br /&gt;
Mouse adjustments snap to the grid. Hold &#039;&#039;&#039;Shift&#039;&#039;&#039; for slower adjustment and a tenth of the grid step, or &#039;&#039;&#039;Ctrl/Cmd&#039;&#039;&#039; to bypass snapping. Typed values and calculations such as &amp;lt;code&amp;gt;128/3&amp;lt;/code&amp;gt; stay exact. Backspace edits the input; clearing it returns to mouse adjustment. Invalid input must be corrected or canceled before applying.&lt;br /&gt;
&lt;br /&gt;
Extrude and face offset follow the selected face&#039;s normal on screen; use horizontal movement when viewing the face head-on. Other distances use horizontal movement. During bevel, the mouse wheel changes the segment count. Linear and radial copy shortcuts adjust the number of additional copies, using the configured spacing or angle.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Shortcut !! Operation&lt;br /&gt;
|-&lt;br /&gt;
| Shift+E / Alt+E || Extrude individual faces / extrude a region&lt;br /&gt;
|-&lt;br /&gt;
| Shift+I / Shift+B / Shift+H || Inset faces / bevel edges / hollow walls&lt;br /&gt;
|-&lt;br /&gt;
| Alt+F || Offset faces along their normals&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl/Cmd+J / Shift+S || Combine objects / subtract last selected&lt;br /&gt;
|-&lt;br /&gt;
| Shift+W / Shift+K || Weld vertices / connect vertices&lt;br /&gt;
|-&lt;br /&gt;
| Shift+X / Shift+D || Split edges / dissolve edges&lt;br /&gt;
|-&lt;br /&gt;
| Shift+F / Shift+J || Cap holes / bridge boundaries&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Delete / Alt+R || Delete selected faces / repair mesh seams&lt;br /&gt;
|-&lt;br /&gt;
| Alt+T / Alt+W || Convert a face to terrain / sew terrain patches&lt;br /&gt;
|-&lt;br /&gt;
| Shift+T / Alt+Shift+T || Sculpt terrain / toggle terrain and surface&lt;br /&gt;
|-&lt;br /&gt;
| Alt+B / Alt+Shift+B || Convert to brush / split into brushes&lt;br /&gt;
|-&lt;br /&gt;
| Alt+A || Create an editable array&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+A / Alt+Shift+R || Make linear / radial copies&lt;br /&gt;
|-&lt;br /&gt;
| Alt+M / Alt+Shift+M || Create symmetry / unlink selection&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+C / Alt+Shift+W || Clip at symmetry planes / weld independent symmetry&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+U || Remove all symmetry links&lt;br /&gt;
|-&lt;br /&gt;
| Alt+P / Alt+X / Alt+L || Pick pivot / use face axes / align to another face&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Commands without a numeric adjustment apply immediately; picking, alignment, and sculpting enter their existing tools. Shortcuts appear in the Geometry menu and inspector button tooltips. They only edit the map from the Level workspace, and yield to text fields and free camera.&lt;br /&gt;
&lt;br /&gt;
Press &#039;&#039;&#039;C&#039;&#039;&#039; to draw a clipping plane, then Enter to apply it. While clipping, &#039;&#039;&#039;Alt+C&#039;&#039;&#039; toggles Slice (keep both sides) and &#039;&#039;&#039;Alt+F&#039;&#039;&#039; flips the kept side, including an existing preview. Alt+Left/Right, Alt+Up/Down, and Alt+Page Up/Down flip the selection along the focused view&#039;s axes.&lt;br /&gt;
&lt;br /&gt;
You can still use the inspector. &#039;&#039;&#039;Enter in a construction numeric field&#039;&#039;&#039; creates and applies the operation directly. Changing a distance during an active preview updates that preview; Enter applies and Escape cancels. Enter in an open surface&#039;s extrusion field uses region extrusion. Preview buttons remain available when you want to inspect a result first.&lt;br /&gt;
&lt;br /&gt;
=== Doorways and windows ===&lt;br /&gt;
&lt;br /&gt;
For a doorway through a solid wall, place a box cutter through the wall, select the wall and then the cutter, and apply &#039;&#039;&#039;Subtract last selected&#039;&#039;&#039;. The operation removes the cutter.&lt;br /&gt;
&lt;br /&gt;
For a framed opening, use &#039;&#039;&#039;Inset faces&#039;&#039;&#039;, apply it, scale the selected inner face, and delete that face. A thick wall needs openings on both sides. &#039;&#039;&#039;Bridge boundaries&#039;&#039;&#039; joins compatible open rims to form the inside surfaces.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Auto&#039;&#039;&#039; or &#039;&#039;&#039;Exact&#039;&#039;&#039; collision for a wall with an opening. Box and Convex collision can fill that opening even when the rendered wall looks correct.&lt;br /&gt;
&lt;br /&gt;
== Materials, models, and prefabs ==&lt;br /&gt;
&lt;br /&gt;
Drag a material from &#039;&#039;&#039;Materials&#039;&#039;&#039; onto a face. Hold Shift during the drop to apply it to the whole brush. These drops preserve the existing UV alignment.&lt;br /&gt;
&lt;br /&gt;
In Texture mode, left-click samples a face&#039;s material and alignment; right-drag paints them. Adjust texture size and offsets in the inspector. Texture lock keeps the mapping attached while moving or resizing geometry.&lt;br /&gt;
&lt;br /&gt;
Drag models from &#039;&#039;&#039;Models&#039;&#039;&#039; into a view, or use &#039;&#039;&#039;Place at pivot&#039;&#039;&#039;. Game models retain references to the SDK assets. For your own models or textures, use [[Vertex/Content|Content import]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prefabs&#039;&#039;&#039; contains reusable assemblies supplied by the game. They can include geometry, models, entities, and scripts. Linked instances retain local changes when refreshed. &#039;&#039;&#039;Unpack&#039;&#039;&#039; removes the source link. Save your own selections with &#039;&#039;&#039;File → Save selection as prefab…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Terrain ==&lt;br /&gt;
&lt;br /&gt;
Select one four-sided face and press &#039;&#039;&#039;Alt+T&#039;&#039;&#039; (or choose &#039;&#039;&#039;Convert to terrain&#039;&#039;&#039;). Type the subdivision count and press Enter. The terrain replaces that brush with an open patch, so duplicate the brush first if you need to keep the solid.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Base texture&#039;&#039;&#039; and &#039;&#039;&#039;Paint texture&#039;&#039;&#039; in the Terrain inspector. &#039;&#039;&#039;Paint textures&#039;&#039;&#039; reveals the second texture; Shift erases back to the base. &#039;&#039;&#039;Sculpt terrain&#039;&#039;&#039; raises, lowers, or smooths the surface. Use enough subdivisions for the shape you need, and inspect collision after sculpting.&lt;br /&gt;
&lt;br /&gt;
== Collision and lighting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Collision&#039;&#039;&#039; section controls whether an object blocks movement, its collision shape, and its filters. Start with Auto. Use &#039;&#039;&#039;Create collision proxy&#039;&#039;&#039; when a simpler invisible shape would make movement smoother, such as a ramp over stairs. Creating a proxy disables the original collider; deleting the proxy does not restore it.&lt;br /&gt;
&lt;br /&gt;
Set the sun, sky, ambient light, and fog in &#039;&#039;&#039;Map Environment&#039;&#039;&#039;. Game SDKs decide which lighting and spatial bakes are required. Inspect the built map in the game: the Vertex viewport does not reproduce every game shader or baked lighting effect.&lt;br /&gt;
&lt;br /&gt;
== Entities and logic ==&lt;br /&gt;
&lt;br /&gt;
Choose an entity in the creation controls, place it, and edit its properties in the inspector. A point has a position and direction. A bounds entity defines a volume. A brush entity owns geometry placed under it in the hierarchy.&lt;br /&gt;
&lt;br /&gt;
Name entities before wiring them in [[Vertex/VSig|VSig]]. Game-specific reference pages explain their behavior; Grimwar&#039;s [[Grimwar/Entities|entity index]] covers every supplied type.&lt;br /&gt;
&lt;br /&gt;
== Validate and export ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;File → Validate map&#039;&#039;&#039; to find geometry, reference, asset, and collision problems. Validation reports problems without repairing the map.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export compiled meshes…&#039;&#039;&#039; writes &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; for engine import. &#039;&#039;&#039;Export selection as model…&#039;&#039;&#039; writes OBJ or FBX geometry for other tools. Model export does not carry game entities, engine model placements, or collision. Use the game&#039;s Build controls for a playable package.&lt;br /&gt;
&lt;br /&gt;
Hidden objects still export. Hide and isolate are editing aids; delete an object or change its output settings when it should not ship.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=257</id>
		<title>Vertex/Editing</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/Editing&amp;diff=257"/>
		<updated>2026-10-02T19:00:43Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Document direct geometry shortcuts and clip modifiers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
Build a small room and test its scale and collision in your game before adding detail. The active game profile sets the map&#039;s units; changing the connected profile does not rescale an existing map.&lt;br /&gt;
&lt;br /&gt;
== Move around and select ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;Z&amp;lt;/kbd&amp;gt;, then &amp;lt;kbd&amp;gt;WASD&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Q&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; || Enter free camera and move. Hold Shift to move faster; Escape exits.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;F&amp;lt;/kbd&amp;gt; || Frame the selection.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;1&amp;lt;/kbd&amp;gt;–&amp;lt;kbd&amp;gt;4&amp;lt;/kbd&amp;gt; / Space || Choose a view / maximize the view.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;S&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;G&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;R&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;T&amp;lt;/kbd&amp;gt; || Select / move / rotate / scale.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;V&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;E&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;H&amp;lt;/kbd&amp;gt; || Edit vertices / edges / faces.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;B&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+A&amp;lt;/kbd&amp;gt; || Draw / texture tools.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;[&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;]&amp;lt;/kbd&amp;gt; || Decrease / increase the grid size.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;kbd&amp;gt;I&amp;lt;/kbd&amp;gt; / &amp;lt;kbd&amp;gt;Shift+C&amp;lt;/kbd&amp;gt; || Isolate the selection / preview collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Shortcuts yield to text fields and free camera. Select an object before selecting its vertices, edges, or faces. Delete in a component tool removes those components; deleting in the hierarchy removes whole objects.&lt;br /&gt;
&lt;br /&gt;
Switch &#039;&#039;&#039;Global / Local&#039;&#039;&#039; above the views to choose transform axes. Local follows the active object or selected face. Numeric fields accept arithmetic, so you can enter a value such as &amp;lt;code&amp;gt;128*2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Draw geometry ==&lt;br /&gt;
&lt;br /&gt;
# Choose the draw tool and a shape.&lt;br /&gt;
# Set the grid and depth, then drag out the footprint.&lt;br /&gt;
# Apply the preview with Enter or &#039;&#039;&#039;Apply&#039;&#039;&#039;. Escape cancels.&lt;br /&gt;
# Use Move, Rotate, and Scale to position it. Keep large structural pieces on the grid.&lt;br /&gt;
&lt;br /&gt;
Drawing on an existing collider starts the new shape on that surface. Empty space uses the draw plane. Hold Shift while drawing for equal width, height, and depth. Stairs fit the drawn bounds; adjust their step count in the creation settings.&lt;br /&gt;
&lt;br /&gt;
Parametric shapes retain their settings. Use &#039;&#039;&#039;Convert to brush&#039;&#039;&#039; when you need to edit individual components. That conversion gives up the original shape controls.&lt;br /&gt;
&lt;br /&gt;
=== Geometry shortcuts ===&lt;br /&gt;
&lt;br /&gt;
Select faces, edges, or objects, press the operation&#039;s shortcut, then &#039;&#039;&#039;move the mouse or type a value&#039;&#039;&#039;. &#039;&#039;&#039;Enter or left-click applies; Escape or right-click cancels.&#039;&#039;&#039; The status bar shows the current value and controls. Each completed operation is one Undo.&lt;br /&gt;
&lt;br /&gt;
Mouse adjustments snap to the grid. Hold &#039;&#039;&#039;Shift&#039;&#039;&#039; for slower adjustment and a tenth of the grid step, or &#039;&#039;&#039;Ctrl/Cmd&#039;&#039;&#039; to bypass snapping. Typed values and calculations such as &amp;lt;code&amp;gt;128/3&amp;lt;/code&amp;gt; stay exact. Backspace edits the input; clearing it returns to mouse adjustment. Invalid input must be corrected or canceled before applying.&lt;br /&gt;
&lt;br /&gt;
Extrude and face offset follow the selected face&#039;s normal on screen; use horizontal movement when viewing the face head-on. Other distances use horizontal movement. During bevel, the mouse wheel changes the segment count. Linear and radial copy shortcuts adjust the number of additional copies, using the configured spacing or angle.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Shortcut !! Operation&lt;br /&gt;
|-&lt;br /&gt;
| Shift+E / Alt+E || Extrude individual faces / extrude a region&lt;br /&gt;
|-&lt;br /&gt;
| Shift+I / Shift+B / Shift+H || Inset faces / bevel edges / hollow walls&lt;br /&gt;
|-&lt;br /&gt;
| Alt+F || Offset faces along their normals&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl/Cmd+J / Shift+S || Combine objects / subtract last selected&lt;br /&gt;
|-&lt;br /&gt;
| Shift+W / Shift+K || Weld vertices / connect vertices&lt;br /&gt;
|-&lt;br /&gt;
| Shift+X / Shift+D || Split edges / dissolve edges&lt;br /&gt;
|-&lt;br /&gt;
| Shift+F / Shift+J || Cap holes / bridge boundaries&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Delete / Alt+R || Delete selected faces / repair mesh seams&lt;br /&gt;
|-&lt;br /&gt;
| Alt+T / Alt+W || Convert a face to terrain / sew terrain patches&lt;br /&gt;
|-&lt;br /&gt;
| Shift+T / Alt+Shift+T || Sculpt terrain / toggle terrain and surface&lt;br /&gt;
|-&lt;br /&gt;
| Alt+B / Alt+Shift+B || Convert to brush / split into brushes&lt;br /&gt;
|-&lt;br /&gt;
| Alt+A || Create an editable array&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+A / Alt+Shift+R || Make linear / radial copies&lt;br /&gt;
|-&lt;br /&gt;
| Alt+M / Alt+Shift+M || Create symmetry / unlink selection&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+C / Alt+Shift+W || Clip at symmetry planes / weld independent symmetry&lt;br /&gt;
|-&lt;br /&gt;
| Alt+Shift+U || Remove all symmetry links&lt;br /&gt;
|-&lt;br /&gt;
| Alt+P / Alt+X / Alt+L || Pick pivot / use face axes / align to another face&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Commands without a numeric adjustment apply immediately; picking, alignment, and sculpting enter their existing tools. Shortcuts appear in the Geometry menu and inspector button tooltips. They only edit the map from the Level workspace, and yield to text fields and free camera.&lt;br /&gt;
&lt;br /&gt;
Press &#039;&#039;&#039;C&#039;&#039;&#039; to draw a clipping plane, then Enter to apply it. While clipping, &#039;&#039;&#039;Alt+C&#039;&#039;&#039; toggles Slice (keep both sides) and &#039;&#039;&#039;Alt+F&#039;&#039;&#039; flips the kept side, including an existing preview. Alt+Left/Right, Alt+Up/Down, and Alt+Page Up/Down flip the selection along the focused view&#039;s axes.&lt;br /&gt;
&lt;br /&gt;
You can still use the inspector. &#039;&#039;&#039;Enter in a construction numeric field&#039;&#039;&#039; creates and applies the operation directly. Changing a distance during an active preview updates that preview; Enter applies and Escape cancels. Enter in an open surface&#039;s extrusion field uses region extrusion. Preview buttons remain available when you want to inspect a result first.&lt;br /&gt;
&lt;br /&gt;
=== Doorways and windows ===&lt;br /&gt;
&lt;br /&gt;
For a doorway through a solid wall, place a box cutter through the wall, select the wall and then the cutter, and apply &#039;&#039;&#039;Subtract last selected&#039;&#039;&#039;. The operation removes the cutter.&lt;br /&gt;
&lt;br /&gt;
For a framed opening, use &#039;&#039;&#039;Inset faces&#039;&#039;&#039;, apply it, scale the selected inner face, and delete that face. A thick wall needs openings on both sides. &#039;&#039;&#039;Bridge boundaries&#039;&#039;&#039; joins compatible open rims to form the inside surfaces.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Auto&#039;&#039;&#039; or &#039;&#039;&#039;Exact&#039;&#039;&#039; collision for a wall with an opening. Box and Convex collision can fill that opening even when the rendered wall looks correct.&lt;br /&gt;
&lt;br /&gt;
== Materials, models, and prefabs ==&lt;br /&gt;
&lt;br /&gt;
Drag a material from &#039;&#039;&#039;Materials&#039;&#039;&#039; onto a face. Hold Shift during the drop to apply it to the whole brush. These drops preserve the existing UV alignment.&lt;br /&gt;
&lt;br /&gt;
In Texture mode, left-click samples a face&#039;s material and alignment; right-drag paints them. Adjust texture size and offsets in the inspector. Texture lock keeps the mapping attached while moving or resizing geometry.&lt;br /&gt;
&lt;br /&gt;
Drag models from &#039;&#039;&#039;Models&#039;&#039;&#039; into a view, or use &#039;&#039;&#039;Place at pivot&#039;&#039;&#039;. Game models retain references to the SDK assets. For your own models or textures, use [[Vertex/Content|Content import]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prefabs&#039;&#039;&#039; contains reusable assemblies supplied by the game. They can include geometry, models, entities, and scripts. Linked instances retain local changes when refreshed. &#039;&#039;&#039;Unpack&#039;&#039;&#039; removes the source link. Save your own selections with &#039;&#039;&#039;File → Save selection as prefab…&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Terrain ==&lt;br /&gt;
&lt;br /&gt;
Select one four-sided face and press &#039;&#039;&#039;Alt+T&#039;&#039;&#039; (or choose &#039;&#039;&#039;Convert to terrain&#039;&#039;&#039;). Type the subdivision count and press Enter. The terrain replaces that brush with an open patch, so duplicate the brush first if you need to keep the solid.&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Base texture&#039;&#039;&#039; and &#039;&#039;&#039;Paint texture&#039;&#039;&#039; in the Terrain inspector. &#039;&#039;&#039;Paint textures&#039;&#039;&#039; reveals the second texture; Shift erases back to the base. &#039;&#039;&#039;Sculpt terrain&#039;&#039;&#039; raises, lowers, or smooths the surface. Use enough subdivisions for the shape you need, and inspect collision after sculpting.&lt;br /&gt;
&lt;br /&gt;
== Collision and lighting ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Collision&#039;&#039;&#039; section controls whether an object blocks movement, its collision shape, and its filters. Start with Auto. Use &#039;&#039;&#039;Create collision proxy&#039;&#039;&#039; when a simpler invisible shape would make movement smoother, such as a ramp over stairs. Creating a proxy disables the original collider; deleting the proxy does not restore it.&lt;br /&gt;
&lt;br /&gt;
Set the sun, sky, ambient light, and fog in &#039;&#039;&#039;Map Environment&#039;&#039;&#039;. Game SDKs decide which lighting and spatial bakes are required. Inspect the built map in the game: the Vertex viewport does not reproduce every game shader or baked lighting effect.&lt;br /&gt;
&lt;br /&gt;
== Entities and logic ==&lt;br /&gt;
&lt;br /&gt;
Choose an entity in the creation controls, place it, and edit its properties in the inspector. A point has a position and direction. A bounds entity defines a volume. A brush entity owns geometry placed under it in the hierarchy.&lt;br /&gt;
&lt;br /&gt;
Name entities before wiring them in [[Vertex/VSig|VSig]]. Game-specific reference pages explain their behavior; Grimwar&#039;s [[Grimwar/Entities|entity index]] covers every supplied type.&lt;br /&gt;
&lt;br /&gt;
== Validate and export ==&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;File → Validate map&#039;&#039;&#039; to find geometry, reference, asset, and collision problems. Validation reports problems without repairing the map.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export compiled meshes…&#039;&#039;&#039; writes &amp;lt;code&amp;gt;.vertexmesh&amp;lt;/code&amp;gt; for engine import. &#039;&#039;&#039;Export selection as model…&#039;&#039;&#039; writes OBJ or FBX geometry for other tools. Model export does not carry game entities, engine model placements, or collision. Use the game&#039;s Build controls for a playable package.&lt;br /&gt;
&lt;br /&gt;
Hidden objects still export. Hide and isolate are editing aids; delete an object or change its output settings when it should not ship.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Mapping&amp;diff=256</id>
		<title>Grimwar/Mapping</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Mapping&amp;diff=256"/>
		<updated>2026-10-02T18:10:17Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Document optional map settings and default music&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
Create the map in Vertex, build it with the Grimwar SDK, and test it in the installed game. Complete [[Grimwar/SDK setup#Install the SDK|SDK setup]] first.&lt;br /&gt;
&lt;br /&gt;
== Create and name the map ==&lt;br /&gt;
&lt;br /&gt;
Save a new map in a source folder you own, such as &amp;lt;code&amp;gt;Maps/my_arena/my_arena.vertex&amp;lt;/code&amp;gt;. Keep the companion script, thumbnail, and custom media there. Use &#039;&#039;&#039;File → Welcome… → Open repository…&#039;&#039;&#039; to find existing editable maps in a local checkout.&lt;br /&gt;
&lt;br /&gt;
The filename sets the map ID and exported add-on ID. &amp;lt;code&amp;gt;sb_developer.vertex&amp;lt;/code&amp;gt; produces &amp;lt;code&amp;gt;sb_developer&amp;lt;/code&amp;gt;, including the underscore. Set &#039;&#039;&#039;Map → Title&#039;&#039;&#039; to a readable display name. Changing the title does not rename the ID; &#039;&#039;&#039;Save As / Copy…&#039;&#039;&#039; with a different filename does.&lt;br /&gt;
&lt;br /&gt;
Choose an ID that does not collide with a built-in map or another installed add-on. An &amp;lt;code&amp;gt;sb_&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;koth_&amp;lt;/code&amp;gt;, or other filename prefix is a naming convention, not a game-mode switch. Choose the mode when hosting. The current Vertex SDK connection uses King of the Hill for its default playtest launch.&lt;br /&gt;
&lt;br /&gt;
== Build a playable space ==&lt;br /&gt;
&lt;br /&gt;
Start with a floor, walls, and a route between spawn areas. See [[Vertex/Editing]] for drawing, clipping, materials, models, terrain, and collision controls.&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Auto&#039;&#039;&#039; collision for ordinary geometry and inspect it with &#039;&#039;&#039;Shift+C&#039;&#039;&#039;. Box or Convex collision can seal a visible doorway. For moving doors and platforms, put their geometry beneath the corresponding entity in the hierarchy so it moves with the entity.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Prefabs&#039;&#039;&#039; browser includes a burn barrel and Order/Union spawn-door assemblies. Place an assembly to inspect how its models, triggers, doors, audio, and script host fit together. Linked instances remain editable.&lt;br /&gt;
&lt;br /&gt;
== Place spawns and objectives ==&lt;br /&gt;
&lt;br /&gt;
Use the entity creation controls and give the objects readable, stable names.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Purpose !! Entities and setup&lt;br /&gt;
|-&lt;br /&gt;
| Team spawn || [[Grimwar/Entities/info_player_spawn|info_player_spawn]]. Set Team explicitly; the default is Union. Provide usable spawns for each participating team.&lt;br /&gt;
|-&lt;br /&gt;
| King of the Hill or capture objectives || [[Grimwar/Entities/game_capture_point|game_capture_point]]. Set the starting owner and capture times.&lt;br /&gt;
|-&lt;br /&gt;
| Uplink || [[Grimwar/Entities/game_capture_flag|game_capture_flag]]. Configure the prerequisite graph and exactly one middle flag.&lt;br /&gt;
|-&lt;br /&gt;
| Blitz || [[Grimwar/Entities/game_blitz_tank|game_blitz_tank]] with path points and child [[Grimwar/Entities/game_blitz_checkpoint|checkpoints]].&lt;br /&gt;
|-&lt;br /&gt;
| Gravewar facilities || [[Grimwar/Entities/trigger_gravewar_skull_deposit|Skull deposit]] and [[Grimwar/Entities/trigger_gravewar_upgrade_zone|upgrade zone]].&lt;br /&gt;
|-&lt;br /&gt;
| Supplies || [[Grimwar/Entities/item_pickup|item_pickup]] or [[Grimwar/Entities/func_resupply|func_resupply]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The [[Grimwar/Entities|entity reference]] lists entity types. Its individual pages include placement, settings, defaults, and script signals.&lt;br /&gt;
&lt;br /&gt;
Volumes use their authored orientation and size. Keep a trigger large enough to overlap a player, and check its team/activator filters. A new &amp;lt;code&amp;gt;trigger_multiple&amp;lt;/code&amp;gt; has &#039;&#039;&#039;Allowed Teams: None&#039;&#039;&#039;, which blocks participants until you select the intended teams.&lt;br /&gt;
&lt;br /&gt;
== Optional map settings and music ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Map Settings&#039;&#039;&#039; (&amp;lt;code&amp;gt;info_map_settings&amp;lt;/code&amp;gt;) is optional. You can compile, export, and play a map without placing one or choosing music. Omitted settings use the game defaults; the default loading and gameplay score is &#039;&#039;&#039;Ordainment&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
To override the score, place one Map Settings entity and choose &#039;&#039;&#039;Compound&#039;&#039;&#039;, &#039;&#039;&#039;Ritual&#039;&#039;&#039;, &#039;&#039;&#039;Arcade&#039;&#039;&#039;, or &#039;&#039;&#039;Ordainment&#039;&#039;&#039; in &#039;&#039;&#039;Music Set&#039;&#039;&#039;. Leaving Music Set at &#039;&#039;&#039;Unassigned&#039;&#039;&#039; also uses Ordainment. The map filename and title do not select music.&lt;br /&gt;
&lt;br /&gt;
Do not put objects beneath Map Settings: the compiler reads its overrides and removes the settings object from the compiled scene. Duplicate settings entities and invalid music values remain build errors. A package with no &amp;lt;code&amp;gt;musicSet&amp;lt;/code&amp;gt; value also uses the default score.&lt;br /&gt;
&lt;br /&gt;
== Add logic and media ==&lt;br /&gt;
&lt;br /&gt;
Vertex associates a &amp;lt;code&amp;gt;.vsig&amp;lt;/code&amp;gt; script with the map. Use the Code workspace to connect entity outputs to inputs, such as a trigger opening a door. [[Grimwar/VSig]] gives a complete example.&lt;br /&gt;
&lt;br /&gt;
For C# behavior tied to this map, use &#039;&#039;&#039;Map → SDK resources → VMod → Create…&#039;&#039;&#039; or attach an existing resource inside the source folder. The map build includes it; you do not need a second installed package. See [[Grimwar/VMod#Attach a VMod to a map|map-bound VMods]].&lt;br /&gt;
&lt;br /&gt;
Use &#039;&#039;&#039;Map → Content…&#039;&#039;&#039; for custom sounds, models, textures, and data. References to another installed package become dependencies. See [[Grimwar/Custom content]].&lt;br /&gt;
&lt;br /&gt;
== Set lighting and a thumbnail ==&lt;br /&gt;
&lt;br /&gt;
Set the sky, sun, ambient light, and fog in Map Environment. Place &amp;lt;code&amp;gt;env_light&amp;lt;/code&amp;gt; entities for local lights. Use Mixed or Dynamic lighting for animated or scripted lights; Area lights are baked only.&lt;br /&gt;
&lt;br /&gt;
Choose a lightmap quality for your test. &#039;&#039;&#039;None&#039;&#039;&#039; skips lightmap/APV baking but does not skip Grimwar&#039;s required navigation, spatial, and occlusion work. Check the compiled lighting in the game.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;&#039;Map → Thumbnail&#039;&#039;&#039;, choose a PNG or JPEG. Vertex uses it for the add-on thumbnail and in-game map image. Use 1920 × 1080 for release artwork. Vertex copies an image from outside the source folder beside the map, so include that copy when sharing the source.&lt;br /&gt;
&lt;br /&gt;
== Compile and play ==&lt;br /&gt;
&lt;br /&gt;
# Save the map and any externally edited script or media files.&lt;br /&gt;
# Select &#039;&#039;&#039;Preview&#039;&#039;&#039; and your desktop target in Build.&lt;br /&gt;
# Select &#039;&#039;&#039;Play in Game&#039;&#039;&#039;. Vertex captures the inputs, compiles, installs the add-on, and launches Grimwar.&lt;br /&gt;
# In &#039;&#039;&#039;Addons&#039;&#039;&#039;, confirm the package is valid and enabled. Choose &#039;&#039;&#039;Use This Copy&#039;&#039;&#039; if a Workshop or older local copy is selected.&lt;br /&gt;
# Open &#039;&#039;&#039;Host&#039;&#039;&#039;, select the map and intended game mode, and use &#039;&#039;&#039;Local&#039;&#039;&#039; access for an unpublished build.&lt;br /&gt;
# Test collision, spawns, objectives, sounds, scripts, and more than one round. Reload the map to check initialization again.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Export add-on&#039;&#039;&#039; performs the build without launching the game. &#039;&#039;&#039;Open current output&#039;&#039;&#039; shows the generated package. Close a running playtest before replacing its loaded bundles.&lt;br /&gt;
&lt;br /&gt;
The default install location is Grimwar&#039;s user add-on library; [[Grimwar/Addons#Install a local package|Using add-ons]] lists the platform paths. You can choose a separate output folder in Build&#039;s Advanced settings for isolated tests.&lt;br /&gt;
&lt;br /&gt;
== Build for publishing ==&lt;br /&gt;
&lt;br /&gt;
Choose &#039;&#039;&#039;Release&#039;&#039;&#039; and export the map. Release includes Windows client, macOS client, and Linux dedicated-server output. Install every required Unity target module and resolve all build errors before publishing.&lt;br /&gt;
&lt;br /&gt;
Keep the generated folder intact. It contains &amp;lt;code&amp;gt;addon.json&amp;lt;/code&amp;gt;, platform files, and build receipts used to verify the package. Editing generated files breaks that verification; change the source and rebuild instead.&lt;br /&gt;
&lt;br /&gt;
Publish from Grimwar&#039;s Addons screen following [[Grimwar/Steam Workshop addons]]. Publish required media packs first. An unpublished local package has no download source for other players and is restricted to local testing.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/VSig_reference&amp;diff=255</id>
		<title>Grimwar/VSig reference</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/VSig_reference&amp;diff=255"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
This is the detailed VSig reference for Grimwar. Start with [[Grimwar/VSig|the door tutorial]] or [[Vertex/VSig|the language basics]]. Examples below show individual language features; keep the required refs and modules in your map when combining them.&lt;br /&gt;
&lt;br /&gt;
== Refs and groups ==&lt;br /&gt;
&lt;br /&gt;
A ref can match one hierarchy path or a wildcard:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ref main_door: func_door match BuildingA/Door&lt;br /&gt;
ref spawn_doors: func_door match SpawnDoors/Door*&lt;br /&gt;
&lt;br /&gt;
group exits:&lt;br /&gt;
    main_door&lt;br /&gt;
    spawn_doors&lt;br /&gt;
&lt;br /&gt;
on round.post_round:&lt;br /&gt;
    exits.close&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An input sent to a wildcard ref or group broadcasts to every match. Property reads and state capture require exactly one entity.&lt;br /&gt;
&lt;br /&gt;
Stable entity names make refs readable and keep wildcard matches predictable. VSig refs use the object hierarchy and entity class.&lt;br /&gt;
&lt;br /&gt;
== Entity lifecycle and operational state ==&lt;br /&gt;
&lt;br /&gt;
Every concrete map entity exposes the same terminal lifecycle:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Member !! Kind !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; || Input || Permanently remove this entity instance for the current map load.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;killed&amp;lt;/code&amp;gt; || Output || Fire once immediately before the runtime is removed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; is distinct from domain actions such as a damageable entity&#039;s &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;. A broken entity can be healed or reset; a killed entity returns only when the scene or map is loaded again. The server synchronizes terminal state to current clients and late joiners and records it in demo entity state. Client-local presentation entities use their owning client runtime.&lt;br /&gt;
&lt;br /&gt;
The SDK calls this operation &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;destroy&amp;lt;/code&amp;gt;. It does not expose hierarchy destruction because a Unity Transform hierarchy is an authoring relationship, not an entity-ownership boundary.&lt;br /&gt;
&lt;br /&gt;
Entities that declare the &#039;&#039;&#039;Operational&#039;&#039;&#039; capability also expose:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Member !! Kind !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; || Input || Make the entity operational.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; || Input || Make the entity non-operational.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || Input || Switch operational state.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; || Output || Fire on an actual disabled-to-enabled transition.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; || Output || Fire on an actual enabled-to-disabled transition.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;is_enabled&amp;lt;/code&amp;gt; || Property || Read the current operational state.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Repeated &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; calls succeed without emitting duplicate transition outputs. Operational state never calls &amp;lt;code&amp;gt;GameObject.SetActive&amp;lt;/code&amp;gt; and never changes Unity&#039;s component &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; property. The entity remains registered and applies its own behavior. For example, a disabled &amp;lt;code&amp;gt;func_damageable&amp;lt;/code&amp;gt; ignores gameplay damage but still accepts &amp;lt;code&amp;gt;heal&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;, operational inputs, and &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Keep more precise verbs when they carry different meaning. Doors remain &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;close&amp;lt;/code&amp;gt;, damageables remain &amp;lt;code&amp;gt;break&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt;, and continuous movers remain &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Activator, caller, and self ==&lt;br /&gt;
&lt;br /&gt;
Every entity signal carries immutable execution context:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;activator&amp;lt;/code&amp;gt; || Gameplay object that began the chain, such as the participant touching a trigger.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; || Map entity that invoked the current entity.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;self&amp;lt;/code&amp;gt; || Entity whose output handler or input is currently executing.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Use the procedural targets &amp;lt;code&amp;gt;!activator&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;!caller&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;!self&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ref entry_trigger: trigger_multiple match entry_trigger&lt;br /&gt;
ref first_gate: func_door match first_gate&lt;br /&gt;
&lt;br /&gt;
on entry_trigger.start_touch:&lt;br /&gt;
    first_gate.open&lt;br /&gt;
&lt;br /&gt;
on first_gate.open:&lt;br /&gt;
    !caller.disable&lt;br /&gt;
    !self.kill&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a player activates entity A and A invokes B, B receives the original player as &amp;lt;code&amp;gt;activator&amp;lt;/code&amp;gt;, A as &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt;, and B as &amp;lt;code&amp;gt;self&amp;lt;/code&amp;gt;. Each later entity invocation advances &amp;lt;code&amp;gt;caller&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;self&amp;lt;/code&amp;gt; while preserving the original activator. Procedures, waits, scheduled blocks, and delayed entity outputs preserve their originating context. Autonomous and global signals have no activator or caller.&lt;br /&gt;
&lt;br /&gt;
Targets resolve separately for every execution; there is no global last activator. A missing target produces a bounded warning and does nothing. Player and gameplay-object activators remain opaque provenance handles, so &amp;lt;code&amp;gt;!activator.kill&amp;lt;/code&amp;gt; cannot kill a player or arbitrary GameObject. Clients cannot forge handles or invoke server-owned entities through this path.&lt;br /&gt;
&lt;br /&gt;
== Values and expressions ==&lt;br /&gt;
&lt;br /&gt;
Primitive types are &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;. Entity state uses the state type declared by its marker contract. Durations accept seconds or milliseconds, including &amp;lt;code&amp;gt;1.5s&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;250ms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
seed 1847&lt;br /&gt;
&lt;br /&gt;
const max_score: int = 10&lt;br /&gt;
var score: int = 0&lt;br /&gt;
var title: string = &amp;quot;Arena&amp;quot;&lt;br /&gt;
&lt;br /&gt;
on button.pressed:&lt;br /&gt;
    score = clamp(score + 1, 0, max_score)&lt;br /&gt;
    label.set_text(&amp;quot;{0}: {1}/{2}&amp;quot;, title, score, max_score)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Strings must be quoted. Declare and initialize map variables and module state before use. Handler parameters and procedure parameters are immutable; assign mutable data to a map &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; or module &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Operators ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Precedence, high to low !! Operators !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| Grouping || &amp;lt;code&amp;gt;(expression)&amp;lt;/code&amp;gt; || Parentheses override normal precedence.&lt;br /&gt;
|-&lt;br /&gt;
| Unary || &amp;lt;code&amp;gt;-value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;not value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;!value&amp;lt;/code&amp;gt; || Numeric negation and logical negation.&lt;br /&gt;
|-&lt;br /&gt;
| Multiplicative || &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; || Division or remainder by zero produces an invalid expression value.&lt;br /&gt;
|-&lt;br /&gt;
| Additive || &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; concatenates when either operand is a string; otherwise both operands must be numeric.&lt;br /&gt;
|-&lt;br /&gt;
| Comparison || &amp;lt;code&amp;gt;==&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;gt;=&amp;lt;/code&amp;gt; || Ordering requires numbers. Non-numeric equality compares invariant text without case sensitivity.&lt;br /&gt;
|-&lt;br /&gt;
| Logical AND || &amp;lt;code&amp;gt;and&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/code&amp;gt; || Both operands are evaluated.&lt;br /&gt;
|-&lt;br /&gt;
| Logical OR || &amp;lt;code&amp;gt;or&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;#124;&amp;amp;#124;&amp;lt;/code&amp;gt; || Both operands are evaluated.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Falsey values are &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, numeric zero, an empty string, &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, and a missing value. Nonzero numbers, nonempty strings, and entity-state values are truthy.&lt;br /&gt;
&lt;br /&gt;
=== Built-in functions ===&lt;br /&gt;
&lt;br /&gt;
These 20 expression functions are available:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Function !! Result and constraints&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;abs(value)&amp;lt;/code&amp;gt; || Absolute numeric value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;bool(value)&amp;lt;/code&amp;gt; || Truthiness conversion using the rules above. A nonempty string, including &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt;, is truthy.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ceil(value)&amp;lt;/code&amp;gt; || Smallest integer greater than or equal to the numeric value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;choose(condition, when_true, when_false)&amp;lt;/code&amp;gt; || Returns the second or third value according to the condition&#039;s truthiness.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;clamp(value, minimum, maximum)&amp;lt;/code&amp;gt; || Numeric value constrained to the supplied bounds.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;convar(name)&amp;lt;/code&amp;gt; || Reads one content-accessible console variable. Use a quoted name such as &amp;lt;code&amp;gt;convar(&amp;quot;sv_gravity&amp;quot;)&amp;lt;/code&amp;gt;. The server allowlist and &amp;lt;code&amp;gt;sv_allow_content_commands&amp;lt;/code&amp;gt; policy apply.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;float(value)&amp;lt;/code&amp;gt; || Converts an integer, float, or invariant numeric string to a float.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;floor(value)&amp;lt;/code&amp;gt; || Greatest integer less than or equal to the numeric value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;format(pattern [, value1 [, value2]])&amp;lt;/code&amp;gt; || Invariant composite formatting. Example: &amp;lt;code&amp;gt;format(&amp;quot;{0}: {1:0.0}&amp;quot;, name, score)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;int(value)&amp;lt;/code&amp;gt; || Converts an integer, float, or invariant integer string to an integer. Float conversion truncates toward zero.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;lerp(a, b, t)&amp;lt;/code&amp;gt; || Unclamped linear interpolation from &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;. Values of &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; outside &amp;lt;code&amp;gt;0..1&amp;lt;/code&amp;gt; extrapolate.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max(value1 [, value2])&amp;lt;/code&amp;gt; || Maximum of one or more numeric arguments.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;min(value1 [, value2])&amp;lt;/code&amp;gt; || Minimum of one or more numeric arguments.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;random()&amp;lt;/code&amp;gt; || Random float from zero, inclusive, to one, exclusive.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;random(maximum)&amp;lt;/code&amp;gt; || Random float between zero and &amp;lt;code&amp;gt;maximum&amp;lt;/code&amp;gt;; reversed bounds are normalized.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;random(minimum, maximum)&amp;lt;/code&amp;gt; || Random float between the two bounds; reversed bounds are normalized.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;random_int(maximum)&amp;lt;/code&amp;gt; || Random integer from zero, inclusive, to &amp;lt;code&amp;gt;maximum&amp;lt;/code&amp;gt;, exclusive. Maximum must be greater than zero.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;random_int(minimum, maximum)&amp;lt;/code&amp;gt; || Random integer from &amp;lt;code&amp;gt;minimum&amp;lt;/code&amp;gt;, inclusive, to &amp;lt;code&amp;gt;maximum&amp;lt;/code&amp;gt;, exclusive. Maximum must be greater than minimum.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;remap(value, input_min, input_max, output_min, output_max)&amp;lt;/code&amp;gt; || Unclamped mapping between numeric ranges. Equal input bounds are invalid.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;round(value)&amp;lt;/code&amp;gt; || Rounds a numeric value to the nearest integer using the runtime&#039;s midpoint rule.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;shuffle(key, count)&amp;lt;/code&amp;gt; || Returns every integer in &amp;lt;code&amp;gt;0..count-1&amp;lt;/code&amp;gt; once in random order, then refills and reshuffles that key&#039;s bag. Count must be positive.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;string(value)&amp;lt;/code&amp;gt; || Converts a value to invariant text.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;time()&amp;lt;/code&amp;gt; || Current scaled game time in seconds.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The table has 20 function names; overload rows show the accepted forms of &amp;lt;code&amp;gt;random&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;random_int&amp;lt;/code&amp;gt;. A wrong argument count or incompatible value reports a runtime diagnostic and produces no usable value.&lt;br /&gt;
&lt;br /&gt;
Without &amp;lt;code&amp;gt;seed&amp;lt;/code&amp;gt;, each map runtime starts with fresh random entropy. A declared seed makes &amp;lt;code&amp;gt;random&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;random_int&amp;lt;/code&amp;gt;, and shuffle refills repeatable for the same execution order. Use a stable string key for a shared shuffle bag. Inside a module, &amp;lt;code&amp;gt;shuffle(self, count)&amp;lt;/code&amp;gt; gives each expanded module instance its own bag.&lt;br /&gt;
&lt;br /&gt;
=== Statement reference ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Form !! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;target.input&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;target.input(arguments)&amp;lt;/code&amp;gt; || Invoke an entity, group, or module input.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;call procedure(arguments)&amp;lt;/code&amp;gt; || Run a top-level procedure and wait for it to return.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;local_input(arguments)&amp;lt;/code&amp;gt; || Invoke an input or procedure inside the current module instance.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;name = expression&amp;lt;/code&amp;gt; || Assign a map &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; or module &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;. Constants and parameters are immutable.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;elif&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt; || Run one conditional branch.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;match&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;case&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; || Run the first equal case or the default branch.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wait duration&amp;lt;/code&amp;gt; || Suspend only the current handler, procedure, or scheduled block.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;schedule name after duration:&amp;lt;/code&amp;gt; || Start or replace one named delayed task.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;schedule name every duration [times count]:&amp;lt;/code&amp;gt; || Start or replace one named repeating task.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cancel name&amp;lt;/code&amp;gt; || Stop a named task if it exists.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;emit output(arguments)&amp;lt;/code&amp;gt; || Emit a declared module output.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;server_command(expression)&amp;lt;/code&amp;gt; || Run one allowlisted command from server authority.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Conditions and matching ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
on counter.changed(value: float):&lt;br /&gt;
    if value &amp;gt;= 10:&lt;br /&gt;
        door.open&lt;br /&gt;
    elif value &amp;gt; 0:&lt;br /&gt;
        light.on&lt;br /&gt;
    else:&lt;br /&gt;
        light.off&lt;br /&gt;
&lt;br /&gt;
    match int(value):&lt;br /&gt;
        case 1:&lt;br /&gt;
            label.set_text(&amp;quot;one&amp;quot;)&lt;br /&gt;
        case 2:&lt;br /&gt;
            label.set_text(&amp;quot;two&amp;quot;)&lt;br /&gt;
        default:&lt;br /&gt;
            label.set_text(&amp;quot;many&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indentation defines the statement block. A type mismatch, unknown name, invalid call, missing ref, or wrong handler payload is a compile error.&lt;br /&gt;
&lt;br /&gt;
== Choose server or client authority ==&lt;br /&gt;
&lt;br /&gt;
Handlers run on the server unless they begin with &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt;. Use server handlers for rules, collision, objectives, and state changes. Use client handlers only for presentation entities whose contract allows client access.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ref trigger: trigger_multiple match Trigger&lt;br /&gt;
ref door: func_door match Door&lt;br /&gt;
ref local_audio: env_ambient match LocalAudio&lt;br /&gt;
&lt;br /&gt;
server on trigger.start_touch:&lt;br /&gt;
    door.open&lt;br /&gt;
&lt;br /&gt;
client on door.open:&lt;br /&gt;
    local_audio.play&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Calls made by a handler keep that handler&#039;s authority. The compiler checks every entity input and output against its access rules. &amp;lt;code&amp;gt;server_command()&amp;lt;/code&amp;gt; works only from server authority.&lt;br /&gt;
&lt;br /&gt;
== Procedures, waits, and schedules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
def announce(message: string, delay: float = 0s):&lt;br /&gt;
    wait delay&lt;br /&gt;
    label.set_text(message)&lt;br /&gt;
&lt;br /&gt;
on round.live:&lt;br /&gt;
    call announce(&amp;quot;Fight!&amp;quot;, 0.25s)&lt;br /&gt;
    schedule heartbeat every 1s times 10:&lt;br /&gt;
        light.toggle&lt;br /&gt;
&lt;br /&gt;
on round.post_round:&lt;br /&gt;
    cancel heartbeat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Procedures and wait ===&lt;br /&gt;
&lt;br /&gt;
A procedure declaration uses &amp;lt;code&amp;gt;def&amp;lt;/code&amp;gt;, typed parameters, and optional defaults. &amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt; runs it inline: the caller resumes only after the procedure and all of its waits complete. Direct or indirect recursive calls are rejected at runtime.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;wait duration&amp;lt;/code&amp;gt; evaluates a non-negative duration once and suspends only the current execution chain. Other handlers and named schedules continue. A zero duration resumes on the next frame. A wait has no task name and cannot be cancelled independently; put the work in a named schedule when it needs a cancellation handle.&lt;br /&gt;
&lt;br /&gt;
=== Schedule syntax ===&lt;br /&gt;
&lt;br /&gt;
One-shot form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
schedule open_warning after 750ms:&lt;br /&gt;
    warning_light.on&lt;br /&gt;
    call announce(&amp;quot;Door opening&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeating forms:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
schedule heartbeat every 1s:&lt;br /&gt;
    light.toggle&lt;br /&gt;
&lt;br /&gt;
schedule countdown every 1s times 10:&lt;br /&gt;
    counter.subtract(1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The schedule name must be an identifier. The interval and optional count are expressions, so they can read constants, variables, module state, parameters, and built-in functions. &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt; cannot use &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Rule !! Runtime behavior&lt;br /&gt;
|-&lt;br /&gt;
| First execution || Both &amp;lt;code&amp;gt;after&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;every&amp;lt;/code&amp;gt; wait for the interval before running the block. Neither form runs immediately.&lt;br /&gt;
|-&lt;br /&gt;
| Duration || Negative or non-numeric durations stop the task with a diagnostic. Zero waits until the next frame.&lt;br /&gt;
|-&lt;br /&gt;
| Repeat count || A positive integer runs exactly that many times. Zero schedules nothing. A negative integer repeats until cancellation or map unload. Omitting &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;every&amp;lt;/code&amp;gt; is the same as an unlimited negative count.&lt;br /&gt;
|-&lt;br /&gt;
| Dynamic interval || An &amp;lt;code&amp;gt;every&amp;lt;/code&amp;gt; interval is re-evaluated before each iteration. &amp;lt;code&amp;gt;every random(0.5s, 1.5s)&amp;lt;/code&amp;gt; therefore chooses a new delay each time.&lt;br /&gt;
|-&lt;br /&gt;
| Deadline timing || Repeating schedules anchor each short wait to the previous scaled-time deadline, so ordinary frame overshoot does not accumulate into timer drift.&lt;br /&gt;
|-&lt;br /&gt;
| Long overruns || If a block, nested procedure, or wait runs past its next deadline, the scheduler coalesces the missed time and waits one fresh interval. It does not burst missed executions in one frame.&lt;br /&gt;
|-&lt;br /&gt;
| Replacement || Starting a schedule automatically cancels the task with the same name before registering the new one.&lt;br /&gt;
|-&lt;br /&gt;
| Cancellation || &amp;lt;code&amp;gt;cancel name&amp;lt;/code&amp;gt; stops the delay or running block. Cancelling a missing task is safe.&lt;br /&gt;
|-&lt;br /&gt;
| Locals and context || The task copies the handler or procedure&#039;s parameter values and preserves authority plus &amp;lt;code&amp;gt;!activator&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;!caller&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;!self&amp;lt;/code&amp;gt;. Map variables and module state remain live shared state.&lt;br /&gt;
|-&lt;br /&gt;
| Module scope || Schedule names declared inside a module are private to each expanded module instance. Two instances can both run &amp;lt;code&amp;gt;timer_loop&amp;lt;/code&amp;gt; without replacing each other.&lt;br /&gt;
|-&lt;br /&gt;
| Lifetime || All tasks stop when the map VSig runtime unloads.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This replacement behavior makes debounce straightforward:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
on trigger.trigger:&lt;br /&gt;
    schedule close_after_quiet after 2s:&lt;br /&gt;
        door.close&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Every new trigger restarts the two-second delay because it replaces &amp;lt;code&amp;gt;close_after_quiet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Milestone timelines ===&lt;br /&gt;
&lt;br /&gt;
Use parallel one-shot schedules when a stage has actions at specific times. Each deadline is measured from the event that starts the stage; it does not depend on a repeating timer&#039;s frame-measured elapsed value.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ref zombie_teleport: trigger_teleport match ZombieTeleport&lt;br /&gt;
ref spawn_door: func_door match SpawnDoor&lt;br /&gt;
ref zombie_door: func_door match ZombieDoor&lt;br /&gt;
&lt;br /&gt;
on round.pre_round:&lt;br /&gt;
    schedule island_intro after 1s:&lt;br /&gt;
        server_command(&amp;quot;gm_message major Defend this island for 90 seconds&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    schedule island_warning after 80s:&lt;br /&gt;
        server_command(&amp;quot;gm_message major 10 seconds until the gates open&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    schedule island_open after 90s:&lt;br /&gt;
        server_command(&amp;quot;gm_message major The gates are open. GOGOGO&amp;quot;)&lt;br /&gt;
        zombie_teleport.enable&lt;br /&gt;
        spawn_door.open&lt;br /&gt;
&lt;br /&gt;
    schedule island_release after 115s:&lt;br /&gt;
        zombie_teleport.disable&lt;br /&gt;
        zombie_door.open&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Running this handler again replaces all four named tasks and restarts the timeline. Give unrelated timelines distinct task names. Use an explicit guard such as a relay or latch when a repeatable entity output must not restart a stage.&lt;br /&gt;
&lt;br /&gt;
Cancel round-owned repeating work on &amp;lt;code&amp;gt;round.post_round&amp;lt;/code&amp;gt; or another lifecycle event that always closes the activity:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
on round.post_round:&lt;br /&gt;
    cancel heartbeat&lt;br /&gt;
    cancel countdown&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reusable modules ==&lt;br /&gt;
&lt;br /&gt;
A module contains parameters, private state, inputs, outputs, procedures, and handlers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
module capture_counter(start: float = 0, max_value: float = 10):&lt;br /&gt;
    state value: float = start&lt;br /&gt;
    output changed(value: float)&lt;br /&gt;
    output reached(value: float)&lt;br /&gt;
&lt;br /&gt;
    input add(amount: float = 1):&lt;br /&gt;
        value = min(value + amount, max_value)&lt;br /&gt;
        emit changed(value)&lt;br /&gt;
        if value &amp;gt;= max_value:&lt;br /&gt;
            emit reached(value)&lt;br /&gt;
&lt;br /&gt;
    input reset:&lt;br /&gt;
        value = start&lt;br /&gt;
        emit changed(value)&lt;br /&gt;
&lt;br /&gt;
use capture_counter as captures(max_value = 3)&lt;br /&gt;
&lt;br /&gt;
ref capture_point: game_capture_point&lt;br /&gt;
ref exit: func_door&lt;br /&gt;
&lt;br /&gt;
on capture_point.captured:&lt;br /&gt;
    captures.add&lt;br /&gt;
&lt;br /&gt;
on captures.reached(value: float):&lt;br /&gt;
    exit.open&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Module parameters are immutable configuration. State is private mutable data; read it as &amp;lt;code&amp;gt;instance.state_name&amp;lt;/code&amp;gt;. Inputs are typed procedures. Outputs carry typed payloads and work like entity outputs.&lt;br /&gt;
&lt;br /&gt;
Put shared modules in &amp;lt;code&amp;gt;.vsiglib&amp;lt;/code&amp;gt; files and import only the required module.&lt;br /&gt;
&lt;br /&gt;
=== Standard logic library ===&lt;br /&gt;
&lt;br /&gt;
The twelve standard logic modules are built into VSig. No library file, copy, or import is required. They work in both Vertex maps and existing Unity-authored maps. &amp;lt;code&amp;gt;use&amp;lt;/code&amp;gt; creates an instance with its own state:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
use counter as captures(max_value = 5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Give every instance a unique alias; using the same alias twice is an error. Explicitly declared or imported custom modules take precedence over built-ins with the same name. Game-specific modules such as &amp;lt;code&amp;gt;spawn_door_set&amp;lt;/code&amp;gt; still need their own library import.&lt;br /&gt;
&lt;br /&gt;
Existing imports remain compatible, including &amp;lt;code&amp;gt;Logic.vsiglib&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Packages/com.vellocet.sdk/Runtime/VSig/Libraries/Logic.vsiglib&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;Packages/com.vellocet.vertex/Runtime/VSig/Libraries/Logic.vsiglib&amp;lt;/code&amp;gt;. You can remove those imports when using the standard modules. An explicitly supplied custom library at one of those paths keeps its own definitions.&lt;br /&gt;
&lt;br /&gt;
These modules are compiled logic. They do not create GameObjects or network objects. Recompile a map after changing its script so its embedded program is updated.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module !! Use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt; || Add, subtract, set, clamp, and report a numeric value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;accumulator&amp;lt;/code&amp;gt; || Maintain an unclamped numeric total.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;relay&amp;lt;/code&amp;gt; || Gate, delay, or limit a string signal to one trigger.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;timer&amp;lt;/code&amp;gt; || Emit indexed ticks at fixed or randomized intervals.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;selector&amp;lt;/code&amp;gt; || Route a string to one of eight configured cases.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;random_selector&amp;lt;/code&amp;gt; || Pick a zero-based random or shuffled index.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; || Walk an integer range once or in a loop.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;latch&amp;lt;/code&amp;gt; || Model idempotent set and clear transitions.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || Store, flip, or directly set a boolean value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;state_machine&amp;lt;/code&amp;gt; || Track named state transitions and their previous value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;debounce&amp;lt;/code&amp;gt; || Emit only after a quiet delay following the latest trigger.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;cooldown&amp;lt;/code&amp;gt; || Accept one trigger, then reject triggers until ready again.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;counter(start: float = 0, min_value: float = 0, max_value: float = 1, step: float = 1, clamp_value: bool = true)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The exported &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; state starts at &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;. Each input that applies a value emits &amp;lt;code&amp;gt;changed(value)&amp;lt;/code&amp;gt;. It then emits &amp;lt;code&amp;gt;min_reached(value)&amp;lt;/code&amp;gt; when the result is at or below &amp;lt;code&amp;gt;min_value&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;max_reached(value)&amp;lt;/code&amp;gt; when it is at or above &amp;lt;code&amp;gt;max_value&amp;lt;/code&amp;gt;. When &amp;lt;code&amp;gt;clamp_value&amp;lt;/code&amp;gt; is true, applied values are clamped to the configured range.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;add(amount: float = step)&amp;lt;/code&amp;gt; || Add &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; to the current value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;subtract(amount: float = step)&amp;lt;/code&amp;gt; || Subtract &amp;lt;code&amp;gt;amount&amp;lt;/code&amp;gt; from the current value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;set(next_value: float)&amp;lt;/code&amp;gt; || Replace the current value.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; || Apply the configured &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;accumulator&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;accumulator(start: float = 0)&amp;lt;/code&amp;gt; exports its current &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;add(amount: float)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;set(next_value: float)&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; update that value and emit &amp;lt;code&amp;gt;changed(value: float)&amp;lt;/code&amp;gt;. It does not clamp or emit threshold signals; use &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt; when a range matters.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;relay&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;relay(enabled_on_load: bool = true, trigger_once: bool = false, delay: float = 0)&amp;lt;/code&amp;gt; exports &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;fired&amp;lt;/code&amp;gt; state. An accepted &amp;lt;code&amp;gt;trigger(value: string = &amp;quot;&amp;quot;)&amp;lt;/code&amp;gt; emits &amp;lt;code&amp;gt;triggered(value: string)&amp;lt;/code&amp;gt; immediately or after &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;. A new delayed trigger replaces the instance&#039;s pending delayed emission.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;trigger(value: string = &amp;quot;&amp;quot;)&amp;lt;/code&amp;gt; || Emit only while enabled and, when &amp;lt;code&amp;gt;trigger_once&amp;lt;/code&amp;gt; is true, only before the instance has fired.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; || Accept later triggers.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; || Reject later triggers and cancel a pending delayed emission.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; || Clear &amp;lt;code&amp;gt;fired&amp;lt;/code&amp;gt; and cancel a pending delayed emission without changing &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;timer&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;timer(interval: float = 1s, times: int = -1, lower_bound: float = interval, upper_bound: float = interval, start_on_load: bool = false)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;timer.tick&amp;lt;/code&amp;gt; for recurring gameplay milestones. Its one-based integer &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; advances exactly once for every delivered tick. The &amp;lt;code&amp;gt;elapsed&amp;lt;/code&amp;gt; value remains available for display, progress, and diagnostics, but it is measured scaled frame time and is not guaranteed to equal a whole number.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ref gate: func_door match Gate&lt;br /&gt;
&lt;br /&gt;
use timer as gate_timer(interval = 1s, times = 90, start_on_load = false)&lt;br /&gt;
&lt;br /&gt;
on round.live:&lt;br /&gt;
    gate_timer.restart&lt;br /&gt;
&lt;br /&gt;
on gate_timer.tick(index: int, elapsed: float, remaining: int):&lt;br /&gt;
    if index == 80:&lt;br /&gt;
        server_command(&amp;quot;gm_message major 10 seconds until the gates open&amp;quot;)&lt;br /&gt;
    if index == 90:&lt;br /&gt;
        gate.open&lt;br /&gt;
&lt;br /&gt;
on round.post_round:&lt;br /&gt;
    gate_timer.reset&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not compare &amp;lt;code&amp;gt;elapsed&amp;lt;/code&amp;gt; with exact equality, such as &amp;lt;code&amp;gt;elapsed == 90&amp;lt;/code&amp;gt;, because a frame may deliver the tick at &amp;lt;code&amp;gt;90.016&amp;lt;/code&amp;gt;. The compiler reports &amp;lt;code&amp;gt;VSIG_TIMER_ELAPSED_EQUALITY&amp;lt;/code&amp;gt; when a timer elapsed parameter is used with &amp;lt;code&amp;gt;==&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt;, or as the direct value of a &amp;lt;code&amp;gt;match&amp;lt;/code&amp;gt; block.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Behavior&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt; || Start a reset timer or resume a stopped timer from its preserved elapsed time, index, and remaining count. Calling it while running is safe and does nothing.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;stop&amp;lt;/code&amp;gt; || Cancel the active wait while preserving elapsed time, index, and remaining count.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;restart&amp;lt;/code&amp;gt; || Cancel, reset to index zero, and start from the beginning.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; || Cancel and restore elapsed time and index to zero without starting.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fire&amp;lt;/code&amp;gt; || Emit &amp;lt;code&amp;gt;tick&amp;lt;/code&amp;gt; immediately and advance the index without consuming a scheduled repeat.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || Stop a running timer or start/resume a stopped timer.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;set_interval(value: float)&amp;lt;/code&amp;gt; || Set one fixed non-negative interval for later waits.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;set_random_bounds(lower: float, upper: float)&amp;lt;/code&amp;gt; || Set normalized non-negative bounds; each wait samples a fresh interval.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;set_times(value: int)&amp;lt;/code&amp;gt; || Set the repeat count used by the next reset. When the timer is stopped, also replace its current remaining count. A negative count repeats until stopped or unloaded.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A finite timer emits &amp;lt;code&amp;gt;finished()&amp;lt;/code&amp;gt; after its last scheduled &amp;lt;code&amp;gt;tick(index: int, elapsed: float, remaining: int)&amp;lt;/code&amp;gt;. Call &amp;lt;code&amp;gt;restart&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;start&amp;lt;/code&amp;gt;, to run a completed timer again. The exported &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;remaining&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tick_index&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;elapsed&amp;lt;/code&amp;gt; states report status. &amp;lt;code&amp;gt;started_at&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;current_interval&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;current_lower_bound&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;current_upper_bound&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;repeat_count&amp;lt;/code&amp;gt; expose the backing schedule configuration; prefer the timer inputs when changing it.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;selector&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;selector(case_1: string = &amp;quot;&amp;quot;, case_2: string = &amp;quot;&amp;quot;, case_3: string = &amp;quot;&amp;quot;, case_4: string = &amp;quot;&amp;quot;, case_5: string = &amp;quot;&amp;quot;, case_6: string = &amp;quot;&amp;quot;, case_7: string = &amp;quot;&amp;quot;, case_8: string = &amp;quot;&amp;quot;)&amp;lt;/code&amp;gt; compares &amp;lt;code&amp;gt;select(value: string)&amp;lt;/code&amp;gt; with the configured cases in order. The first match emits &amp;lt;code&amp;gt;selected(index: int, value: string)&amp;lt;/code&amp;gt; with a one-based case index. No match emits &amp;lt;code&amp;gt;defaulted(value: string)&amp;lt;/code&amp;gt;. The module has no state.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;random_selector&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;random_selector(count: int = 2, shuffle_mode: bool = false)&amp;lt;/code&amp;gt; exposes &amp;lt;code&amp;gt;pick&amp;lt;/code&amp;gt; and emits &amp;lt;code&amp;gt;selected(index: int)&amp;lt;/code&amp;gt; with a zero-based index from &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; through &amp;lt;code&amp;gt;count - 1&amp;lt;/code&amp;gt;. The exported &amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt; state starts at &amp;lt;code&amp;gt;-1&amp;lt;/code&amp;gt; and records the last emitted index. &amp;lt;code&amp;gt;count&amp;lt;/code&amp;gt; must be positive.&lt;br /&gt;
&lt;br /&gt;
With &amp;lt;code&amp;gt;shuffle_mode = false&amp;lt;/code&amp;gt;, each pick is independent. With &amp;lt;code&amp;gt;shuffle_mode = true&amp;lt;/code&amp;gt;, the instance emits every index once in randomized order before refilling its private shuffle bag.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sequence(length: int = 1, start_index: int = 0, loop: bool = false)&amp;lt;/code&amp;gt; exports its current &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt;. While &amp;lt;code&amp;gt;index &amp;amp;lt; length&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; emits &amp;lt;code&amp;gt;step(index: int)&amp;lt;/code&amp;gt; and advances the index. Reaching the exclusive &amp;lt;code&amp;gt;length&amp;lt;/code&amp;gt; emits &amp;lt;code&amp;gt;finished()&amp;lt;/code&amp;gt;; a looping sequence then returns to &amp;lt;code&amp;gt;start_index&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; returns to &amp;lt;code&amp;gt;start_index&amp;lt;/code&amp;gt; without emitting an output.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;latch&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;latch(initial: bool = false)&amp;lt;/code&amp;gt; exports &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt; state and represents idempotent set/clear transitions.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Input !! Outputs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; || When inactive, set active and emit &amp;lt;code&amp;gt;latched()&amp;lt;/code&amp;gt; followed by &amp;lt;code&amp;gt;changed(true)&amp;lt;/code&amp;gt;. When already active, emit nothing.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt; || When active, clear active and emit &amp;lt;code&amp;gt;released()&amp;lt;/code&amp;gt; followed by &amp;lt;code&amp;gt;changed(false)&amp;lt;/code&amp;gt;. When already inactive, emit nothing.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; || Restore &amp;lt;code&amp;gt;initial&amp;lt;/code&amp;gt; and emit &amp;lt;code&amp;gt;changed(active)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;toggle(initial: bool = false)&amp;lt;/code&amp;gt; exports boolean &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; state. &amp;lt;code&amp;gt;flip&amp;lt;/code&amp;gt; inverts it, &amp;lt;code&amp;gt;set(value_to_set: bool)&amp;lt;/code&amp;gt; replaces it, and &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; restores &amp;lt;code&amp;gt;initial&amp;lt;/code&amp;gt;. Every input emits &amp;lt;code&amp;gt;changed(value: bool)&amp;lt;/code&amp;gt;, including &amp;lt;code&amp;gt;set&amp;lt;/code&amp;gt; when the supplied value already matches.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;state_machine&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;state_machine(initial: string = &amp;quot;&amp;quot;)&amp;lt;/code&amp;gt; exports &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;previous&amp;lt;/code&amp;gt; state. &amp;lt;code&amp;gt;set(next: string)&amp;lt;/code&amp;gt; does nothing when &amp;lt;code&amp;gt;next&amp;lt;/code&amp;gt; equals &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt;. A real transition updates both states, then emits &amp;lt;code&amp;gt;exited(previous: string)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;entered(current: string)&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;changed(previous: string, current: string)&amp;lt;/code&amp;gt; in that order. &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; records the old current value as &amp;lt;code&amp;gt;previous&amp;lt;/code&amp;gt;, restores &amp;lt;code&amp;gt;initial&amp;lt;/code&amp;gt;, and emits only &amp;lt;code&amp;gt;changed(previous, current)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;debounce&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;debounce(delay: float = 0.1s)&amp;lt;/code&amp;gt; exposes &amp;lt;code&amp;gt;trigger(value: string = &amp;quot;&amp;quot;)&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cancel&amp;lt;/code&amp;gt;. Each trigger replaces the pending wait. If no newer trigger or cancellation arrives during &amp;lt;code&amp;gt;delay&amp;lt;/code&amp;gt;, the module emits &amp;lt;code&amp;gt;fired(value: string)&amp;lt;/code&amp;gt; with the latest payload. It has no exported state.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;cooldown&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;cooldown(duration: float = 1s, ready_on_load: bool = true)&amp;lt;/code&amp;gt; exports &amp;lt;code&amp;gt;ready&amp;lt;/code&amp;gt; state. While ready, &amp;lt;code&amp;gt;trigger(value: string = &amp;quot;&amp;quot;)&amp;lt;/code&amp;gt; clears readiness, emits &amp;lt;code&amp;gt;fired(value: string)&amp;lt;/code&amp;gt;, waits for &amp;lt;code&amp;gt;duration&amp;lt;/code&amp;gt;, restores readiness, and emits &amp;lt;code&amp;gt;became_ready()&amp;lt;/code&amp;gt;. Triggers received while not ready do nothing. &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; cancels the wait, sets ready, and emits &amp;lt;code&amp;gt;became_ready()&amp;lt;/code&amp;gt; immediately.&lt;br /&gt;
&lt;br /&gt;
=== Shipped spatial helper ===&lt;br /&gt;
&lt;br /&gt;
Grimwar&#039;s Order and Union spawn-door prefabs include a &amp;lt;code&amp;gt;logic_script&amp;lt;/code&amp;gt; host for &amp;lt;code&amp;gt;spawn_door_set&amp;lt;/code&amp;gt;. Place one from Vertex&#039;s Prefabs browser. It binds the trigger, matching doors, and audio under that instance; you do not need a source-level import in the map script.&lt;br /&gt;
&lt;br /&gt;
The helper exposes &amp;lt;code&amp;gt;restore_initial_state&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt;. Give the host a unique explicit alias if the map script needs to call it. Keep the assembly&#039;s expected child hierarchy when editing it.&lt;br /&gt;
&lt;br /&gt;
== Spatial modules and logic_script ==&lt;br /&gt;
&lt;br /&gt;
A spatial module declares local refs and binds each instance to a scene hierarchy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
module gate:&lt;br /&gt;
    ref trigger: trigger_multiple&lt;br /&gt;
    ref door: func_door&lt;br /&gt;
&lt;br /&gt;
    on trigger.start_touch:&lt;br /&gt;
        door.open&lt;br /&gt;
&lt;br /&gt;
    input reset:&lt;br /&gt;
        door.close&lt;br /&gt;
&lt;br /&gt;
use gate as exits match Gates/Exit_*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A wildcard &amp;lt;code&amp;gt;use&amp;lt;/code&amp;gt; creates one module instance per matching root and a broadcast group named by the authored alias.&lt;br /&gt;
&lt;br /&gt;
Place a &amp;lt;code&amp;gt;logic_script&amp;lt;/code&amp;gt; marker when a map should configure a module without a source-level &amp;lt;code&amp;gt;use&amp;lt;/code&amp;gt;. Set the &amp;lt;code&amp;gt;.vsiglib&amp;lt;/code&amp;gt;, module name, alias, arguments, and local-ref binding mode on the marker. The compiler expands it into the same form as a written &amp;lt;code&amp;gt;use&amp;lt;/code&amp;gt;. It does not become a runtime entity.&lt;br /&gt;
&lt;br /&gt;
== Map and round lifecycle ==&lt;br /&gt;
&lt;br /&gt;
Lifecycle sources need no scene marker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
once on map.ready:&lt;br /&gt;
    doors.close&lt;br /&gt;
&lt;br /&gt;
on round.warmup:&lt;br /&gt;
    warmup_lights.on&lt;br /&gt;
&lt;br /&gt;
on round.pre_round:&lt;br /&gt;
    round_timer.reset&lt;br /&gt;
&lt;br /&gt;
on round.live:&lt;br /&gt;
    round_timer.start&lt;br /&gt;
&lt;br /&gt;
client on round.overtime:&lt;br /&gt;
    overtime_alarm.play&lt;br /&gt;
&lt;br /&gt;
on round.post_round:&lt;br /&gt;
    cancel heartbeat&lt;br /&gt;
&lt;br /&gt;
on round.intermission:&lt;br /&gt;
    doors.open&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Available lifecycle sources are &amp;lt;code&amp;gt;map.ready&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;round.warmup&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;round.pre_round&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;round.live&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;round.overtime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;round.post_round&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;round.intermission&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;once on map.ready&amp;lt;/code&amp;gt; to capture an authored entity&#039;s initial state or perform setup that must run once per map load.&lt;br /&gt;
&lt;br /&gt;
== Safe server commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;server_command()&amp;lt;/code&amp;gt; sends one command through the server&#039;s content-accessible command boundary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
once on map.ready:&lt;br /&gt;
    server_command(&amp;quot;mp_roundtime 3&amp;quot;)&lt;br /&gt;
    server_command(&amp;quot;sv_gravity -6&amp;quot;)&lt;br /&gt;
    server_command(&amp;quot;say Map rules loaded&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
on door.open:&lt;br /&gt;
    server_command(&amp;quot;gm_message major DOOR HAS BEEN OPENED&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The server allows a curated set of match timing, chat or HUD messages, round completion, friendly fire, movement tuning, class enforcement, and weapon-slot rules. It rejects semicolons, newlines, secret-like identifiers, and commands without the &amp;lt;code&amp;gt;ContentAccessible&amp;lt;/code&amp;gt; flag. The runtime restores changed console variables when the map unloads.&lt;br /&gt;
&lt;br /&gt;
Server operators can disable map commands with &amp;lt;code&amp;gt;sv_allow_content_commands 0&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;convar()&amp;lt;/code&amp;gt; reads use the same allowlist.&lt;br /&gt;
&lt;br /&gt;
== Snapshot a participant zone ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;trigger_multiple.execute&amp;lt;/code&amp;gt; captures the participants currently inside the volume and emits &amp;lt;code&amp;gt;executed&amp;lt;/code&amp;gt; with an opaque snapshot token. Use it for extraction zones and other one-shot outcomes that a VMod must award to specific occupants.&lt;br /&gt;
&lt;br /&gt;
Name the trigger and the entity that completes the objective, then connect them in the scene script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ref extraction_zone: trigger_multiple match ExtractionZone&lt;br /&gt;
ref extraction_door: func_door match ExtractionDoor&lt;br /&gt;
&lt;br /&gt;
server on extraction_door.close:&lt;br /&gt;
    extraction_zone.execute&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set &#039;&#039;&#039;Allowed Activators&#039;&#039;&#039; and &#039;&#039;&#039;Allowed Teams&#039;&#039;&#039; on the trigger so the snapshot includes only the intended participants. The &amp;lt;code&amp;gt;close&amp;lt;/code&amp;gt; output occurs after the door finishes closing. &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; still emits an empty snapshot when nobody is inside, which lets the game mode resolve a failed extraction deterministically.&lt;br /&gt;
&lt;br /&gt;
The subscribed VMod must call &amp;lt;code&amp;gt;context.VSig.GetParticipantSnapshot(token)&amp;lt;/code&amp;gt; during the matching callback. The token expires when signal dispatch returns. See [[Grimwar/VMod reference#Send signals to VSig|Send signals to VSig]] for the callback and objective-award example.&lt;br /&gt;
&lt;br /&gt;
== Signals shared with VMod ==&lt;br /&gt;
&lt;br /&gt;
VMods can emit a source under &amp;lt;code&amp;gt;mod:&amp;amp;lt;mod-id&amp;amp;gt;&amp;lt;/code&amp;gt;. Handle that signal like any other output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
on mod:community.hello.round_started(mode_id: string):&lt;br /&gt;
    status_label.set_text(&amp;quot;Mode: {0}&amp;quot;, mode_id)&lt;br /&gt;
&lt;br /&gt;
on mod:community.hello.stage.opened(index: int, gate_name: string):&lt;br /&gt;
    gate_counter.set(index)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first handler receives output &amp;lt;code&amp;gt;round_started&amp;lt;/code&amp;gt; from source &amp;lt;code&amp;gt;mod:community.hello&amp;lt;/code&amp;gt;. The second receives output &amp;lt;code&amp;gt;opened&amp;lt;/code&amp;gt; from child source &amp;lt;code&amp;gt;mod:community.hello.stage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A VMod can subscribe to a map entity or module output by source alias and output name. This exchange carries scalar values only. It does not expose scene objects to VMod code.&lt;br /&gt;
&lt;br /&gt;
== Compile and test ==&lt;br /&gt;
&lt;br /&gt;
Use the Code workspace to resolve syntax and binding errors, then build through &#039;&#039;&#039;Play in Game&#039;&#039;&#039; or &#039;&#039;&#039;Export add-on&#039;&#039;&#039;. The build validates against the entities captured for that map and embeds the compiled program. Save external source edits before starting the build.&lt;br /&gt;
&lt;br /&gt;
Check wildcard matches, exercise round handlers more than once, and cancel repeating schedules at their intended lifecycle boundary. Editing loose source beside an installed package does not change the compiled map.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:VSig]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Vertex/VSig&amp;diff=254</id>
		<title>Vertex/VSig</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Vertex/VSig&amp;diff=254"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VertexNav}}&lt;br /&gt;
&lt;br /&gt;
VSig connects events to actions in a map. Use it for triggers, doors, timers, and reusable map logic. The game SDK supplies the available entity classes and game events.&lt;br /&gt;
&lt;br /&gt;
== Open the map script ==&lt;br /&gt;
&lt;br /&gt;
Save a map with a game connection. Vertex creates and associates a companion &amp;lt;code&amp;gt;&amp;amp;lt;map_name&amp;amp;gt;.vsig&amp;lt;/code&amp;gt; when no entry script is selected. Choose &#039;&#039;&#039;Code → Map script&#039;&#039;&#039; to open it. Use &#039;&#039;&#039;Map → Choose map script…&#039;&#039;&#039; to select an existing entry file.&lt;br /&gt;
&lt;br /&gt;
Keep shared &amp;lt;code&amp;gt;.vsiglib&amp;lt;/code&amp;gt; files under the same source folder. &#039;&#039;&#039;More → New source…&#039;&#039;&#039; in Code creates another file there; creating it does not make it the map&#039;s entry script.&lt;br /&gt;
&lt;br /&gt;
The Code workspace checks syntax and bindings using the current map and SDK. A successful build performs the final validation and embeds the compiled program. Save scripts regularly: map recovery does not recover unsaved script edits.&lt;br /&gt;
&lt;br /&gt;
== Events and actions ==&lt;br /&gt;
&lt;br /&gt;
A handler starts with &amp;lt;code&amp;gt;on source.event:&amp;lt;/code&amp;gt;. Indented lines beneath it run when that event occurs. A &amp;lt;code&amp;gt;ref&amp;lt;/code&amp;gt; binds a short alias to an authored entity by class and hierarchy path.&lt;br /&gt;
&lt;br /&gt;
The game&#039;s entity reference defines valid inputs and outputs. For a complete trigger-to-door example, see [[Grimwar/VSig]]. A different game&#039;s SDK may use different class and signal names.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Inputs&#039;&#039;&#039; are actions a script calls. &#039;&#039;&#039;Outputs&#039;&#039;&#039; are events it listens to. Properties read a running entity&#039;s state. A ref can match several objects for broadcast actions, but a property read needs one unambiguous object.&lt;br /&gt;
&lt;br /&gt;
== Values and reusable logic ==&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;const&amp;lt;/code&amp;gt; for a fixed value, &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; for map state, and &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt; inside a reusable module. Primitive types are &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;. Quote strings and indent blocks consistently.&lt;br /&gt;
&lt;br /&gt;
VSig includes twelve standard logic modules: &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;accumulator&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;relay&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;selector&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;random_selector&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;latch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;state_machine&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;debounce&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cooldown&amp;lt;/code&amp;gt;. Use them directly; no library file or import is needed. These modules also work in existing Unity-authored maps that were made without Vertex.&lt;br /&gt;
&lt;br /&gt;
This complete script creates a counter instance and increments it once when the map is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
scene &amp;quot;Counter example&amp;quot;&lt;br /&gt;
&lt;br /&gt;
use counter as visits(max_value = 100)&lt;br /&gt;
&lt;br /&gt;
once on map.ready:&lt;br /&gt;
    visits.add&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each instance has its own state. Give every instance a unique alias. See [[Grimwar/VSig reference#Standard logic library|the standard module reference]] for parameters, inputs, and outputs.&lt;br /&gt;
&lt;br /&gt;
For custom behavior, declare a module or import one from a companion &amp;lt;code&amp;gt;.vsiglib&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
module visit_tracker(start: int = 0):&lt;br /&gt;
    state value: int = start&lt;br /&gt;
    output changed(value: int)&lt;br /&gt;
&lt;br /&gt;
    input add(amount: int = 1):&lt;br /&gt;
        value = value + amount&lt;br /&gt;
        emit changed(value)&lt;br /&gt;
&lt;br /&gt;
use visit_tracker as visits&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Move that module declaration into &amp;lt;code&amp;gt;Counters.vsiglib&amp;lt;/code&amp;gt; to share it, then import and instantiate it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
from &amp;quot;Counters.vsiglib&amp;quot; use visit_tracker&lt;br /&gt;
use visit_tracker as visits(start = 2)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explicitly declared or imported modules take precedence over built-in modules with the same name. Existing imports of &amp;lt;code&amp;gt;Logic.vsiglib&amp;lt;/code&amp;gt;, including the old SDK and Vertex package paths, remain supported. Custom library imports still resolve within the captured source files. A game may also supply a library through an SDK asset or prefab; its documentation explains how to bind that library.&lt;br /&gt;
&lt;br /&gt;
== Timing and authority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;wait 250ms&amp;lt;/code&amp;gt; pauses the current execution chain. A named &amp;lt;code&amp;gt;schedule&amp;lt;/code&amp;gt; runs delayed or repeating work and can be cancelled. Reusing a schedule name replaces the existing work. Cancel round-specific timers when the round ends.&lt;br /&gt;
&lt;br /&gt;
Handlers use server authority by default. Prefix a handler with &amp;lt;code&amp;gt;client&amp;lt;/code&amp;gt; for a presentation action whose entity contract allows client access. A client handler cannot grant itself server access.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;map.ready&amp;lt;/code&amp;gt; is the standard startup event. Other events, allowed commands, multiplayer rules, and entity behavior belong to the game SDK. They are not available just because a script uses their names.&lt;br /&gt;
&lt;br /&gt;
[[Category:Vertex]] [[Category:VSig]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Category:Vellocet_SDK&amp;diff=250</id>
		<title>Category:Vellocet SDK</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Category:Vellocet_SDK&amp;diff=250"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SDK setup now lives under Grimwar. See [[Grimwar/SDK setup|SDK setup]] or [[Grimwar|the Grimwar guides]].&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Category:Grimwar_entities&amp;diff=249</id>
		<title>Category:Grimwar entities</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Category:Grimwar_entities&amp;diff=249"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Settings and signal contracts for every current Grimwar entity. Browse [[Grimwar/Entities]].&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_water&amp;diff=248</id>
		<title>Grimwar/Entities/trigger water</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_water&amp;diff=248"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
[[Grimwar/Entities|All entities]]&lt;br /&gt;
&lt;br /&gt;
{{Entity icon|trigger_water|section}}&lt;br /&gt;
&lt;br /&gt;
Create a swimmable volume with a water surface.&lt;br /&gt;
&lt;br /&gt;
Placement: Oriented volume.&lt;br /&gt;
&lt;br /&gt;
== Set it up ==&lt;br /&gt;
&lt;br /&gt;
Resize the volume to fill the water area; its top face is the surface. Choose an optional Surface Material or leave it empty for the game default. Test entering, swimming, leaving, and transitions into nearby ladders. The entity has no water-specific script inputs.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
These are the initial authoring values. Script inputs and runtime state are listed separately below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Default !! Meaning and choices&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;surface_material&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Surface Material || &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt; || Optional material rendered across the water volume&#039;s upper face. When empty, the game uses its default water material. Reference: &amp;lt;code&amp;gt;material&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ignore_nav_mesh&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Ignore Nav Mesh || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Exclude this entity from navigation-mesh building. This does not disable its gameplay collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VSig contract ==&lt;br /&gt;
&lt;br /&gt;
Use the names below with a ref bound to this entity. The value column describes the catalog value type, not a C# method signature. See [[Grimwar/Entities#Read the reference|Read the reference]] for arguments, authority, and common controls.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kind !! Member !! Value !! Authority / access&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;killed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar entities]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_teleport&amp;diff=247</id>
		<title>Grimwar/Entities/trigger teleport</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_teleport&amp;diff=247"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
[[Grimwar/Entities|All entities]]&lt;br /&gt;
&lt;br /&gt;
{{Entity icon|trigger_teleport|section}}&lt;br /&gt;
&lt;br /&gt;
Move accepted occupants to a destination point.&lt;br /&gt;
&lt;br /&gt;
Placement: Oriented volume.&lt;br /&gt;
&lt;br /&gt;
== Set it up ==&lt;br /&gt;
&lt;br /&gt;
Place an info_teleport_destination, then select it in Destination. Choose whether to rotate occupants and preserve velocity. Rotate Velocity rotates preserved movement between the trigger and destination frames. teleport affects all valid current occupants; the teleport output fires for each successful target. Test the exit for collision and accidental immediate re-entry.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
These are the initial authoring values. Script inputs and runtime state are listed separately below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Default !! Meaning and choices&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;destination&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Destination || &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt; || Reference: &amp;lt;code&amp;gt;info_teleport_destination&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rotate_to_destination&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Rotate To Destination || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; || Face teleported objects and players along the destination&#039;s arrow direction.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;preserve_velocity&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Preserve Velocity || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Keep current movement velocity through the teleport.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rotate_velocity&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Rotate Velocity || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; || Rotate preserved velocity from this trigger&#039;s facing into the destination facing.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;required_tag&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Required Tag || &amp;lt;code&amp;gt;Empty&amp;lt;/code&amp;gt; || Value type: &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;allowed_teams&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Allowed Teams || All (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;) || Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Spectate (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Order (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Union (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), All (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;allowed_activators&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Allowed Activators || Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;) || Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Humans (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Bots (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;), Unassigned Pawns (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), All Pawns (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;), Non Pawns (&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;), Everything (&amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;start_disabled&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Start Disabled || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Value type: &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ignore_nav_mesh&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Ignore Nav Mesh || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Exclude this entity from navigation-mesh building. This does not disable its gameplay collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VSig contract ==&lt;br /&gt;
&lt;br /&gt;
Use the names below with a ref bound to this entity. The value column describes the catalog value type, not a C# method signature. See [[Grimwar/Entities#Read the reference|Read the reference]] for arguments, authority, and common controls.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kind !! Member !! Value !! Authority / access&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;teleport&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;killed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;teleport&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Property || &amp;lt;code&amp;gt;is_enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Server; read/write&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This entity supports operational enable/disable. Repeating the current state does not emit another transition. &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; is permanent for this map load.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar entities]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_spawn_zone&amp;diff=246</id>
		<title>Grimwar/Entities/trigger spawn zone</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_spawn_zone&amp;diff=246"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
[[Grimwar/Entities|All entities]]&lt;br /&gt;
&lt;br /&gt;
{{Entity icon|trigger_spawn_zone|section}}&lt;br /&gt;
&lt;br /&gt;
Register participants inside a team spawn zone.&lt;br /&gt;
&lt;br /&gt;
Placement: Oriented volume.&lt;br /&gt;
&lt;br /&gt;
== Set it up ==&lt;br /&gt;
&lt;br /&gt;
Set Allowed Teams and size the volume around the spawn area. The game mode uses this registry for spawn-zone behavior. force_respawn_occupants requests a respawn for every current participant. Use a team barrier separately when you need a physical boundary.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
These are the initial authoring values. Script inputs and runtime state are listed separately below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Default !! Meaning and choices&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;allowed_teams&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Allowed Teams || All (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;) || Participants outside these teams are ignored by this spawn zone. Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Spectate (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Order (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Union (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), All (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;start_disabled&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Start Disabled || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Start disabled until explicitly enabled.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ignore_nav_mesh&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Ignore Nav Mesh || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Exclude this entity from navigation-mesh building. This does not disable its gameplay collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VSig contract ==&lt;br /&gt;
&lt;br /&gt;
Use the names below with a ref bound to this entity. The value column describes the catalog value type, not a C# method signature. See [[Grimwar/Entities#Read the reference|Read the reference]] for arguments, authority, and common controls.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kind !! Member !! Value !! Authority / access&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;force_respawn_occupants&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;killed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Property || &amp;lt;code&amp;gt;is_enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Server; read only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This entity supports operational enable/disable. Repeating the current state does not emit another transition. &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; is permanent for this map load.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar entities]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_push&amp;diff=245</id>
		<title>Grimwar/Entities/trigger push</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_push&amp;diff=245"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
[[Grimwar/Entities|All entities]]&lt;br /&gt;
&lt;br /&gt;
{{Entity icon|trigger_push|section}}&lt;br /&gt;
&lt;br /&gt;
Accelerate occupants or give them a one-time velocity impulse.&lt;br /&gt;
&lt;br /&gt;
Placement: Oriented volume.&lt;br /&gt;
&lt;br /&gt;
== Set it up ==&lt;br /&gt;
&lt;br /&gt;
Continuous applies acceleration while occupied; On Enter gives an impulse. Push Angles uses local pitch and yaw: pitch -90 points up and yaw 90 points right. Clear Downward Velocity helps an upward push overcome a fall. push immediately affects current occupants, and set_speed clamps to zero or greater.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
These are the initial authoring values. Script inputs and runtime state are listed separately below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Default !! Meaning and choices&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;required_tag&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Required Tag || &amp;lt;code&amp;gt;Empty&amp;lt;/code&amp;gt; || Optional tag required on an activating collider.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;allowed_teams&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Allowed Teams || All (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;) || Participant teams this trigger may push. Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Spectate (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Order (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Union (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), All (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;allowed_activators&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Allowed Activators || Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;) || Kinds of collider that may activate this trigger. Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Humans (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Bots (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;), Unassigned Pawns (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), All Pawns (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;), Non Pawns (&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;), Everything (&amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Mode || Continuous (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) || Continuous applies acceleration while occupied; On Enter applies one velocity impulse. Choices: Continuous (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), On Enter (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Speed || &amp;lt;code&amp;gt;12&amp;lt;/code&amp;gt; || Acceleration per second or one-shot velocity impulse along Push Angles. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;push_angles&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Push Angles || &amp;lt;code&amp;gt;[0, 0]&amp;lt;/code&amp;gt; || Local push angles in degrees: X is pitch (-90 = up), Y is yaw (90 = right). Zero follows the marker&#039;s forward axis.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;clear_downward_velocity&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Clear Downward Velocity || &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; || Remove downward velocity before applying an upward push.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;start_disabled&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Start Disabled || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Value type: &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ignore_nav_mesh&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Ignore Nav Mesh || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Exclude this entity from navigation-mesh building. This does not disable its gameplay collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VSig contract ==&lt;br /&gt;
&lt;br /&gt;
Use the names below with a ref bound to this entity. The value column describes the catalog value type, not a C# method signature. See [[Grimwar/Entities#Read the reference|Read the reference]] for arguments, authority, and common controls.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kind !! Member !! Value !! Authority / access&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;set_speed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;killed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Property || &amp;lt;code&amp;gt;is_enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Server; read/write&lt;br /&gt;
|-&lt;br /&gt;
| Property || &amp;lt;code&amp;gt;speed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; || Server; read/write&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This entity supports operational enable/disable. Repeating the current state does not emit another transition. &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; is permanent for this map load.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar entities]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_multiple&amp;diff=244</id>
		<title>Grimwar/Entities/trigger multiple</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_multiple&amp;diff=244"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
[[Grimwar/Entities|All entities]]&lt;br /&gt;
&lt;br /&gt;
{{Entity icon|trigger_multiple|section}}&lt;br /&gt;
&lt;br /&gt;
Emit events as accepted objects enter, stay in, and leave a volume.&lt;br /&gt;
&lt;br /&gt;
Placement: Oriented volume.&lt;br /&gt;
&lt;br /&gt;
== Set it up ==&lt;br /&gt;
&lt;br /&gt;
Set Allowed Teams explicitly: its default None excludes participants. Allowed Activators separately chooses humans, bots, unassigned pawns, and other colliders. Layer hints only narrow physics candidates. start_touch_all fires when occupancy goes from zero to one; end_touch_all fires when the last occupant leaves. fire emits trigger for each occupant. touch_test emits touching or not_touching. reset clears and refreshes occupancy. execute emits a short-lived participant snapshot token for VMods; see [[Grimwar/VSig#Signals shared with VMod|VSig and VMod]].&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
These are the initial authoring values. Script inputs and runtime state are listed separately below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Default !! Meaning and choices&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;required_tag&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Required Tag || &amp;lt;code&amp;gt;Empty&amp;lt;/code&amp;gt; || Only colliders with this tag activate the trigger. Leave blank to allow any tag.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;allowed_teams&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Allowed Teams || None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) || Allow participants from these teams. None blocks all participants; unassigned pawns and other colliders still follow Allowed Activators. Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Spectate (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Order (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Union (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), All (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;allowed_activators&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Allowed Activators || Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;) || Participants are human or bot pawns. UnassignedPawns have a Pawn component with no participant. Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Humans (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Bots (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;), Unassigned Pawns (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), All Pawns (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;), Non Pawns (&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;), Everything (&amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer_hint_mode&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Layer Hint Mode || Auto From Activators (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) || Filters physics candidates; Allowed Activators still decides who triggers. Use SDK Layer Set for shared layers such as Item. Choices: Auto From Activators (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Sdk Layer Set (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), All (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer_hint_set&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Layer Hint Set || Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;) || Layers used when Layer Hint Mode is SDK Layer Set. Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Pawn (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Hitbox (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;), Item (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), Default (&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;), Shield (&amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt;), First Person (&amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt;), Trigger (&amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt;), Ragdoll (&amp;lt;code&amp;gt;128&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;start_disabled&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Start Disabled || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Ignore touches until enabled by input.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wait_seconds&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Wait Seconds || &amp;lt;code&amp;gt;0.2&amp;lt;/code&amp;gt; || Seconds between firings while occupied. Use 0.2 for typical triggers; 0 fires every frame. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;delay_seconds&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Delay Seconds || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || Delay (seconds) before the first OnTrigger after an activator enters. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fire_once&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Fire Once || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Disable after the first OnTrigger.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;touching_interval_seconds&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Touching Interval Seconds || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || Seconds between OnTouching events while occupied. 0 disables them. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ignore_nav_mesh&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Ignore Nav Mesh || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Exclude this entity from navigation-mesh building. This does not disable its gameplay collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VSig contract ==&lt;br /&gt;
&lt;br /&gt;
Use the names below with a ref bound to this entity. The value column describes the catalog value type, not a C# method signature. See [[Grimwar/Entities#Read the reference|Read the reference]] for arguments, authority, and common controls.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kind !! Member !! Value !! Authority / access&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;fire&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;touch_test&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;executed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;killed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;not_touching&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;touching&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;trigger&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Property || &amp;lt;code&amp;gt;is_enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Server; read only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This entity supports operational enable/disable. Repeating the current state does not emit another transition. &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; is permanent for this map load.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar entities]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_hurt&amp;diff=243</id>
		<title>Grimwar/Entities/trigger hurt</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_hurt&amp;diff=243"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
[[Grimwar/Entities|All entities]]&lt;br /&gt;
&lt;br /&gt;
{{Entity icon|trigger_hurt|section}}&lt;br /&gt;
&lt;br /&gt;
Damage or heal accepted occupants at an interval.&lt;br /&gt;
&lt;br /&gt;
Placement: Oriented volume.&lt;br /&gt;
&lt;br /&gt;
== Set it up ==&lt;br /&gt;
&lt;br /&gt;
Set Allowed Activators, Allowed Teams, and any Required Tag before choosing Damage and Damage Interval Seconds. Negative damage heals. Doubling With Forgiveness increases per-target damage while occupied; set a cap if needed. hurt_player identifies a player-health target, while hurt covers another damageable. set_damage also resets the current doubling values.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
These are the initial authoring values. Script inputs and runtime state are listed separately below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Default !! Meaning and choices&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;required_tag&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Required Tag || &amp;lt;code&amp;gt;Empty&amp;lt;/code&amp;gt; || Optional tag filter. If set, only colliders with this tag are processed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;allowed_teams&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Allowed Teams || All (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;) || Optional team mask filter for participant-owned activators. Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Spectate (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Order (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Union (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), All (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;allowed_activators&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Allowed Activators || Everything (&amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;) || Which activator categories can be affected. Participants are pawns controlled by humans or bots. Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Humans (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Bots (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;), Unassigned Pawns (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), All Pawns (&amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt;), Non Pawns (&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;), Everything (&amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer_hint_mode&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Layer Hint Mode || Auto From Activators (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) || Physics broad-phase hint only. Gameplay correctness still uses semantic activator filters. Use SDK Layer Set for deterministic cross-project hints like Item. Choices: Auto From Activators (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Sdk Layer Set (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), All (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;layer_hint_set&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Layer Hint Set || Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;) || Canonical SDK layer set used when Layer Hint Mode is SDK Layer Set. Choices: None (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Pawn (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;), Hitbox (&amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), Participants (&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;), Item (&amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt;), Default (&amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;), Shield (&amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt;), First Person (&amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt;), Trigger (&amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt;), Ragdoll (&amp;lt;code&amp;gt;128&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;start_disabled&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Start Disabled || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Start disabled (won&#039;t process touching entities) until enabled by input.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;damage&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Damage || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || Damage dealt each tick. Negative values heal instead of damaging.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;damage_interval_seconds&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Damage Interval Seconds || &amp;lt;code&amp;gt;0.5&amp;lt;/code&amp;gt; || Seconds between damage/heal ticks while touching. Minimum: &amp;lt;code&amp;gt;0.01&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Model || Normal (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;) || How per-target damage changes over time while continuously touching. Choices: Normal (&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;), Doubling With Forgiveness (&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;damage_cap_per_second&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Damage Cap Per Second || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || Maximum damage per second for DoublingWithForgiveness. 0 means uncapped. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ignore_nav_mesh&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Ignore Nav Mesh || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Exclude this entity from navigation-mesh building. This does not disable its gameplay collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VSig contract ==&lt;br /&gt;
&lt;br /&gt;
Use the names below with a ref bound to this entity. The value column describes the catalog value type, not a C# method signature. See [[Grimwar/Entities#Read the reference|Read the reference]] for arguments, authority, and common controls.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kind !! Member !! Value !! Authority / access&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;set_damage&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;touch_test&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;hurt&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;hurt_player&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;killed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;not_touching&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;touching&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Property || &amp;lt;code&amp;gt;is_enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Server; read only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This entity supports operational enable/disable. Repeating the current state does not emit another transition. &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; is permanent for this map load.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar entities]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_gravewar_upgrade_zone&amp;diff=242</id>
		<title>Grimwar/Entities/trigger gravewar upgrade zone</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_gravewar_upgrade_zone&amp;diff=242"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
[[Grimwar/Entities|All entities]]&lt;br /&gt;
&lt;br /&gt;
{{Entity icon|trigger_gravewar_upgrade_zone|section}}&lt;br /&gt;
&lt;br /&gt;
Open Gravewar upgrades for eligible players inside a volume.&lt;br /&gt;
&lt;br /&gt;
Placement: Oriented volume.&lt;br /&gt;
&lt;br /&gt;
== Set it up ==&lt;br /&gt;
&lt;br /&gt;
Place the volume where human Order participants should access the upgrade interface. The game mode supplies the eligibility rules. It also exposes generic trigger signals for map logic. Test entering and leaving the zone in Gravewar mode.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
These are the initial authoring values. Script inputs and runtime state are listed separately below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Default !! Meaning and choices&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;start_disabled&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Start Disabled || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Start disabled until enabled through an entity input.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wait_seconds&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Wait Seconds || &amp;lt;code&amp;gt;0.2&amp;lt;/code&amp;gt; || Seconds between OnTrigger emissions while an accepted object remains inside. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;delay_seconds&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Delay Seconds || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || Delay before the first OnTrigger emission after entry. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fire_once&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Fire Once || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Disable this volume after its first OnTrigger emission.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;touching_interval_seconds&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Touching Interval Seconds || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || Emit OnTouching at this interval while occupied. Zero disables it. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ignore_nav_mesh&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Ignore Nav Mesh || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Exclude this entity from navigation-mesh building. This does not disable its gameplay collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VSig contract ==&lt;br /&gt;
&lt;br /&gt;
Use the names below with a ref bound to this entity. The value column describes the catalog value type, not a C# method signature. See [[Grimwar/Entities#Read the reference|Read the reference]] for arguments, authority, and common controls.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kind !! Member !! Value !! Authority / access&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;fire&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;touch_test&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;executed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;killed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;not_touching&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;touching&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;trigger&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Property || &amp;lt;code&amp;gt;is_enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Server; read only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This entity supports operational enable/disable. Repeating the current state does not emit another transition. &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; is permanent for this map load.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar entities]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_gravewar_skull_deposit&amp;diff=241</id>
		<title>Grimwar/Entities/trigger gravewar skull deposit</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/Entities/trigger_gravewar_skull_deposit&amp;diff=241"/>
		<updated>2026-10-01T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;DocumentationBot: Version 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameNav}}&lt;br /&gt;
&lt;br /&gt;
[[Grimwar/Entities|All entities]]&lt;br /&gt;
&lt;br /&gt;
{{Entity icon|trigger_gravewar_skull_deposit|section}}&lt;br /&gt;
&lt;br /&gt;
Let Gravewar survivors bank carried skulls.&lt;br /&gt;
&lt;br /&gt;
Placement: Oriented volume.&lt;br /&gt;
&lt;br /&gt;
== Set it up ==&lt;br /&gt;
&lt;br /&gt;
Place the volume around the deposit area. Eligible survivors use Interact while inside it to bank skulls for the team. The game mode supplies participant filtering. This entity also has the generic trigger signals below; its trigger output alone is not a command to deposit arbitrary skulls. Test the facility in Gravewar mode.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
These are the initial authoring values. Script inputs and runtime state are listed separately below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Setting !! Default !! Meaning and choices&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;start_disabled&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Start Disabled || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Start disabled until enabled through an entity input.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wait_seconds&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Wait Seconds || &amp;lt;code&amp;gt;0.2&amp;lt;/code&amp;gt; || Seconds between OnTrigger emissions while an accepted object remains inside. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;delay_seconds&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Delay Seconds || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || Delay before the first OnTrigger emission after entry. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;fire_once&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Fire Once || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Disable this volume after its first OnTrigger emission.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;touching_interval_seconds&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Touching Interval Seconds || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || Emit OnTouching at this interval while occupied. Zero disables it. Minimum: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ignore_nav_mesh&amp;lt;/code&amp;gt;&amp;lt;br&amp;gt;Ignore Nav Mesh || &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || Exclude this entity from navigation-mesh building. This does not disable its gameplay collision.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== VSig contract ==&lt;br /&gt;
&lt;br /&gt;
Use the names below with a ref bound to this entity. The value column describes the catalog value type, not a C# method signature. See [[Grimwar/Entities#Read the reference|Read the reference]] for arguments, authority, and common controls.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kind !! Member !! Value !! Authority / access&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;enable&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;execute&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;fire&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;reset&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Input || &amp;lt;code&amp;gt;touch_test&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;disabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;end_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;executed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;killed&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;none&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;not_touching&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;start_touch_all&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;touching&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Output || &amp;lt;code&amp;gt;trigger&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; || Server&lt;br /&gt;
|-&lt;br /&gt;
| Property || &amp;lt;code&amp;gt;is_enabled&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt; || Server; read only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This entity supports operational enable/disable. Repeating the current state does not emit another transition. &amp;lt;code&amp;gt;kill&amp;lt;/code&amp;gt; is permanent for this map load.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar entities]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
</feed>