> ## Documentation Index
> Fetch the complete documentation index at: https://docs.viggle.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Unity Quickstart

> Install Viggle Splat Engine, run the sample, and load characters and animations.

export const downloadPlugin = async event => {
  const button = event.currentTarget;
  const originalLabel = button.textContent;
  button.disabled = true;
  button.textContent = "Preparing download…";
  try {
    const readPayload = source => {
      const startMarker = "<![CDATA[";
      const endMarker = "]]>";
      const start = source.indexOf(startMarker);
      const end = source.indexOf(endMarker, start + startMarker.length);
      if (start === -1 || end === -1) throw new Error("Invalid package payload");
      return source.slice(start + startMarker.length, end);
    };
    const response = await fetch("/downloads/com.viggle.splat-engine-0.1.10-hotreload-4.manifest.svg");
    if (!response.ok) throw new Error(`Download failed: ${response.status}`);
    const packageFile = JSON.parse(readPayload(await response.text()));
    if (!Array.isArray(packageFile.parts) || packageFile.parts.length === 0) {
      throw new Error("Invalid package payload");
    }
    const chunks = await Promise.all(packageFile.parts.map(async part => {
      const partResponse = await fetch(part);
      if (!partResponse.ok) {
        throw new Error(`Download part failed: ${partResponse.status}`);
      }
      const chunk = readPayload(await partResponse.text());
      if (typeof chunk !== "string") {
        throw new Error("Invalid package part");
      }
      return chunk;
    }));
    const binary = window.atob(chunks.join(""));
    const bytes = new Uint8Array(binary.length);
    for (let index = 0; index < binary.length; index += 1) {
      bytes[index] = binary.charCodeAt(index);
    }
    const blobUrl = URL.createObjectURL(new Blob([bytes], {
      type: packageFile.mimeType
    }));
    const link = document.createElement("a");
    link.href = blobUrl;
    link.download = packageFile.filename;
    document.body.appendChild(link);
    link.click();
    link.remove();
    window.setTimeout(() => URL.revokeObjectURL(blobUrl), 1000);
  } catch (error) {
    console.error(error);
    window.alert("The download could not be prepared. Please try again.");
  } finally {
    button.disabled = false;
    button.textContent = originalLabel;
  }
};

Viggle Splat Engine is a Unity runtime plugin for loading and rendering VFCHARB1 `.bin` Gaussian Splat characters in real time. It drives characters with Humanoid or Generic animations. Characters and animations are generated by Viggle services; the plugin does not generate characters itself.

<div className="plugin-download">
  <button type="button" className="plugin-download-button" onClick={downloadPlugin}>
    Download Viggle Splat Engine 0.1.10
  </button>

  <span className="plugin-download-meta">ZIP package · 11 MB</span>
</div>

## Recommended environment

| Item             | Configuration                   |
| ---------------- | ------------------------------- |
| Unity            | Unity 6.3 LTS `6000.3.20f1`     |
| GPU API          | Metal, DirectX 12, or Vulkan    |
| Render pipeline  | Universal Render Pipeline (URP) |
| Plugin           | Viggle Splat Engine `0.1.10`    |
| Character format | VFCHARB1 `.bin`                 |

<Warning>
  Unity 6.5 is not recommended. Older plugin versions may produce `CS0619` or `Failed to resolve assembly: GaussianSplattingEditor`. If you encounter these compilation errors, create a new project with Unity 6.3 LTS.
</Warning>

## 1. Create a Unity project

1. In Unity Hub, install Unity 6.3 LTS `6000.3.20f1`.
2. Create a project with the **Universal 3D** or **URP** template.
3. Wait for the initial Shader, Burst, and asset imports to finish.

No additional platform modules are required to run the sample. Install a platform build module only when you are ready to create a standalone application for that platform.

## 2. Install the plugin

1. Download and extract the ZIP package above.
2. In Unity, open **Window → Package Management → Package Manager**.
3. Click **+** in the upper-left corner and select **Add package from disk…**.
4. Open the extracted `com.viggle.splat-engine` folder and select `package.json`.
5. Wait for Unity to import and compile the package.

After installation, Package Manager displays **Viggle Splat Engine** with the Technical Name `com.viggle.splat-engine`.

<Frame>
  <img src="https://mintcdn.com/warpenginecanadainc/GJdRFtNSqt7vBKgh/screenshots/unity/annotated/07-package-manager-annotated.png?fit=max&auto=format&n=GJdRFtNSqt7vBKgh&q=85&s=9f7a2d51b1d4ad9ddba4021cfe9bc77c" alt="Viggle Splat Engine version and imported Examples in Unity Package Manager, highlighted with red boxes and an arrow" width="1343" height="768" data-path="screenshots/unity/annotated/07-package-manager-annotated.png" />
