PrinterMake Studio

Professional 3D game and experience editor - Complete developer guide

Welcome to PrinterMake Studio — A powerful 3D editor with a Liquid Glass design system, integrated C# script editor, and native .prmk format. Create immersive games with real-time multiplayer, texture painting, and one-click publishing.

What is PrinterMake Studio?

PrinterMake Studio is a professional-grade 3D development environment that combines:

  • 3D Modeling & Scene Building — Create complex scenes with objects, textures, and lighting
  • Real-time Preview — See your game instantly as you build it
  • Visual & Code Scripting — Add interactivity without deep programming knowledge or dive into C# for advanced logic
  • Multiplayer Support — Build games for friends with built-in networking
  • One-Click Publishing — Share your creation with the community instantly

Studio Interface Overview

The Studio interface is divided into key sections:

🎨 Viewport (Center)

The 3D view where you build and edit your scene. Move, rotate, scale objects, and preview gameplay in real-time.

📂 Explorer (Left)

Hierarchical tree view of all objects in your scene. Organize, select, and manage objects easily.

⚙️ Properties (Right)

Detailed editor for object properties: transform, appearance, physics, scripts, and more.

🎛️ Menu Bar (Top)

Access to File operations, Insert objects, View options, and Tools.

Quick Start Path

  1. Create a Project — Choose a template (Starter Scene or Flat Baseplate)
  2. Explore the Layout — Familiarize yourself with the four main panels
  3. Add Objects — Use Insert menu to add 3D shapes
  4. Customize Properties — Change colors, materials, and positions
  5. Add Interactivity — Use visual scripts or C# for gameplay logic
  6. Test Your Game — Click Play to enter gameplay mode
  7. Publish — Share with the world

Studio Editor - Complete Guide

Master every aspect of the PrinterMake Studio interface and workflows

The Four Panels Explained

1. Viewport (Center Panel)

The main 3D view where all the magic happens. This is your canvas for building.

Viewport Controls

  • Middle Mouse Drag — Rotate view around scene
  • Mouse Wheel — Zoom in/out
  • Right Click + Drag — Pan camera
  • Click on Objects — Select object (highlighted with outline)
  • Spacebar — Frame selected object in view
Pro Tip: Use the grid background to judge distances and alignments. Press V to toggle the grid visibility.

2. Explorer Panel (Left)

Shows your scene's object hierarchy. Organize your scene structure here.

Explorer Features

  • Expand/Collapse — Click arrow to show child objects
  • Select Objects — Click name to select in viewport
  • Right-Click Menu — Delete, duplicate, or rename objects
  • Drag to Reorder — Parent objects by dragging
  • Eye Icon — Toggle object visibility
  • Lock Icon — Prevent accidental movement

3. Properties Panel (Right)

The most important panel. Here you configure everything about your selected object.

Property Sections

Transform
Position, rotation, and scale of the object
Appearance
Color, material type, texture, and visual effects
Physics
Collision, gravity, and movement properties
Script
Add visual or C# scripts for interactivity

4. Top Menu Bar

Access all commands and tools from here.

File

  • New Project
  • Export .prmk
  • Import .prmk
  • Import Roblox XML (.rbxlx)

Insert

  • Part (Box)
  • Sphere
  • Cylinder
  • Mirror
  • Spawn Point

View

  • Show Grid
  • Reset Camera
  • Graphics Quality

Transforming Objects

The Transform section is how you position, rotate, and scale objects.

1

Position (X, Y, Z)

Controls where the object is in 3D space. Measured in units.

  • X-Axis — Left/Right movement
  • Y-Axis — Up/Down movement
  • Z-Axis — Forward/Backward movement
2

Rotation (X, Y, Z)

How much the object is rotated on each axis. In degrees (0-360).

  • X Rotation — Pitch (tip forward/back)
  • Y Rotation — Yaw (spin left/right)
  • Z Rotation — Roll (tilt side-to-side)
3

Scale

Uniform or per-axis scaling. 1.0 = normal size, 2.0 = double size.

  • Uniform — Scale equally on all axes
  • Per-Axis — Scale X, Y, Z independently
Note: Very large or very small scales (< 0.1 or > 100) can cause physics issues. Keep scales reasonable.

