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
- Create a Project — Choose a template (Starter Scene or Flat Baseplate)
- Explore the Layout — Familiarize yourself with the four main panels
- Add Objects — Use Insert menu to add 3D shapes
- Customize Properties — Change colors, materials, and positions
- Add Interactivity — Use visual scripts or C# for gameplay logic
- Test Your Game — Click Play to enter gameplay mode
- 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
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
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.
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
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)
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
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.
Select an object in the Viewport or Explorer
In Properties → Appearance section, click "Upload Texture"
Choose an image file (PNG, JPG, etc.) from your computer
Texture preview appears below button
- 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
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
Appearance Properties
Physics Properties
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!");
}
}
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>().
// 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);
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);
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.
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"
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
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:
HTML
The structure of your UI elements
CSS
Styling and layout of your UI
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
File → Publish Game
Opens the publish dialog.
Enter Game Details
- Title — Catchy, descriptive name
- Description — What is your game about? (max 300 chars)
- Thumbnail — Eye-catching image (1024x768 recommended)
Review
Check all details are correct.
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
- 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
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 |