</Frame>

## 3. Import and run the sample

1. Select **Viggle Splat Engine** in Package Manager.
2. Open **Samples**, locate **Examples**, and click **Import**.
3. Open `Assets/Samples/Viggle Splat Engine/0.1.10/Examples/CharacterRender/SplatCharacterExample.unity`.

Before entering Play mode, add the rendering feature to the active URP Renderer Data:

1. Stop Play mode and locate the active Renderer Data in the Project panel, such as `Assets/Settings/PC/PC_High_Renderer`.
2. In the Inspector, find **Renderer Features** and click **Add Renderer Feature**.
3. Select **Gaussian Splat URP Feature**.
4. Keep Render Graph enabled. Do not add `URP_COMPATIBILITY_MODE`.
5. Enter Play mode. You can continue if the Console contains no red errors.

<Frame>
  <img src="https://mintcdn.com/warpenginecanadainc/5bw75T959J5I0jfg/screenshots/unity/annotated/06-urp-renderer-feature-annotated.png?fit=max&auto=format&n=5bw75T959J5I0jfg&q=85&s=ef9fad76945b58daa995db580008456c" alt="Gaussian Splat URP Feature enabled on PC High Renderer, highlighted with red boxes and an arrow" width="1346" height="768" data-path="screenshots/unity/annotated/06-urp-renderer-feature-annotated.png" />
</Frame>

<Note>
  If the `.bin` file is parsed and a Gaussian Splat Renderer is created but the Game view remains empty, the active Renderer Data is usually missing **Gaussian Splat URP Feature**.
</Note>

When the configuration is correct, the loaded character appears in the Game view:

<Frame>
  <img src="https://mintcdn.com/warpenginecanadainc/5bw75T959J5I0jfg/screenshots/unity/annotated/02-game-view-annotated.png?fit=max&auto=format&n=5bw75T959J5I0jfg&q=85&s=582e92701e19db51e531618f687e120c" alt="Gaussian Splat character displayed successfully in the Unity Game view, highlighted with a red box and arrow" width="1346" height="768" data-path="screenshots/unity/annotated/02-game-view-annotated.png" />
</Frame>

## 4. Load your own character

1. Stop Play mode and import a VFCHARB1 `.bin` file into `Assets/MyCharacters`. Its asset type should appear as **Splat Bin Asset**.
2. Create an empty GameObject named `MyCharacter`. Set Position to `0, 0, 0`, Rotation to `0, 90, 0`, and Scale to `1, 1, 1`.
3. Add **Splat Character Viewer** and drag the `.bin` asset into **Bin File**.
4. Enter Play mode. The Viewer automatically adds **Gaussian Splat Renderer**.

Select `MyCharacter` in the Hierarchy and confirm that the `.bin` assets are visible in the Project panel:

<Frame>
  <img src="https://mintcdn.com/warpenginecanadainc/5bw75T959J5I0jfg/screenshots/unity/annotated/01-scene-and-assets-annotated.png?fit=max&auto=format&n=5bw75T959J5I0jfg&q=85&s=ca24ed63d02dcc63746a6aa971f064eb" alt="MyCharacter in the Unity Hierarchy and character bin assets in the Project panel, highlighted with red boxes and arrows" width="1346" height="768" data-path="screenshots/unity/annotated/01-scene-and-assets-annotated.png" />
</Frame>

The Inspector should contain **Splat Character Viewer**, an assigned **Bin File**, and the generated **Gaussian Splat Renderer**:

<Frame>
  <img src="https://mintcdn.com/warpenginecanadainc/5bw75T959J5I0jfg/screenshots/unity/annotated/03-mycharacter-inspector-annotated.png?fit=max&auto=format&n=5bw75T959J5I0jfg&q=85&s=afcb6b66d4b6620622ac93ac74bc4441" alt="Splat Character Viewer, assigned Bin File, and Gaussian Splat Renderer on MyCharacter, highlighted with red boxes and arrows" width="1346" height="768" data-path="screenshots/unity/annotated/03-mycharacter-inspector-annotated.png" />
</Frame>

During testing, disable the sample characters and FBX preview objects so that only the Camera, Light, and `MyCharacter` remain active. This prevents a sample character from being mistaken for your imported character.

If changing the `.bin` file does not update the character, stop Play mode, disable the Skinner, disable and re-enable the Viewer, re-enable the Skinner, and enter Play mode again.

## 5. Understand the animation assets

An animation FBX can contain a model root, an Armature, preview meshes, and one or more Animation Clips. Expand the FBX in the Project panel to see its sub-assets.