Materials & Appearance

Colors

Click the color box to open the color picker. Adjust hue, saturation, and brightness.

Material Types (matches Studio Properties)

Material Description Use Case
SmoothPlastic Shiny, smooth surface with subtle reflections Furniture, tech items, clean surfaces
RoughPlastic Matte, low-reflectance plastic Grips, handles, matte surfaces
Metal Reflective, metallic appearance Machinery, robots, industrial objects
Wood Warm, slightly textured matte Structures, platforms, natural elements
Neon Emissive glow — object emits its own light Signs, indicators, decorative glow
Glass Transparent, reflective surface Windows, screens, glass objects
Grass Natural ground texture Baseplates, terrain, floors
Marble Polished stone look Floors, pillars, decorative
Concrete Rough, industrial texture Walls, paths, urban builds
Ice Translucent, icy appearance Frozen surfaces, effects

Textures

Upload custom images to cover object surfaces with detailed patterns.

1

Select an object in the Viewport or Explorer

2

In Properties → Appearance section, click "Upload Texture"

3

Choose an image file (PNG, JPG, etc.) from your computer

4

Texture preview appears below button

Texture Tips:
  • Use 1024x1024 or smaller for best performance
  • PNG for transparency, JPG for solid images
  • Seamless/tileable textures work best

Physics Configuration

Collision

  • On — Object blocks other objects and players
  • Off — Object is transparent to physics (can walk through)
  • Trigger — No collision but fires script events when touched

Gravity

  • Static — Never falls (floor, walls, ceiling)
  • Dynamic — Falls due to gravity (moveable objects)

Density

How heavy the object is. Higher = heavier. Affects falling speed and collisions.

Objects & Objects Types

Complete reference for all available objects in PrinterMake Studio

Basic Shapes

Box (Part)

A rectangular 3D shape. Insert via Insert → Part. Most versatile object for building.

  • Perfect for walls, platforms, buildings
  • Can be scaled on individual axes for rectangles
  • Supports all material types and textures

Sphere

A perfect ball-shaped object. Insert via Insert → Sphere.

  • Great for decorative elements, collectibles
  • Use for obstacles, targets, interactive elements
  • Spheres work great with physics

Cylinder

A pillar-shaped object with circular top and bottom. Insert via Insert → Cylinder.

  • Use for poles, posts, pillars
  • Scale height to make thin or tall
  • Rotate for creative structures

Special Objects

SpawnPoint

Defines where players appear when they join your game. Insert via Insert → Spawn Point.

  • Appears as a small colored cube in the editor
  • Every game must have at least one SpawnPoint
  • Multiple SpawnPoints = players spawn at random one
  • Adjust Y position to prevent players spawning inside objects
Important: If you don't have a SpawnPoint, players cannot join your game!

Mirror

A reflective surface that players can see themselves in. Insert via Insert → Mirror.

  • Great for immersion and realism
  • Use in bathrooms, bedrooms, hallways
  • Scale like boxes to fit any space

Lighting (Service)

Global scene lighting is controlled via the Lighting service in the Explorer — not an insertable object. Select Lighting to adjust:

  • Ambient — Base scene color
  • Sky — Outdoor/sky color
  • Sun Intensity — Directional light strength
  • Graphics Quality — Low, Medium, High, Ultra

Best Practices for Object Layout

  • Use organized naming — Name objects clearly (Floor, Wall_Left, Door_01)
  • Parent related objects — Group doors, walls, furniture together
  • Lock static objects — Prevent accidental movement
  • Use layers wisely — Separate gameplay elements from decoration
  • Keep objects aligned — Use grid snapping for clean layouts
  • Avoid overlapping collision — Objects shouldn't intersect

Object Properties Deep Dive

Complete reference for every property and setting

Transform Properties

Position X, Y, Z
Object location in 3D space. Can be negative values.
Rotation X, Y, Z
Object orientation in degrees. 0-360 for each axis.
Scale X, Y, Z
Object size multiplier. 1.0 is default, 0.5 is half size, 2.0 is double.

Appearance Properties

