Game development.
Data science.

I'm Sam Hageman, a University of Waterloo Data Science BMath co-op student. I build procedural worlds in Unity, browser-playable games, and machine learning tools.

Cave Planets / Interactive demoUnity · C#
Forested planet cutaway revealing its rocky interior.

Preview of the cave planet.

Cross section of the planet and its caves.

Scene settings
Display & exploration

Keyboard: focus the planet, then use arrows to orbit, + / − to zoom, Home to reset.

Activate the planet to orbit and zoom.

01

Selected projects

Procedural Planet Cave System

Abstract fighting animation prototype with blue and red blocks
Separate animation prototype

Animation prototype

Abstract Fighting Animation Project

A combat animation prototype for testing attack timing, animation blending, state transitions, and camera response.

  • Unity
  • C#
  • Animation states

Bluesky ML Labeling System

Machine learningComing soon

Dataset

400,000+ posts

AI-account classification

  1. 01
    Collect & processBluesky posts · Python · pandas
  2. 02
    Engineer featuresText and behavioral signals
  3. 03
    Compare modelsAI-account classification
  4. 04
    Apply labelsLive account labels

A Python pipeline that processes 400k+ Bluesky posts to classify AI and human accounts and publish predictions through a live labeling service.

How it works

I combine text and behavioral features and compare logistic regression and random forest models.

Testing across collected and curated datasets helps evaluate how the models perform on accounts outside their training data.

  • Python
  • pandas
  • scikit-learn
  • Bluesky API

RPG Environment System

Original gameUnity · C#2024–25

A 2D RPG prototype with generated caves, dynamic lighting, combat, loot, and an inventory system.

Gameplay in development Looping footage

Exploration, movement, inventory, and combat.

Cave generation

Recursive cellular automata generate the cave layouts, with dynamic terrain, lighting, and animation.

Props and dungeons

A modular framework places props, chests, and rare structures under spatial constraints, with transitions between overworld environments and dungeon scenes.

Inventory and UI

I built the ScriptableObject-driven inventory and custom UI, connecting item management to Unity's input and event systems.

Screenshots

Green vegetation grows across uneven cave walls lit by scattered torches.
Caves
Long golden vines hang down a tall cave shaft beside stepped terrain.
Vines
The character passes torchlit brick chambers in a dungeon corridor.
Dungeon
Inventory grid with a selected sword, its damage and reach stats, equipment count, and stacks of coins.
Inventory
A bright purple weapon swing hits an enemy, with damage numbers and a red enemy health bar visible in the cave.
Combat
02

Play in your browser

Play WordStream here, or open one of the other demos.

WordStream

Word strategy

A real-time word game with dynamic tile placement, dictionary validation, and scoring multipliers.

WordStream / Browser demo

On mobile, rotate your phone for a larger view.

Open separately ↗
  • 01 / RulesUse the letters in your rack to build words across or down, connecting to existing words after your first turn. Add at least one new letter; every word you form must be valid, and you can’t submit the same word twice. Score points and earn more time with each word; bonus tiles boost your rewards. When time runs out, you lose a heart and get a fresh rack. Lose all your hearts and the game ends.
  • 02 / KeyboardUse the arrow keys to move and Spacebar to switch between across and down. Type your word, use Backspace to correct it, and press Enter to submit.
  • 03 / Mouse + keyboardClick a square to select it; click it again to switch between across and down. Type your word, use Backspace to correct it, and press Enter to submit.

Planet Cave Demo

Screenshot of the Planet Cave Demo

Unity WebGLProcedural planet

Explore a generated planet and its caves with custom gravity, stylized terrain, and placed props.

Play Planet Demo

Wavebreaker

Screenshot of Wavebreaker

Unity WebGLGame jam

A solo game jam project built in one weekend. You play as a radio station in space, collect coloured waves with a dish, then fire them through an antenna to cancel out matching colours under tight time pressure.

Play Wavebreaker
03

Experience, education, and skills

Experience & Education

  1. 2025-Present University of Waterloo — Data Science BMath Co-op

    Studying data science and mathematics. Cumulative average: 84%.

  2. 2024-2025 Programming Teacher — School District 43 / CLCI

    Designed and delivered programming curricula in Unity, C#, JavaScript/TypeScript, MakeCode, and Scratch for classes of 20+ students, including interactive tutorials and visual learning tools.

  3. 2022-2024 Programming & Design Teaching Assistant — School District 43 / CLCI

    Supported 300+ students across Python, C#, Scratch, Figma, and Adobe Suite; contributed 200+ volunteer hours helping with lesson delivery, troubleshooting, and student projects.

Skills

Languages

Python, C#, C, JavaScript, HTML, CSS

Tools

Unity, WebGL, Git, VS Code, Linux, Figma, Parquet, REST APIs

Strengths

Rapid prototyping, procedural systems, debugging, teaching, UI polish, feature engineering

Download Resume PDF

Teaching / Lesson handbooks

Block coding courses

Programming courses I designed and taught, with lesson instructions, code examples, and student projects.

04

About me

I enjoy game development, procedural generation, and applied machine learning. I use personal projects to learn new tools and test ideas.

Teaching programming has taught me to break problems into smaller steps and explain them with working examples.

05 / Contact · Open to co-op opportunities

Get in touch

Based in Waterloo, ON / Coquitlam, BC, and open to remote or hybrid work. I'm interested in internships, hackathons, and game projects. You can reach me through the links below.

Portrait photo of Sam Hageman

Lesson preview

Three selected pages from the lesson handbook.