| FBX sub-asset         | Purpose                                              |
| --------------------- | ---------------------------------------------------- |
| Model root            | The complete FBX asset and its hierarchy             |
| Armature              | The source skeleton that the animation curves target |
| Proxy or SkeletonMesh | Preview model nodes and their mesh data              |
| Animation Clip        | The motion that belongs in an Animator Controller    |

The Animation Clip has a triangular animation icon. Drag this clip into the Animator window. Do not drag the complete FBX, Armature, Proxy, or SkeletonMesh into the Animator Controller, and do not add the preview FBX to the scene unless you need it for comparison.

<Frame>
  <img src="https://mintcdn.com/warpenginecanadainc/GJdRFtNSqt7vBKgh/screenshots/unity/annotated/08-animation-fbx-subassets-annotated.png?fit=max&auto=format&n=GJdRFtNSqt7vBKgh&q=85&s=6938a75dd1d489b00afee0df53c926e0" alt="Expanded slap FBX with the slap Animation Clip highlighted by a red box and arrow" width="480" height="232" data-path="screenshots/unity/annotated/08-animation-fbx-subassets-annotated.png" />
</Frame>

## 6. Import and configure an animation FBX

1. Create a folder such as `Assets/MyCharacters/Animations` and copy the animation FBX into it.
2. Select the FBX in the Project panel and open the **Rig** tab in the Inspector.
3. Choose the animation type:

| Rig type | When to use it                                                                                      | Splat Character Skinner setting |
| -------- | --------------------------------------------------------------------------------------------------- | ------------------------------- |
| Humanoid | Mixamo, marketplace, motion-capture, or other general humanoid animations                           | `Humanoid`                      |
| Generic  | An animation authored on the exact Viggle canonical skeleton with matching bone names and hierarchy | `Generic`                       |

For Humanoid animations, set **Avatar Definition** to **Create From This Model**, click **Apply**, and use **Configure** if Unity reports an invalid bone mapping.

<Warning>
  The source FBX type and the Skinner Rig Mode must match. A Mixamo animation uses paths such as `mixamorig:Hips`, while the Viggle Generic skeleton uses paths such as `Armature/root/pelvis`. Playing the former as Generic can make the Splat character shake, twist, or move its joints incorrectly even when the FBX preview looks normal.
</Warning>

## 7. Create an Animator Controller

1. Stop Play mode.
2. In `Assets/MyCharacters/Animations`, right-click and select **Create → Animator Controller**.
3. Give the controller a descriptive name, such as `Chatting_AC`.
4. Double-click the controller to open the Animator window. A new controller initially contains only **Any State** and **Entry**.

<Frame>
  <img src="https://mintcdn.com/warpenginecanadainc/GJdRFtNSqt7vBKgh/screenshots/unity/annotated/09-new-animator-controller-annotated.png?fit=max&auto=format&n=GJdRFtNSqt7vBKgh&q=85&s=323ecae21dfe7fe21caab1aa3d5ea2b9" alt="A new Animator Controller selected in the Project panel with its empty Animator window highlighted" width="3024" height="1726" data-path="screenshots/unity/annotated/09-new-animator-controller-annotated.png" />
</Frame>

<Note>
  Store custom controllers outside `Assets/Samples`. Reimporting or deleting the package samples can replace files inside the Samples folder.
</Note>

## 8. Add an Animation Clip to the controller

1. Expand the animation FBX using the arrow beside its name.
2. Drag the Animation Clip—not the complete FBX—onto the Animator grid.
3. Select the new state and confirm that its **Motion** field references the correct clip.
4. The default state is orange and receives the arrow from **Entry**. If the state is gray, right-click it and select **Set as Layer Default State**.

<Frame>
  <img src="https://mintcdn.com/warpenginecanadainc/GJdRFtNSqt7vBKgh/screenshots/unity/annotated/10-animation-controller-state-annotated.png?fit=max&auto=format&n=GJdRFtNSqt7vBKgh&q=85&s=22c4c682bd57c4851a1b142f7b09e45d" alt="Animation Clip added as the orange default state in an Animator Controller, highlighted with a red box and arrow" width="3024" height="1726" data-path="screenshots/unity/annotated/10-animation-controller-state-annotated.png" />
</Frame>

The included samples use these pairings:

| Animation           | Animator Controller | Rig Mode |
| ------------------- | ------------------- | -------- |
| Texting and walking | `test_AC`           | Humanoid |
| Slap                | `generic`           | Generic  |

## 9. Assign the controller to a Splat character

1. Select `MyCharacter` or `SuomiCharacter` in the Hierarchy. Do not select the source FBX.
2. Add **Splat Character Skinner** if the character does not already have it.
3. Assign your controller to **Animator Controller**.
4. Set **Rig Mode** to the same type used by the animation FBX.
5. For initial testing, set **Pose Every N Frames** and **Sort Every N Frames** to `1`.
6. Enter Play mode and test in the Game view.