Color
RGB or HSV color picker. Click swatch to open picker.
Material
SmoothPlastic, RoughPlastic, Metal, Wood, Neon, Glass, Grass, Marble, Concrete, Ice. Affects how light reflects.
Texture
Upload image file to cover surface. Shows preview.
Transparency
0 = fully opaque, 100 = fully transparent (ghost).

Physics Properties

Collision Type
On (solid), Off (transparent), or Trigger (fires events).
Gravity Type
Static (fixed) or Dynamic (affected by gravity).
Density
1-10 scale. Affects weight and fall speed.
Friction
0-1. Higher = more slippery. Use 0.5 for default.

Scripting & Interactivity

Add behavior to your objects with visual or C# scripts

Three Scripting Systems

Visual Scripting

Event-based system. No coding knowledge required. Perfect for simple interactions.

Drag events → actions → done

C# Scripting

Full programming language. Create complex game logic. Requires programming knowledge.

Full control, unlimited power

UI & GUI Scripting

Create interactive HTML/CSS overlays. Control from HTML and reference game objects.

Web-based interface for your game

Visual Scripts

Select object → Properties → Script → "+ Visual Script"

Events (matches Studio Visual Script)

Event Triggers When Example
onTouch Player walks into the object Collectible item disappears
onPress Player presses E nearby Door opens, switch toggles
onTimer Repeats every N seconds Platform appears after 3 seconds
onStart When game starts Play welcome message

Actions (matches Studio Visual Script)

Action What It Does Parameters
Move Change object position X, Y, Z coordinates
Rotate Rotate object Rotation angles
Toggle Toggle visibility None
Color Change object color RGB values
Message Display text message Text string
Animate Float animation Amplitude, speed
Destroy Delete (hide) object None
Teleport Teleport player Position

C# Scripting - Complete API Reference

Select object → Properties → Script → "⚙ C# Script" to open the integrated C# editor.

Basic Template (matches Studio editor)

using PrinterMake.GameObjects;
using PrinterMake.Events;

public class MyGameObject : GameBehavior {
  void OnStart() {
    // Called when the game starts
    Debug.Log("Game started!");
  }

  void OnUpdate() {
    // Called every frame — use Input.GetKey for WASD
    if (Input.GetKey("W")) {
      GetComponent<Transform>().position.z += 0.1f;
    }
  }

  void OnTouch(GameObject other) {
    // Called when another object touches this one
    Debug.Log($"Touched by {other.name}");
  }

  void OnPress(int key) {
    // Called when player presses E (key = 69)
    Debug.Log("Pressed!");
  }
}
Lifecycle methods: OnStart, OnUpdate, OnTouch, OnPress — these match the Studio C# script editor template.

API Reference with Examples

1. Transform API

Control object position, rotation, and scale via GetComponent<Transform>().

Position
Get/set object location in 3D space
// Get current position
var t = GetComponent<Transform>();
Debug.Log("Position: " + t.position.x + ", " + t.position.y + ", " + t.position.z);

// Set new position
t.position = new Vector3(0, 5, 10);

// Move relative to current position
t.position += new Vector3(1, 0, 0);
Rotation
Get/set object rotation in degrees
var t = GetComponent<Transform>();

// Rotate object (in degrees)
t.rotation = new Vector3(45, 90, 0);

// Spin object continuously (in OnUpdate)
t.rotation += new Vector3(0, 2, 0);
Scale
Get/set object size
var t = GetComponent<Transform>();

// Double the size
t.scale = new Vector3(2, 2, 2);

// Make it smaller
t.scale = new Vector3(0.5, 0.5, 0.5);

2. Vector3 API

3D coordinate system with X, Y, Z values.

// Create a vector
Vector3 forward = new Vector3(0, 0, 1);
Vector3 up = new Vector3(0, 1, 0);

// Vector math
Vector3 combined = forward + up;
Vector3 scaled = forward * 2;

// Useful constants
Vector3 zero = Vector3.Zero;          // (0, 0, 0)
Vector3 one = Vector3.One;            // (1, 1, 1)
Vector3 right = Vector3.Right;        // (1, 0, 0)
Vector3 forward = Vector3.Forward;    // (0, 0, 1)
Vector3 up = Vector3.Up;              // (0, 1, 0)

