Hook — Reusable Grapple Asset for Horizon Worlds

Inspiration

I took cues from Warcraft III’s Pudge mini-game (hooking rivals across a gap), Overwatch (Roadhog), Worms (Ninja Rope), and Fortnite (Grappler). For self-movement and object control, I looked to Batman: Arkham (Grapnel to ledges), Apex Legends (Pathfinder), and Sekiro: Shadows Die Twice—great references for pulling yourself to a point or bringing a target to you.

What it does

Hook is a drop-in asset. It fires a visible, chain-linked projectile that, on collision, can:

  • Pull a hit player toward the user — enable the playerCatch toggle on Hook Manager.
  • Pull a hit object toward the user — the object must have the tags hookableObject and hookObject.
  • Pull the user toward a tagged surface (self-grapple) — the object must have the tags hookableObject and hookYourself.
  • Reflect the projectile off an object — the object must have the tag hookableObject.

Everything is network-synced. Designers can tune speed, maximum chain length, and per-mode behavior. If nothing is hit or max range is reached, the hook retracts along the same path for clear feedback.

How we built it

Editor & language: Horizon Worlds Desktop Editor + TypeScript, starting from a Meta base asset. It requires two separate assets to work - one being set of server-side scripts and one being client-side hook.

Scripts

  • Hook Pool (server -side) — pools projectile heads and chain segments so shots spawn instantly without hitches. Set the number of hooks and chains in the pool (enough to avoid running out) and the models representing their appearance; defaults are provided.
  • Hook Manager (server-side) — authoritative loop that advances active hooks, resolves collisions, applies the selected mode, and updates chain visuals. Provide parameters such as the hook pool, the projectile asset (default provided), projectile speed (default 30), projectile max distance (default 50), and a toggle to enable hooking players.
  • Client Shooter (client-side) — reads player input, sends fire requests, and provides immediate local feedback. Simple script attached to the handheld hook, with no parameters.

Assets/Models

  • Handheld Hook (held item) contains also client-side script (id: 680312721106081)
  • Chain/Line (stretches/rewinds with travel) (id: 1476250296694616)
  • Projectile Hook (same model as handheld; spawned via the Hook Pool) (id: 1157736276168545)

Key technical notes

  • Quaternion-based aiming with a constant local yaw offset so the model’s “nose” aligns without flattening pitch.
  • Tag-based collision routing for clean ally/enemy/object handling.
  • Deterministic return path for readability and fairness.

Challenges we ran into

  • Model orientation vs. engine forward: applying a local ±90° yaw fix without destroying pitch, so up/down shots behave correctly.
  • Authoritative networking: keeping travel, hits, and retractions consistent for all players while preserving snappy local feel.
  • Pooling resets: ensuring recycled hooks fully reset transforms, velocity, and visuals every shot (no “ghost state”).

Accomplishments that we're proud of

  • A truly versatile, drop-in asset for many worlds. Plug it into new or existing projects and switch behavior (pull target to user / pull user to surface) with simple flags—fast to set up, easy to tune, and fully network-synced.
  • At the heart of this competition is creating a reusable asset—and that’s exactly what we delivered, something we’re truly and most proud of, just few examples where asset can be utilized:
    • PvP examples: clean player-pulls for duels, arenas, CTF returns, or interrupts.
    • Parkour / traversal: self-grapple to marked surfaces for momentum plays, gap crossing, and route discovery.
    • Escape rooms & puzzles: pull movable props to yourself, or self-grapple to reach levers/ledges and chain multi-step interactions.
    • Co-op support: teammate rescues and coordinated traversal challenges.
    • …and so much more! This single asset has the potential to inspire entirely new worlds!
  • Widely familiar pattern: players “get it” instantly—opening huge reuse potential across genres.
  • Creator-friendly: pooling for performance, designer-exposed speed/range, and tag-based collision routing make adaptation straightforward.
  • Extensible foundation: easy to add behaviors (e.g., swing or impact variants) without changing core interfaces.

What we learned

  • Local vs. server scripts: clear division of responsibilities and communication (client input/feedback vs. server authority for spawning, movement, and collisions) for both responsiveness and consistency.
  • Cross-platform asset design: building once for Mobile and VR—input abstraction, comfort/FOV considerations.
  • Quaternion & vector workflows: when to rotate the vector vs. append a constant local model offset to preserve pitch.
  • Object pooling pays off: fewer allocations, fewer frame spikes, and stable feel during rapid-fire use.

What’s next for Hook

  • Improve chain stretching to align more precisely with the player’s hand position.
  • Expanded collision events: “sticky” latch states (e.g., after self-grapple the player remains attached until release/timer).
  • Audio pass: whoosh, impact, chain-tension, and retract SFX with spatialization.
  • Aim assist & indicators: travel-direction indicator.
  • Deeper customization: per-mode cooldowns, separate launch speed and retract speed.

Built With

Share this project:

Updates