VR-Ready C++/Blueprintable Pawn with common VR functions. Also good as a SteamVR project template.

Unreal Engine VR Plugin v2.4.1

Unreal Engine Virtual Reality Pawn and Components plugin for common VR mechanics. Can be used for either Blueprint or C++ VR projects. All nodes (Blueprint) and Functions (C++) have a range of parameters for full flexibility and compatible with the VIVE Motion Controllers/Room-Scale VR projects.

Available in the Unreal Engine Marketplace and full source code in GitHub

Supports both SteamVR/Vive & the Oculus Rift

NOTE: SimpleHMD Engine Plugin is required to be enabled in you Project Plugins

Latest Release Notes (v2.4.x) - compatible only for UE 4.16 upwards


Enable VR Pawn to react/move properly through uneven terrain (VRPawn)
Dedicated node for 360 movement with thumbstick/thumbpad of Motion controllers (Movement component)
Various fixes and polish for Gaze, Movement and VR Pawn

Migrated to UE4.17

Automatically set HMD Tracking Origin (VRPawn)
Added gravity (VRPawn)
Customizable target mesh (Beta, Gaze Component)
Full 360 Yaw Movement Freedom for use with thumbstick input (Beta, Movement Component)
Fix for Oculus height offset issue (VRPawn)


Added Gaze interaction mechanic (new)
Added function to check if HMD is currently worn (in VRPawn)
Automatically set camera FOV to 110 to suit current released hardware, overridable (in VRPawn)

What you get:

Pre-configured VR Pawn (Responsive to Uneven Terrain)
Gestures Component (Record & Recognize custom VR Gestures)
Movement Component (free axis, locked axis, dash/timed motion, bounce from VR bounds & optional use of Nav Mesh bounds)
Teleport (Arc, Ray, Blink)
Grabber (precision, lock, scan only, grab sky/sun with cycle day and night)
Scalable meshes




  1. Setting up a new VR project & enabling VR in existing projects

  1. Movement / VR Locomotion Component Deep Dive

  1. Teleport Component Deep Dive

  1. Grabber Component Deep Dive

  1. VR Gestures Component Deep Dive

  1. RunebergVR Plugin v2 - Gaze Component Deep Dive

  1. RunebergVR Plugin v2 - Pawn Gravity, Uneven Terrain, Thumbstick 360 Movement

thank you for sharing!

How does this compare to Patron’s VR template?

I guess you have to try to I just briefly skim the source code, it adds 2 more component to pawn and pretty much like OP said it’s a WIP.
The way using Physics Handle for grab, pros/cons are explained by mordentral on that thread.

To be honest it takes a lot more than what’s shown here to fulfill what I would consider a functional VR ready Pawn.
So if you are good with CPP and would like to go down that road, might as well chip in/fork and make it or something better.

Thanks for having a peek at it PenguinTD

Yep, definitely open for people to help expand the code.

It’s C++ but definitely aimed for Blueprint users to make it easier (and less messy imo) to do some of the more common VR tasks. At the moment, it already has Teleport (with moveable markers) as well as the Push, Pull and grab functions. Will try to add more stuff in.

I think Patron’s is fully Blueprint?

I wanted to make Blueprint spawnable C++ classes so SteamVR Blueprints do not need to be (imo) overly convoluted as most of the heavy lifting is done in C++ and can easily be expanded (or trimmed) as needed in a project.

I added a Demo video, but will go in detail on each feature and of course always open for additions via the GitHub repo.