3. Input API

Handle keyboard and mouse input from players.

Key Detection
Use Input.GetKey("key") for held keys (WASD, Space, etc.)
// Detect key being held (every frame)
if (Input.GetKey("W")) {
    GetComponent<Transform>().position.z += 0.1f;
}

// Common keys: "W", "A", "S", "D", "Space", "E", "Shift"
Movement Input
Handle WASD movement in OnUpdate
float moveSpeed = 5f;

void OnUpdate() {
    float forward = 0;
    float right = 0;
    
    if (Input.GetKey("W")) forward += 1;
    if (Input.GetKey("S")) forward -= 1;
    if (Input.GetKey("A")) right -= 1;
    if (Input.GetKey("D")) right += 1;
    
    var t = GetComponent<Transform>();
    Vector3 movement = (Vector3.Forward * forward + Vector3.Right * right) * moveSpeed;
    t.position += movement * Time.deltaTime;
}

4. Time API

Frame timing and delta time for smooth animations.

// Time since last frame (smooth animation)
void OnUpdate() {
    float speed = 5f;
    GetComponent<Transform>().position.x += speed * Time.deltaTime;
}

// Get total time since game start
float elapsed = Time.totalTime;

// Get current frame rate
int fps = Time.frameRate;

5. Debug API

Log messages to the console for debugging.

// Simple log
Debug.Log("Hello!");

// Log with variables
Debug.Log("Position: " + this.transform.position);

// Log warnings (yellow)
Debug.LogWarning("Be careful!");

// Log errors (red)
Debug.LogError("Something went wrong!");

6. GameObject API

Access and manipulate the current game object.

// Get object name
string name = gameObject.name;

// Enable/disable object
gameObject.SetActive(true);
gameObject.SetActive(false);

// Destroy this object
GameObject.Destroy(gameObject);

Complete Script Examples

Example 1: Door (OnUpdate)

public class DoorScript : GameBehavior {
    float openY = 5f;
    float closeY = 0f;
    float speed = 2f;
    bool isOpen = false;

    void OnStart() {
        isOpen = false;
    }

    void OnUpdate() {
        if (Input.GetKey("E")) {
            isOpen = !isOpen;
        }

        var t = GetComponent<Transform>();
        float targetY = isOpen ? openY : closeY;
        float current = t.position.y;
        t.position = new Vector3(t.position.x, current + (targetY - current) * speed * Time.deltaTime, t.position.z);
    }
}

Example 2: Rotating Platform

public class RotatingPlatform : GameBehavior {
    float rotationSpeed = 45f; // degrees per second

    void OnUpdate() {
        var t = GetComponent<Transform>();
        t.rotation += new Vector3(0, rotationSpeed * Time.deltaTime, 0);
    }
}

Example 3: Collectible Item (OnTouch)

public class Collectible : GameBehavior {
    void OnTouch(GameObject other) {
        Debug.Log($"Collected by {other.name}");
        GameObject.Destroy(gameObject);
    }
}

Example 4: Timer and Event

public class TimedEvent : GameBehavior {
    float triggerTime = 5f;
    bool triggered = false;

    void OnUpdate() {
        if (!triggered && Time.totalTime >= triggerTime) {
            triggered = true;
            Debug.Log("Event triggered after " + triggerTime + " seconds!");
            gameObject.SetActive(false);
        }
    }
}

Example 5: OnPress (E key)

public class Interactable : GameBehavior {
    void OnPress(int key) {
        // key 69 = E
        if (key == 69) {
            Debug.Log("Player pressed E!");
            // Open door, toggle switch, etc.
        }
    }
}

UI & GUI Scripting

Note: UI scripting is for advanced use. The Studio currently focuses on C# and Visual Script. Use those for reliable in-game behavior.

Create interactive web-based GUI overlays that can reference and control in-game objects.

What is UI Scripting?

UI Scripts let you build HTML/CSS user interfaces that appear as overlays on top of your game. These can:

  • Display score, health, inventory
  • Show interactive buttons and menus
  • React to game events
  • Control in-game objects from the UI
  • Display real-time game data

UI Script Structure

UI Scripts have three parts:

1

HTML

The structure of your UI elements

