Who's Playing? Finding the Player's Character
Tutorialintermediatecompiles

Who's Playing? Finding the Player's Character

Updated intermediateScene GraphCharactersCode verified

Who's Playing? Finding the Player's Character

Everything in this series starts with one move: getting a hold of the player's character. Not the player (the person at the controller) — their character, the body that sprints, crouches, and falls off your map. In Verse that body is a fort_character, and it's the thing you read, move, and react to.

Here's the catch beginners trip on: there is no global "give me the player." You can't just type Player and start working. You walk a short chain from the device you're writing down to each player's body — and one link in that chain can fail, which is actually a feature.

The roll-call scene: a Button in a torch-lit castle courtyard, ready to report on every player

The chain: device → playspace → players → character

<!-- section-art:the-chain-device-playspace-players-character --> Who's Playing? Finding the Player's Character: The chain: device → playspace → players → character

Player Chain

Four steps, every time:

# 1. Every device lives inside a playspace — the running experience.
Playspace := GetPlayspace()
# 2. The playspace knows every human player currently in the match.
AllPlayers := Playspace.GetPlayers()
# 3 + 4. A player's BODY is its fort_character. This can FAIL (a player
# mid-respawn has no body yet), so we use the failable [] form.
for (P : AllPlayers):
    if (Body := P.GetFortCharacter[]):
        Where := Body.GetTransform().Translation
        Print("a player is at height {Where.Z}")

Read it top to bottom:

  • GetPlayspace() — every creative_device is inside a playspace (the live experience). This hands you that playspace.
  • GetPlayspace().GetPlayers() — the playspace knows every human player in the match. (There's also GetParticipants() if you want AI agents too — more on those in the NPC series.)
  • P.GetFortCharacter[] — the bridge from a player to its fort_character. The square brackets are the important part: this call is failable. A player who just joined, or who's mid-respawn, has no body yet — so the call fails, and the if simply skips them. That's exactly what you want; you never operate on a body that isn't there.

Why [] and not ()?

In Verse, square brackets mark a call that can fail — it might not produce a value. GetFortCharacter[] returns a fort_character if one exists, and fails otherwise. Wrapping it in if (Body := P.GetFortCharacter[]) means: "if there's a body, bind it to Body and run the block; if not, skip." This is the single most common pattern in character code, because at any instant some player might not have a live character.

What a fort_character can tell you

Once you hold a Body, it's an open book. A fort_character is positional, so it carries a transform — and it answers a whole list of yes/no questions about its current state:

Where := Body.GetTransform().Translation   # where it is in the world
Eye   := Body.GetViewLocation()            # where it's looking FROM (eye point)

if (Body.IsCrouching[]):  Print("crouching")
if (Body.IsInAir[]):      Print("airborne")
if (Body.IsOnGround[]):   Print("grounded")
  • GetTransform() comes from positional; .Translation is the world position, .Rotation the facing.
  • GetViewLocation() / GetViewRotation() give the aim — the eye point and look direction, handy for "what is the player pointing at?"
  • IsCrouching[], IsInAir[], IsOnGround[], IsFalling[], IsGliding[] — all failable tests (the [] again). They succeed when true, so you read them inside an if. There's no GetState() returning a string; you ask the specific question you care about.

The full roll-call device

<!-- section-art:the-full-roll-call-device --> Who's Playing? Finding the Player's Character: The full roll-call device

Character Scanner

Here's the whole thing as a drop-in device: press a Button, get a status report on every player in the match.

Note the imports: /Fortnite.com/Characters is the module that gives you GetFortCharacter and the whole fort_character surface — forget it and none of this resolves.

This device is compile-verified in UEFN 5.8 (the whole project builds clean with it installed). Grab it from the download panel as 03-device.verse, drop a Button in your level, and drag it into the ReportButton slot.

Recap

  • There's no global player — walk the chain: GetPlayspace() → GetPlayers() → P.GetFortCharacter[].
  • A player's body is a fort_character; getting it is failable ([]), because a player might not have a live body right now — the if skips them safely.
  • A fort_character is positional: GetTransform().Translation is where it is, GetViewLocation() is where it looks from.
  • State checks (IsCrouching[], IsInAir[], ...) are failable tests — they succeed when true, so you read them inside an if.
  • Import /Fortnite.com/Characters for the character API.

Next — Part 2: Move That Character — now that we can find a body, we'll push it around: launch pads, shoves, and instant teleports.

Get the complete code — free

You've read the full walkthrough. The complete, copy-paste-ready Verse solution is free for members — sign in to unlock it.

Free with your BrainDead.TV / BrainDeadGuild Discord account. The walkthrough above is always free.

Verse source files

Check your understanding

Test yourself with an interactive quiz and track your progress + earn XP — free for members.

Turn this into a guided course

Add UEFN Verse characters — GetPlayspace, GetPlayers, GetFortCharacter, fort_character, GetTransform, IsCrouching to your free study plan — we'll suggest related pages and stitch the lot into one compile-checked, self-guided lesson with worked examples and quizzes.

Original tutorial generated by Verse Island from the Verse/UEFN knowledge base, with references to the Epic Games sources above. Code is validated against the knowledge base.

Comments

    Sign in to vote, comment, or suggest an edit.Sign in