I have to say I have been using your VR Template runeberg and with the exception of the controllers being off compared to what the actual controllers are. (You can check by putting the ends of each controller together and then putting the tops together. The tops end up going into each other.

But other then that it is a great start and like you said it being in C++ keeps blueprints super clean and not overly convolted.

Oh and also the project settings need to be tweaked to be between 90 / 120 fps instead of the 63 (something like that) it was at by default.

Hi Toom - Thanks for the feedback! I’ll have a look at the controller location and the fps setting tomorrow, just need to hammer down on a couple more deadlines at work. I should be able to quickly ramp up on coding the fly and dive functions as well (lemme know if u have any other ideas for generic functions SteamVR devs might need).


Cool Plugin!

First off, thanks for whats looking like a perfect lightweight starting point for my project :smiley:
Pretty much in the same spot as you (used to be?), new to UE4 and wanting to make a cool VR game hehe. My C++ skill’s aint all that though, so yeah, this (and the provided tuts) helps alot :slight_smile:

So 4.14 released as i was trying your plugin & following your tutorial videos today, so i made a fork and committed some changes for 4.14, but i have no idea if its okay to post the link to my fork here, or if i can maybe somehow do a commit & pull request on your repo (dont think i can though) or how else i would go about sharing these changes with you (im a 1000% sure you don’t really need me for this, i just figured why not save u the effort) So anyway, ima just tell you to look at the forks on your repo, theres one by suicidalbanana, which is me, in that repo see commit b014874 & b621bb4 (both of earlier today) for the changes. If you need access to my fork or anything just say the word (Edit: its a pull request now)

That said, im getting some ‘lag’ in the controller movement (‘jittering’, both in your 4.13 and ‘my’ updated 4.14 version) that im not seeing when using for example the built in blueprint vr template, so i was wondering if you have any idea what could be causing that? im fairly sure its just some settings im messing up, but i have no idea which (and sadly its not the framerate settings)

Any help appreciated :slight_smile:

For some reason after enabling it in unreal and restarting it the content still doesn’t show up i dont know where to find the answer to the problem. I installed it from the marketplace today, newest version

Cool plugin!!!

HI Ethan sorry for the late response - didnt seem to get a notification of this post.

Anyways, if you’re using the Binary version (Marketplace), enable viewing of both Plugin and Engine Content in the Editor to see the relevant C++ classes, you can then use these to make the Blueprint classes (or C++) for use in your project:

2017-06-26 08_04_13-BasicVR - Unreal Editor.png

I hope that helps, let me know if you need any more info/help on this.


HI!I don’t know why the characters are inaccurate when they move, and they fly out of the wall


Thanks for posting here – Can you provide with more detail on the issue? A couple of screenshots or a recording perhaps of how to replicate so I can provide a more accurate response?


That’s indeed a good news runeberg.
Just one question. I installed your plug in? Can i ask you a question? Is this plug in compatible with leap motion controller? Thank you?

HI - Sorry the plugin was designed with Motion Controllers in mind. May consider doing some tests/development for it though when time permits :slight_smile:


Thanks for the great plugin :slight_smile: Been using it in 4.15 but now have an issue with upgrading. Project successfully upgraded to 4.17, plugin binary downloaded from github like before, project recompiled but now it crashes when I press ‘play’ button:

Assertion failed: IsValid() [File:E:\Program Files\Epic Games\UE_4.17\Engine\Source\Runtime\Core\Public\Templates/SharedPointer.h] [Line: 835]

UE4Editor_Core!FDebug::AssertFailed() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\core\private\misc\assertionmacros.cpp:349]
UE4Editor_Engine!AActor::BeginPlay() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\engine\private\actor.cpp:3146]
UE4Editor_Engine!AActor::DispatchBeginPlay() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\engine\private\actor.cpp:3130]
UE4Editor_Engine!AWorldSettings::NotifyBeginPlay() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\engine\private\worldsettings.cpp:187]
UE4Editor_Engine!AGameStateBase::HandleBeginPlay() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\engine\private\gamestatebase.cpp:177]
UE4Editor_Engine!UWorld::BeginPlay() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\engine\private\world.cpp:3435]
UE4Editor_Engine!UGameInstance::StartPlayInEditorGameInstance() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\engine\private\gameinstance.cpp:340]
UE4Editor_UnrealEd!UEditorEngine::CreatePIEGameInstance() [d:\build++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\playlevel.cpp:3438]
UE4Editor_UnrealEd!UEditorEngine::PlayInEditor() [d:\build++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\playlevel.cpp:2526]
UE4Editor_UnrealEd!UEditorEngine::StartQueuedPlayMapRequest() [d:\build++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\playlevel.cpp:1218]
UE4Editor_UnrealEd!UEditorEngine::Tick() [d:\build++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\editorengine.cpp:1549]
UE4Editor_UnrealEd!UUnrealEdEngine::Tick() [d:\build++ue4+release-4.17+compile\sync\engine\source\editor\unrealed\private\unrealedengine.cpp:396]
UE4Editor!FEngineLoop::Tick() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\launch\private\launchengineloop.cpp:3215]
UE4Editor!GuardedMain() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\launch\private\launch.cpp:166]
UE4Editor!GuardedMainWrapper() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\launch\private\windows\launchwindows.cpp:134]
UE4Editor!WinMain() [d:\build++ue4+release-4.17+compile\sync\engine\source\runtime\launch\private\windows\launchwindows.cpp:210]
UE4Editor!__scrt_common_main_seh() [f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:253]

Any idea what’s going on?

Hi laggyluk - a bit difficult to say with just this, the stack trace looks a bit odd. Are you able to share your log files (in the Saved directory)?

You can send it to contact @ runeberg (dot) io if you dont wish to share it publicly.

**EDIT: **Also, a copy of the RunebergVRPlugin.uplugin.uplugin file in your project. Thanks.


My bad, as usual :stuck_out_tongue:
when launched from VS it stopped on this line:
// Adjust pawn spawn target offset based on HMD
static const FName HMDName = GEngine->HMDDevice->GetDeviceName();

which made me thinking and:

  1. I don’t have vive attached at the moment
  2. I didn’t check if SimpleHMD plugin is enabled and it was not

doesn’t crash anymore after enabling it

Hi laggyluk! Glad that it all worked out for you.

A bit strange though as it shouldn’t have crashed in either of those cases - so offer still stands if you’re keen - I can do a more critical review of your logs and/or project files to ensure you don’t get any further issues like this in the future, just lemme know!