2

CSS

Styling and layout of your UI

3

JavaScript

Interactive logic and game object references

Basic UI Script Example

<!-- HTML -->
<div id="ui-container">
  <h1>Score: <span id="score">0</span></h1>
  <button id="start-btn">Start Game</button>
</div>

<!-- CSS -->
<style>
#ui-container {
  position: fixed;
  top: 20px;
  left: 20px;
  background: rgba(0, 0, 0, 0.8);
  padding: 20px;
  border-radius: 8px;
  color: white;
}
</style>

<!-- JavaScript -->
<script>
class GameUI {
  constructor() {
    this.score = 0;
    document.getElementById('start-btn').addEventListener('click', () => {
      this.startGame();
    });
  }

  startGame() {
    // Reference game object
    const door = GetGameObject('Door');
    door.position.y = 10; // Open door
  }

  updateScore(points) {
    this.score += points;
    document.getElementById('score').textContent = this.score;
  }
}

const ui = new GameUI();
</script>

Referencing Game Objects

Use the GetGameObject() function to access and control in-game objects:

// Get object by name
const door = GetGameObject('Door');

// Read object properties
console.log(door.position.x);
console.log(door.rotation.y);

// Modify object properties
door.position.y = 10;        // Move up
door.rotation.y = 90;        // Rotate
door.visible = false;         // Hide

// Call object methods
door.setColor(255, 0, 0);    // Red
door.destroy();              // Delete

Game Object API Reference

Property/Method Type Description
position Vector3 Object location {x, y, z}
rotation Vector3 Object rotation {x, y, z}
scale Vector3 Object size {x, y, z}
visible Boolean Show/hide object
color String Object color (hex or rgb)
setColor(r, g, b) Method Set color with RGB values
destroy() Method Delete the object

UI Scripting Example: Score Display

<div id="scoreboard">
  <div class="score-item">
    <label>Score:</label>
    <span id="score-value">0</span>
  </div>
  <div class="score-item">
    <label>Health:</label>
    <div id="health-bar"></div>
  </div>
</div>

<style>
#scoreboard {
  position: fixed;
  top: 10px;
  right: 10px;
  background: rgba(0, 0, 0, 0.7);
  padding: 15px;
  border: 2px solid #ff6b2b;
  border-radius: 8px;
  color: white;
  font-family: Arial;
}

.score-item {
  display: flex;
  justify-content: space-between;
  margin: 5px 0;
  min-width: 150px;
}

#health-bar {
  width: 100px;
  height: 20px;
  background: #333;
  border-radius: 4px;
  overflow: hidden;
}

.health-fill {
  height: 100%;
  background: #22c55e;
  transition: width 0.3s;
}
</style>

<script>
class Scoreboard {
  constructor() {
    this.score = 0;
    this.health = 100;
    this.updateDisplay();
  }

  addScore(points) {
    this.score += points;
    this.updateDisplay();
  }

  setHealth(hp) {
    this.health = Math.max(0, Math.min(100, hp));
    this.updateDisplay();
  }

  updateDisplay() {
    document.getElementById('score-value').textContent = this.score;
    
    const healthPercent = (this.health / 100) * 100;
    const healthBar = document.getElementById('health-bar');
    healthBar.innerHTML = `<div class="health-fill" style="width: ${healthPercent}%"></div>`;
  }
}

const scoreboard = new Scoreboard();

// Update when player picks up item
GetGameObject('Coin').onTouch = () => {
  scoreboard.addScore(10);
};
</script>

UI Scripting Example: Interactive Menu

<div id="game-menu">
  <h2>Game Menu</h2>
  <button id="play-btn">Play</button>
  <button id="settings-btn">Settings</button>
  <button id="quit-btn">Quit</button>
</div>

<style>
#game-menu {
  position: fixed;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  background: rgba(0, 0, 0, 0.9);
  padding: 40px;
  border-radius: 12px;
  border: 2px solid #ff6b2b;
  text-align: center;
  color: white;
  z-index: 1000;
}

#game-menu h2 {
  margin: 0 0 30px 0;
  font-size: 32px;
}