<Frame>
  <img src="https://mintcdn.com/warpenginecanadainc/5bw75T959J5I0jfg/screenshots/unity/annotated/04-animation-components-annotated.png?fit=max&auto=format&n=5bw75T959J5I0jfg&q=85&s=0d3f2c17038664c4adbd026593acafa4" alt="Animator Controller, Rig Mode, and frame settings on Splat Character Skinner, highlighted with red boxes and an arrow" width="1346" height="768" data-path="screenshots/unity/annotated/04-animation-components-annotated.png" />
</Frame>

## 10. Loop an animation

1. Select the animation FBX in the Project panel.
2. Open the **Animation** tab in the Inspector.
3. Select the clip in the **Clips** list.
4. Enable **Loop Time** and, for a smooth pose transition, **Loop Pose**.
5. Click **Apply**.
6. Keep this clip's state as the orange default state and do not create a transition from it to **Exit**.

If the character jumps when the loop restarts, enable **Bake Into Pose** for **Root Transform Rotation**, **Root Transform Position (Y)**, and **Root Transform Position (XZ)**. Adjust **Cycle Offset** only if the first and last poses still do not align.

## 11. Add multiple controllable actions

Drag additional clips into the same Animator Controller and create parameters such as:

| Parameter | Type    | Example use                         |
| --------- | ------- | ----------------------------------- |
| `Speed`   | Float   | Switch between Idle and Walk        |
| `Slap`    | Trigger | Play a one-shot slap from Any State |

Create transitions with conditions, for example **Idle → Walk** when `Speed > 0.1`, **Walk → Idle** when `Speed < 0.1`, and **Any State → Slap** when the `Slap` trigger is set. Enable **Has Exit Time** on **Slap → Idle** so the one-shot action can finish.

The plugin creates the Animator on its runtime rig. After the character has initialized, gameplay code can access it and set parameters:

```csharp theme={null}
Animator animator = GetComponentInChildren<Animator>();
animator.SetFloat("Speed", 1f);
animator.SetTrigger("Slap");
```

## Troubleshooting

| Problem                                                              | Solution                                                                                                                                            |
| -------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| Play mode is blocked by compilation errors                           | Inspect the first red error. For `CS0619` or assembly resolution errors, use Unity 6.3 LTS.                                                         |
| The Renderer exists, but the character is invisible                  | Check Gaussian Splat URP Feature, object enabled states, the Camera Culling Mask, and the character position.                                       |
| The character faces the wrong direction                              | Try Rotation Y values of `0`, `90`, `-90`, and `180`.                                                                                               |
| The static character looks correct but deforms during animation      | Match the animation to the Rig Mode: general-purpose animations use Humanoid; canonical skeleton animations use Generic.                            |
| The FBX preview is correct, but the Splat character shakes or twists | A Generic clip is targeting a different skeleton. Import Mixamo or general humanoid FBX files as Humanoid and set the Skinner Rig Mode to Humanoid. |
| The animation stops after one play                                   | Enable Loop Time on the FBX clip and remove any transition from the state to Exit.                                                                  |
| The character jumps when the loop restarts                           | Enable Loop Pose and Bake Into Pose for the root transform channels.                                                                                |
| You are unsure whether the asset loaded                              | Change the Viewer Render Mode from Splats to DebugPoints. Visible points confirm that the data loaded.                                              |

The icons in the upper-right corner of the Console show Log, Warning, and Error counts. The example below is a valid test state with `0 Error`; the Metal diagnostic warning does not block playback.

<Frame>
  <img src="https://mintcdn.com/warpenginecanadainc/5bw75T959J5I0jfg/screenshots/unity/annotated/05-console-annotated.png?fit=max&auto=format&n=5bw75T959J5I0jfg&q=85&s=b9d58ee9cf14af5b269d739707bb8a7f" alt="Unity Console Metal diagnostic warning and error counters, highlighted with red boxes and an arrow" width="1346" height="768" data-path="screenshots/unity/annotated/05-console-annotated.png" />
</Frame>

## Performance and limitations

* In scenes with multiple characters, set the Pose and Sort intervals of background characters to `2–4` and use Splat Character Lod.
* If performance is limited, begin testing with Splat Fraction `0.25–0.5` and Render Scale `0.5–0.75`.
* Splats are not affected by Unity lights, shadows, reflection probes, or lightmaps, and they do not write to the Z Buffer.
* The plugin does not support MSAA. Use Metal, DirectX 12, or Vulkan.

Before finishing, confirm that the Console has no red errors, your character is visible, the animation uses the correct Rig Mode, and the scene is saved outside Play mode.