#game-menu button {
  display: block;
  width: 200px;
  margin: 10px auto;
  padding: 12px;
  background: #ff6b2b;
  color: white;
  border: none;
  border-radius: 6px;
  font-size: 16px;
  font-weight: bold;
  cursor: pointer;
}

#game-menu button:hover {
  background: #ff8c55;
}
</style>

<script>
class GameMenu {
  constructor() {
    document.getElementById('play-btn').addEventListener('click', () => this.play());
    document.getElementById('settings-btn').addEventListener('click', () => this.settings());
    document.getElementById('quit-btn').addEventListener('click', () => this.quit());
  }

  play() {
    // Hide menu
    document.getElementById('game-menu').style.display = 'none';
    
    // Enable player
    const player = GetGameObject('Player');
    player.visible = true;
  }

  settings() {
    alert('Settings coming soon!');
  }

  quit() {
    // Close game or restart
    window.location.reload();
  }
}

const menu = new GameMenu();
</script>

Publishing Your Game

Share your creation with the PrinterMake community

Pre-Publishing Checklist

SpawnPoint Added

Every game needs at least one SpawnPoint where players appear.

Tested Gameplay

Click Play and test your game. Fix any bugs before publishing.

No Overlapping Objects

Ensure collision objects don't intersect at start.

Prepared Details

Have a title, description, and thumbnail image ready.

Publishing Steps

1

File → Publish Game

Opens the publish dialog.

2

Enter Game Details

  • Title — Catchy, descriptive name
  • Description — What is your game about? (max 300 chars)
  • Thumbnail — Eye-catching image (1024x768 recommended)
3

Review

Check all details are correct.

4

Click "Publish"

Your game is now live and discoverable!

Managing Published Games

After publishing, you can:

  • Edit Details — Update title, description, thumbnail
  • Update Game — Make changes and re-publish
  • View Stats — See play count and feedback
  • Unpublish — Hide from community
  • Delete — Permanently remove

Export & Import Projects

Export as .prmk

Save your project locally as a PrinterMake file.

  • File → Export PrinterMake (.prmk)
  • Includes all objects, scripts, textures
  • Back up your work regularly

Import .prmk

Load a previously saved project or collaborate with others.

  • File → Import PrinterMake (.prmk)
  • Select file from your computer
  • Project loads with all assets intact

Tips, Tricks & Best Practices

Level up your game development skills

Performance Optimization

Optimize for Performance:
  • Avoid more than 500 objects in one scene
  • Use simpler materials instead of complex textures
  • Disable physics on non-interactive objects
  • Hide distant objects when not needed

Design Patterns

Open Levels

Large, explorable spaces with multiple areas to discover.

  • Use visual guides (lights, colors, height) to direct players
  • Create natural paths and landmarks
  • Hidden secrets reward exploration

Puzzle Rooms

Spaces with specific goals to solve or achievements to unlock.

  • Provide clear feedback when actions succeed
  • Use visual hints (glowing objects, highlighted areas)
  • Make solutions rewarding but not obvious

Combat/Challenge Spaces

Arenas where players test skills and compete.

  • Clear boundaries and hazards
  • Balanced difficulty
  • Spawn points away from danger

Common Mistakes to Avoid

❌ No SpawnPoint — Players can't join. Always add at least one!
❌ Objects Overlapping — Causes physics bugs. Check all collisions.
❌ Forgetting to Test — Always play your game before publishing.
❌ Unbalanced Difficulty — Too easy = boring, too hard = frustrating.
❌ Poor Camera Angles — Ensure players can see what they need.

Advanced Techniques

Layering & Depth

Create visual depth by layering objects at different distances.

Lighting for Atmosphere

Use lights strategically to create mood and guide players.

Scripted Events

Chain visual scripts together for complex interactions.

Performance Profiling

Monitor frame rate and object count during play.

Resources & Community

  • Check community games for inspiration
  • Study how popular creators build their scenes
  • Join the PrinterMake community forums
  • Share your work and get feedback
  • Collaborate with other creators

Keyboard Shortcuts

Shortcut Action
Ctrl+S Save project
Ctrl+Z Undo
Ctrl+Y Redo
Delete Delete selected object
Space Frame selected object
V Toggle grid
G Snap to grid