<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: WinterTurtle23</title>
    <description>The latest articles on DEV Community by WinterTurtle23 (@winterturtle23).</description>
    <link>https://dev.to/winterturtle23</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F731702%2Fe6479353-99ba-49a5-b548-968199e60c75.png</url>
      <title>DEV Community: WinterTurtle23</title>
      <link>https://dev.to/winterturtle23</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/winterturtle23"/>
    <language>en</language>
    <item>
      <title>Using AirSim with Unreal Engine: A Guide to Drone &amp; Autonomous Vehicle Simulation</title>
      <dc:creator>WinterTurtle23</dc:creator>
      <pubDate>Sun, 22 Jun 2025 12:45:25 +0000</pubDate>
      <link>https://dev.to/winterturtle23/using-airsim-with-unreal-engine-a-guide-to-drone-autonomous-vehicle-simulation-5cm3</link>
      <guid>https://dev.to/winterturtle23/using-airsim-with-unreal-engine-a-guide-to-drone-autonomous-vehicle-simulation-5cm3</guid>
      <description>&lt;p&gt;As autonomous systems and robotics grow, developers need realistic, flexible environments to test algorithms safely. This is where &lt;strong&gt;AirSim&lt;/strong&gt;, an open-source simulator developed by Microsoft, becomes incredibly valuable.&lt;/p&gt;

&lt;p&gt;In this blog post, I’ll walk you through &lt;strong&gt;what AirSim is&lt;/strong&gt;, how to integrate it with &lt;strong&gt;Unreal Engine&lt;/strong&gt;, and how I used it in my project to simulate &lt;strong&gt;realistic drone physics&lt;/strong&gt; for training and navigation systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What Is AirSim?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AirSim (Aerial Informatics and Robotics Simulation)&lt;/strong&gt; is a plugin for Unreal Engine that provides realistic physics, sensor data, and environment simulation for drones, cars, and other autonomous systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open-source (MIT license)&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;drone and car simulations&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Includes APIs for &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;C++&lt;/strong&gt;, and &lt;strong&gt;ROS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Simulates &lt;strong&gt;RGB, depth, segmentation, lidar&lt;/strong&gt;, IMU, GPS, and barometer&lt;/li&gt;
&lt;li&gt;Ideal for &lt;strong&gt;AI, computer vision, reinforcement learning&lt;/strong&gt;, and testing flight code&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Getting Started with AirSim in Unreal Engine
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧱 Step 1: Clone and Build AirSim
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/microsoft/AirSim.git
&lt;span class="nb"&gt;cd &lt;/span&gt;AirSim
./setup.sh    &lt;span class="c"&gt;# or setup.bat for Windows&lt;/span&gt;
./build.sh    &lt;span class="c"&gt;# or build.cmd for Windows&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This compiles the AirSim plugin and samples.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠 Step 2: Create or Use an Unreal Project
&lt;/h3&gt;

&lt;p&gt;You can either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;strong&gt;Blocks environment&lt;/strong&gt; from AirSim samples&lt;/li&gt;
&lt;li&gt;Or create your &lt;strong&gt;own custom Unreal map&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📦 Step 3: Integrate AirSim Plugin into Your UE Project
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Copy the &lt;code&gt;AirSim&lt;/code&gt; folder into your Unreal project under &lt;code&gt;/Plugins/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Regenerate project files (&lt;code&gt;.uproject → right-click → Generate Visual Studio project&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Open the project in &lt;strong&gt;Unreal Engine&lt;/strong&gt; and enable the plugin if prompted&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🧠 How AirSim Handles Drone Physics
&lt;/h3&gt;

&lt;p&gt;AirSim uses a &lt;strong&gt;PX4-based physics model&lt;/strong&gt; for multirotors. It mimics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pitch, roll, yaw control&lt;/li&gt;
&lt;li&gt;Aerodynamic drag and lift&lt;/li&gt;
&lt;li&gt;GPS drift and latency&lt;/li&gt;
&lt;li&gt;Motor delay simulation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Using the API
&lt;/h2&gt;

&lt;p&gt;AirSim offers a Python and C++ API. Here's a basic &lt;strong&gt;Python example&lt;/strong&gt; to control the drone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;ADroneController&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;BeginPlay&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Super&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;BeginPlay&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Create&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;AirSim&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;
    &lt;span class="n"&gt;msr&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;airlib&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MultirotorRpcLibClient&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;DroneClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;msr&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;airlib&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;MultirotorRpcLibClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;DroneClient&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;confirmConnection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Enable&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;arm&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;drone&lt;/span&gt;
    &lt;span class="n"&gt;DroneClient&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enableApiControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;DroneClient&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;armDisarm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Take&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;
    &lt;span class="n"&gt;DroneClient&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;takeoffAsync&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;waitOnLastTask&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Fly&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;
    &lt;span class="n"&gt;DroneClient&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;moveToPositionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;waitOnLastTask&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Land&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="n"&gt;reaching&lt;/span&gt; &lt;span class="n"&gt;destination&lt;/span&gt;
    &lt;span class="n"&gt;DroneClient&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;landAsync&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;waitOnLastTask&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;Release&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt;
    &lt;span class="n"&gt;DroneClient&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enableApiControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can automate missions, collect sensor data, or train AI models on top of this API.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧰 Sensors Available in AirSim
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;RGB &amp;amp; Depth camera&lt;/li&gt;
&lt;li&gt;Segmentation mask&lt;/li&gt;
&lt;li&gt;Lidar (360° scan)&lt;/li&gt;
&lt;li&gt;GPS&lt;/li&gt;
&lt;li&gt;IMU&lt;/li&gt;
&lt;li&gt;Magnetometer&lt;/li&gt;
&lt;li&gt;Distance sensor (ultrasonic)&lt;/li&gt;
&lt;li&gt;Barometer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These can be configured via the &lt;code&gt;settings.json&lt;/code&gt; file in the AirSim root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"SettingsVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Vehicles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Drone1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"VehicleType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SimpleFlight"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"X"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Z"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌦️ Enhancing Simulation Realism with Unreal
&lt;/h2&gt;

&lt;p&gt;In my project, I used Unreal features to elevate the realism:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic lighting and weather&lt;/strong&gt; using Blueprint systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Obstacles with collision meshes&lt;/strong&gt; to test navigation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post-processing effects&lt;/strong&gt; to simulate camera noise&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Use Cases of AirSim
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reinforcement Learning&lt;/strong&gt; – Train agents to fly or drive using safe simulations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robotics Research&lt;/strong&gt; – Test autonomous code before deploying to hardware&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surveillance &amp;amp; Mapping&lt;/strong&gt; – Simulate GPS + camera-based tracking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logistics &amp;amp; Delivery&lt;/strong&gt; – Prototype drone delivery systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Education &amp;amp; Training&lt;/strong&gt; – Create VR/PC training simulations for drones&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Tips &amp;amp; Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Run AirSim in &lt;strong&gt;UE Editor → VR Preview / Standalone Mode&lt;/strong&gt; for stability&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;SimMode&lt;/code&gt; Blueprint/C++ class to customize vehicle spawning&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;airsim.log&lt;/code&gt; and &lt;code&gt;settings.json&lt;/code&gt; for API config issues&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;stat unit&lt;/code&gt; and &lt;code&gt;stat fps&lt;/code&gt; to keep your simulation optimized&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;AirSim + Unreal Engine is a powerhouse combo for anyone working in &lt;strong&gt;autonomous vehicles, AI, or simulation&lt;/strong&gt;. Whether you're building a drone racing prototype or testing machine vision models, this toolset allows for real-world logic testing in safe, scalable virtual environments.&lt;/p&gt;

&lt;p&gt;In my experience with &lt;strong&gt;Dronewood&lt;/strong&gt; and simulation-based client projects, AirSim helped bridge the gap between Unreal’s visual power and robotics code realism.&lt;/p&gt;

&lt;p&gt;If you're exploring AirSim for Unreal and need help setting it up, integrating APIs, or deploying to hardware — feel free to connect. I’d love to hear about your projects!&lt;/p&gt;

</description>
      <category>unrealengine</category>
      <category>programming</category>
      <category>gamedev</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Flying with FloatingPawnMovement in Unreal Engine: A Dronewood Dev Breakdown</title>
      <dc:creator>WinterTurtle23</dc:creator>
      <pubDate>Sat, 31 May 2025 14:56:47 +0000</pubDate>
      <link>https://dev.to/winterturtle23/flying-with-floatingpawnmovement-in-unreal-engine-a-dronewood-dev-breakdown-546c</link>
      <guid>https://dev.to/winterturtle23/flying-with-floatingpawnmovement-in-unreal-engine-a-dronewood-dev-breakdown-546c</guid>
      <description>&lt;p&gt;When it comes to creating flying actors in Unreal Engine — from drones to hovercrafts — one of the most versatile components is the &lt;strong&gt;FloatingPawnMovement&lt;/strong&gt; component.&lt;/p&gt;

&lt;p&gt;In this blog post, I’ll break down what &lt;strong&gt;FloatingPawnMovement&lt;/strong&gt; is, how it works, when to use it, and how I used it in my drone simulation game &lt;strong&gt;&lt;a href="https://nitinnishad23.artstation.com/projects/XJ95vL" rel="noopener noreferrer"&gt;Dronewood&lt;/a&gt;&lt;/strong&gt; to build a smooth, physics-aware flying experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 What is FloatingPawnMovement?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;UFloatingPawnMovement&lt;/code&gt; is a lightweight movement component provided by Unreal Engine that allows &lt;strong&gt;basic movement of Pawns&lt;/strong&gt; in 3D space. Unlike &lt;code&gt;CharacterMovementComponent&lt;/code&gt;, it doesn’t rely on a capsule or gravity by default, making it ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drones&lt;/li&gt;
&lt;li&gt;Spaceships&lt;/li&gt;
&lt;li&gt;Hover vehicles&lt;/li&gt;
&lt;li&gt;Zero-gravity entities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It supports &lt;strong&gt;movement input&lt;/strong&gt; (AddMovementInput), simulates acceleration/deceleration, and integrates cleanly with both &lt;strong&gt;Blueprints&lt;/strong&gt; and &lt;strong&gt;C++&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Setting It Up
&lt;/h2&gt;

&lt;p&gt;Whether you're working in Blueprints or C++, adding &lt;code&gt;FloatingPawnMovement&lt;/code&gt; is straightforward.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Blueprint Setup:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a new Pawn blueprint (not Character).&lt;/li&gt;
&lt;li&gt;Add a &lt;code&gt;FloatingPawnMovement&lt;/code&gt; component.&lt;/li&gt;
&lt;li&gt;Add input bindings like "MoveForward", "MoveRight", and "MoveUp".&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;AddMovementInput(GetActorForwardVector(), AxisValue)&lt;/code&gt; to move.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🧠 C++ Setup:
&lt;/h3&gt;

&lt;p&gt;Here’s how to wire it up in your Pawn class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;AFlyingPawn&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AFlyingPawn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;RootComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateDefaultSubobject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;USceneComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"RootComponent"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="n"&gt;MeshComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateDefaultSubobject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UStaticMeshComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Mesh"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;MeshComponent&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;SetupAttachment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RootComponent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;FloatingMovement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CreateDefaultSubobject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UFloatingPawnMovement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"FloatingPawnMovement"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;AFlyingPawn&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;SetupPlayerInputComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UInputComponent&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;PlayerInputComponent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;PlayerInputComponent&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;BindAxis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MoveForward"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;AFlyingPawn&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MoveForward&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;PlayerInputComponent&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;BindAxis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MoveRight"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;AFlyingPawn&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MoveRight&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;PlayerInputComponent&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;BindAxis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ascend"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;AFlyingPawn&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MoveUp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;AFlyingPawn&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MoveForward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;AddMovementInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetActorForwardVector&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;AFlyingPawn&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MoveRight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;AddMovementInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetActorRightVector&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;AFlyingPawn&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;MoveUp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;AddMovementInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetActorUpVector&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚁 Real-World Use Case: &lt;em&gt;Dronewood&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Dronewood&lt;/strong&gt;, I built a fully functional drone simulation where the player controls a drone through tight obstacle-filled environments using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ascend/descend&lt;/li&gt;
&lt;li&gt;Tilt forward/backward&lt;/li&gt;
&lt;li&gt;Rotate (yaw) left/right&lt;/li&gt;
&lt;li&gt;Speed boost for time trials&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why FloatingPawnMovement?
&lt;/h3&gt;

&lt;p&gt;While physics-based movement can feel sluggish and unpredictable for this kind of gameplay, &lt;code&gt;FloatingPawnMovement&lt;/code&gt; offered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smooth, responsive input handling&lt;/li&gt;
&lt;li&gt;Built-in acceleration and deceleration&lt;/li&gt;
&lt;li&gt;Easy integration with custom rotation and tilt systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dronewood’s Drone Control Breakdown:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ascend/Descend&lt;/strong&gt;: &lt;code&gt;AddMovementInput(GetActorUpVector(), Value)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forward Movement&lt;/strong&gt;: &lt;code&gt;AddMovementInput(GetActorForwardVector(), Value)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed Boost&lt;/strong&gt;: Modified &lt;code&gt;MaxSpeed&lt;/code&gt; dynamically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tilt Control&lt;/strong&gt;: Adjusted the mesh's relative rotation for visual realism
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Speed boost toggle&lt;/span&gt;
&lt;span class="n"&gt;FloatingMovement&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;MaxSpeed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bBoosting&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mf"&gt;1600.&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;800.&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also added a &lt;strong&gt;custom camera controller&lt;/strong&gt; and &lt;strong&gt;collision handling logic&lt;/strong&gt; to avoid unintended flips or drift when bouncing off obstacles.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 When &lt;em&gt;Not&lt;/em&gt; to Use It?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If you need full physics simulation (e.g. quadcopter thrust physics)&lt;/li&gt;
&lt;li&gt;If you want full character animation support&lt;/li&gt;
&lt;li&gt;If you need complex floor detection, jumping, or crouching (use &lt;code&gt;CharacterMovementComponent&lt;/code&gt; instead)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧰 Pro Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Combine with &lt;code&gt;SpringArm + Camera&lt;/code&gt; for 3rd-person view.&lt;/li&gt;
&lt;li&gt;Clamp pitch/roll to avoid disorienting the player.&lt;/li&gt;
&lt;li&gt;Customize &lt;code&gt;Acceleration&lt;/code&gt;, &lt;code&gt;Deceleration&lt;/code&gt;, and &lt;code&gt;MaxSpeed&lt;/code&gt; for arcade or sim feel.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;OnComponentHit&lt;/code&gt; events for obstacle reaction or bounce-back effects.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;FloatingPawnMovement&lt;/code&gt; might not be as flashy as &lt;code&gt;CharacterMovementComponent&lt;/code&gt;, but it's one of Unreal's most &lt;strong&gt;underappreciated tools&lt;/strong&gt; for flying mechanics. Whether you're building a drone game like &lt;strong&gt;Dronewood&lt;/strong&gt;, a sci-fi spaceship, or a magic carpet — this component gives you speed, control, and simplicity.&lt;/p&gt;

&lt;p&gt;If you're exploring flying movement in Unreal and want tips on tilt mechanics, multiplayer sync, or custom input systems — I’d love to connect. Happy flying! &lt;/p&gt;




</description>
      <category>unrealengine</category>
      <category>gamedev</category>
      <category>programming</category>
      <category>cpp</category>
    </item>
    <item>
      <title>Getting Started with Virtual Reality in Unreal Engine: Building Immersive Worlds</title>
      <dc:creator>WinterTurtle23</dc:creator>
      <pubDate>Sat, 31 May 2025 14:18:21 +0000</pubDate>
      <link>https://dev.to/winterturtle23/getting-started-with-virtual-reality-in-unreal-engine-building-immersive-worlds-n1c</link>
      <guid>https://dev.to/winterturtle23/getting-started-with-virtual-reality-in-unreal-engine-building-immersive-worlds-n1c</guid>
      <description>&lt;p&gt;Virtual Reality (VR) is more than just a tech trend — it’s a medium for creating &lt;strong&gt;truly immersive experiences&lt;/strong&gt;. From training simulations to games and architectural walkthroughs, VR enables us to &lt;strong&gt;step inside&lt;/strong&gt; digital worlds.&lt;/p&gt;

&lt;p&gt;Unreal Engine stands out as a &lt;strong&gt;powerhouse for VR development&lt;/strong&gt;, offering photoreal visuals, robust input systems, and powerful performance optimization tools.&lt;/p&gt;

&lt;p&gt;In this blog, I’ll walk you through what makes Unreal great for VR, how to get started, the tools I use, and lessons from my real-world VR projects like &lt;strong&gt;Active Shooter&lt;/strong&gt;, &lt;strong&gt;Surgical Simulation&lt;/strong&gt;, and &lt;strong&gt;VR Library&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Why Choose Unreal for VR?
&lt;/h2&gt;

&lt;p&gt;Unreal Engine provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native VR support&lt;/strong&gt; out-of-the-box (Meta Quest, Vive, Pico, Valve Index, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-fidelity rendering&lt;/strong&gt; for immersive visuals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blueprint &amp;amp; C++ integration&lt;/strong&gt; for flexible interaction design&lt;/li&gt;
&lt;li&gt;Support for &lt;strong&gt;hand tracking&lt;/strong&gt;, &lt;strong&gt;motion controllers&lt;/strong&gt;, and &lt;strong&gt;haptics&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Built-in &lt;strong&gt;VR template&lt;/strong&gt; to kickstart your project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're building for PC VR or standalone headsets, Unreal gives you everything you need — no plugins necessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧰 Tools &amp;amp; Hardware I Use for VR Projects
&lt;/h2&gt;

&lt;p&gt;Here’s my go-to setup for professional VR development:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Hardware:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Meta Quest 2 &amp;amp; 3&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forcetube Provolver&lt;/strong&gt; (for realistic gun recoil)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KAT VR Treadmill&lt;/strong&gt; (for natural locomotion input)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛠️ Tools &amp;amp; Plugins:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unreal Engine 5&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JetBrains Rider&lt;/strong&gt; – my IDE of choice for C++&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenXR&lt;/strong&gt; – for device integration&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎮 Project Showcase: Real-World VR Projects
&lt;/h2&gt;

&lt;p&gt;Here are some real VR projects I’ve built using Unreal Engine:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;&lt;a href="https://nitinnishad23.artstation.com/projects/K3aOqG" rel="noopener noreferrer"&gt;Active Shooter&lt;/a&gt;&lt;/strong&gt; (VR Police Training Simulation)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Created for &lt;strong&gt;Abu Dhabi Police&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Features &lt;strong&gt;multiplayer VR&lt;/strong&gt;, &lt;strong&gt;Forcetube Provolver&lt;/strong&gt;, &lt;strong&gt;KAT treadmill&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Realistic shooting, NPC AI, and mission-based training modules&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;&lt;a href="https://nitinnishad23.artstation.com/projects/2BZZ8g" rel="noopener noreferrer"&gt;Surgical Simulation&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hand-tracking VR training where players perform CPR and use an AED&lt;/li&gt;
&lt;li&gt;Built for &lt;strong&gt;hospital emergency response training&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Involves NPC interaction, voice guidance, and real-world task accuracy&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;VR Library&lt;/strong&gt; (Cultural Education)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;An ancient virtual library built for &lt;strong&gt;National Book Trust&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Users interact with a librarian NPC and explore Indian stories through visuals and voiceovers&lt;/li&gt;
&lt;li&gt;Focus on narrative and visual immersion&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 VR Input in Unreal Engine
&lt;/h2&gt;

&lt;p&gt;Unreal provides support for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Motion Controllers&lt;/strong&gt;: Access button presses, trigger values, and positional data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hand Tracking&lt;/strong&gt; (Quest/Pico): Access open-palm gestures and pinch inputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Haptic Feedback&lt;/strong&gt;: Vibrations on interactions&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Locomotion Methods&lt;/strong&gt;:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Smooth Locomotion (joystick)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Teleportation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;KAT treadmill integration for full-body movement&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📏 Performance Tips for VR
&lt;/h2&gt;

&lt;p&gt;Performance in VR is &lt;strong&gt;non-negotiable&lt;/strong&gt;. Here’s what I always optimize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Target 72–90 FPS&lt;/strong&gt; at minimum&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Level of Detail (LOD)&lt;/strong&gt; and &lt;strong&gt;Hierarchical Instanced Static Meshes (HISM)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cull distant objects using &lt;strong&gt;Distance Culling&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Stat Unit&lt;/strong&gt;, &lt;strong&gt;Stat FPS&lt;/strong&gt;, and &lt;strong&gt;VR Preview&lt;/strong&gt; mode often&lt;/li&gt;
&lt;li&gt;Bake lighting where possible (unless using Lumen strategically)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Testing and Debugging VR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;VR Preview&lt;/strong&gt; in the editor or &lt;strong&gt;Oculus Link / SteamVR&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Print logs via &lt;code&gt;GEngine-&amp;gt;AddOnScreenDebugMessage()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Camera Manager&lt;/strong&gt; to debug head/camera tracking&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Virtual Reality in Unreal Engine isn’t just powerful — it’s transformative. With the right tools, design thinking, and optimization practices, you can build &lt;strong&gt;immersive, believable, and useful&lt;/strong&gt; VR worlds.&lt;/p&gt;

&lt;p&gt;Whether you're simulating a medical emergency or letting users walk through a historical site, Unreal gives you everything you need to bring your vision to (virtual) life.&lt;/p&gt;

&lt;p&gt;If you're starting your own VR journey and need help with hand tracking, networked VR, or performance tuning — feel free to connect or drop your questions below!&lt;/p&gt;




</description>
      <category>unrealengine</category>
      <category>vr</category>
      <category>gamedev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Unreal Engine Replication Pipeline</title>
      <dc:creator>WinterTurtle23</dc:creator>
      <pubDate>Thu, 22 May 2025 19:11:42 +0000</pubDate>
      <link>https://dev.to/winterturtle23/unreal-engine-replication-pipeline-5egl</link>
      <guid>https://dev.to/winterturtle23/unreal-engine-replication-pipeline-5egl</guid>
      <description>&lt;h2&gt;
  
  
  🔄 Understanding Unreal Engine's Replication Pipeline
&lt;/h2&gt;

&lt;p&gt;Multiplayer games live and die by their network code — and Unreal Engine’s &lt;strong&gt;replication system&lt;/strong&gt; is one of the most powerful and flexible networking architectures in the game dev world. Whether you're syncing player positions, firing weapons, or managing inventories, &lt;strong&gt;replication&lt;/strong&gt; ensures your game state stays consistent across the server and all clients.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through &lt;strong&gt;Unreal Engine's replication pipeline&lt;/strong&gt;, explain &lt;strong&gt;how it works under the hood&lt;/strong&gt;, and share best practices I’ve used in multiplayer projects like &lt;em&gt;Offensive Warfare&lt;/em&gt; and &lt;em&gt;Relic Hunters&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What Is Replication?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Replication&lt;/strong&gt; in Unreal Engine refers to the process of &lt;strong&gt;sending data from the server to clients (and vice versa)&lt;/strong&gt; to keep game state consistent. UE is a &lt;strong&gt;server-authoritative engine&lt;/strong&gt;, meaning the server owns the truth, and clients receive only the allowed view of that truth.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Key Components of the Replication Pipeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;UProperties with &lt;code&gt;Replicated&lt;/code&gt; or &lt;code&gt;ReplicatedUsing&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can mark variables to replicate automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;UPROPERTY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Replicated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;Health&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;UPROPERTY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ReplicatedUsing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OnRep_Score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;int32&lt;/span&gt; &lt;span class="n"&gt;Score&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;ReplicatedUsing&lt;/code&gt;, you can trigger a callback when the variable updates on clients:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;UFUNCTION&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnRep_Score&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. &lt;strong&gt;&lt;code&gt;GetLifetimeReplicatedProps()&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This function tells the engine &lt;strong&gt;what properties should replicate and how&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;AMyCharacter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GetLifetimeReplicatedProps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TArray&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;FLifetimeProperty&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;OutLifetimeProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Super&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;GetLifetimeReplicatedProps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OutLifetimeProps&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;DOREPLIFETIME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AMyCharacter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Health&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. &lt;strong&gt;Remote Procedure Calls (RPCs)&lt;/strong&gt;
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🖥️ Server RPCs
&lt;/h4&gt;

&lt;p&gt;Run logic &lt;strong&gt;on the server&lt;/strong&gt;, called from the client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;UFUNCTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Reliable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Server_Fire&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  🛰️ Client RPCs
&lt;/h4&gt;

&lt;p&gt;Run logic &lt;strong&gt;on a specific client&lt;/strong&gt;, called by the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;UFUNCTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Reliable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Client_ReceiveDamage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;DamageAmount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  📡 Multicast RPCs
&lt;/h4&gt;

&lt;p&gt;Run logic &lt;strong&gt;on all clients&lt;/strong&gt;, called by the server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;UFUNCTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NetMulticast&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Reliable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Multicast_PlayExplosion&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔄 The Replication Flow
&lt;/h2&gt;

&lt;p&gt;Here’s a simplified &lt;strong&gt;step-by-step overview&lt;/strong&gt; of what happens during replication:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Server Updates State&lt;/strong&gt; – The authoritative game state is changed (e.g., Health drops).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replication Conditions Checked&lt;/strong&gt; – Unreal decides if and where the update should be sent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Properties Marked as Dirty&lt;/strong&gt; – UE marks only changed properties for replication (optimization).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Packaged &amp;amp; Sent&lt;/strong&gt; – UE serializes the property/RPC data and sends it over the network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clients Receive &amp;amp; Apply&lt;/strong&gt; – The client deserializes the data and updates its local copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OnRep Callbacks Triggered&lt;/strong&gt; – If &lt;code&gt;ReplicatedUsing&lt;/code&gt; is set, the callback function runs.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ⚙️ Tips for Effective Replication
&lt;/h2&gt;

&lt;p&gt;✅ Use &lt;code&gt;COND_SkipOwner&lt;/code&gt; to avoid sending data back to the client who already knows it.&lt;/p&gt;

&lt;p&gt;✅ Keep replicated variables &lt;strong&gt;minimal and optimized&lt;/strong&gt;. Bandwidth is precious.&lt;/p&gt;

&lt;p&gt;✅ Use &lt;code&gt;Reliable&lt;/code&gt; RPCs &lt;strong&gt;only for critical actions&lt;/strong&gt; (like firing a gun), not for frequent updates.&lt;/p&gt;

&lt;p&gt;✅ Use &lt;strong&gt;Network Profiler&lt;/strong&gt; and &lt;code&gt;stat net&lt;/code&gt; to monitor replication costs.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧵 Real-World Use Case: Shooting System
&lt;/h2&gt;

&lt;p&gt;In my game &lt;em&gt;Offensive Warfare&lt;/em&gt;, the firing mechanism works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Player presses Fire (on Client)&lt;/li&gt;
&lt;li&gt;Calls &lt;code&gt;Server_Fire()&lt;/code&gt; RPC&lt;/li&gt;
&lt;li&gt;Server runs logic → updates ammo count → calls &lt;code&gt;Multicast_PlayFireEffect()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;All clients (including the shooter) play fire VFX/SFX&lt;/li&gt;
&lt;li&gt;Ammo HUD updated via &lt;code&gt;OnRep_Ammo&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📌 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Unreal Engine’s replication pipeline is &lt;strong&gt;powerful but performance-sensitive&lt;/strong&gt;. Once you understand how data flows from server to client (and vice versa), you can build scalable and reliable multiplayer games — from fast-paced shooters to synchronized simulations.&lt;/p&gt;

&lt;p&gt;If you're working on a multiplayer Unreal project and have questions about replication, session systems, or optimization, drop a comment or DM — happy to help!&lt;/p&gt;




</description>
      <category>unrealengine</category>
      <category>gamedev</category>
      <category>programming</category>
      <category>multiplayer</category>
    </item>
    <item>
      <title>Building a Multiplayer System in Unreal Engine with Steam &amp; LAN</title>
      <dc:creator>WinterTurtle23</dc:creator>
      <pubDate>Wed, 21 May 2025 16:19:01 +0000</pubDate>
      <link>https://dev.to/winterturtle23/building-a-multiplayer-system-in-unreal-engine-with-steam-lan-3ndc</link>
      <guid>https://dev.to/winterturtle23/building-a-multiplayer-system-in-unreal-engine-with-steam-lan-3ndc</guid>
      <description>&lt;h2&gt;
  
  
  🎮 Building a Multiplayer System in Unreal Engine with Steam &amp;amp; LAN
&lt;/h2&gt;

&lt;p&gt;Multiplayer game development can seem intimidating, but Unreal Engine makes it surprisingly approachable. Whether you're aiming to create a simple LAN party game or a full-fledged Steam multiplayer shooter, Unreal’s built-in networking systems have you covered.&lt;/p&gt;

&lt;p&gt;In this blog, I’ll walk you through how I implemented multiplayer using &lt;strong&gt;Steam&lt;/strong&gt; and &lt;strong&gt;LAN subsystems&lt;/strong&gt; in Unreal Engine — from project setup to handling replication.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚙️ Why Use Steam and LAN?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Steam Subsystem&lt;/strong&gt;:&lt;br&gt;
Used for online multiplayer across the internet. It supports matchmaking, achievements, leaderboards, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LAN Subsystem&lt;/strong&gt;:&lt;br&gt;
Best for local play or internal testing. It’s fast, requires no internet connection, and works great for prototypes and offline setups.&lt;/p&gt;

&lt;p&gt;In my game &lt;strong&gt;Offensive Warfare&lt;/strong&gt;, I implemented both to allow players flexibility: testing on LAN and releasing over Steam.&lt;/p&gt;


&lt;h3&gt;
  
  
  🛠 Project Setup
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. &lt;strong&gt;Enable Required Plugins&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;code&gt;Edit &amp;gt; Plugins&lt;/code&gt;, and enable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Online Subsystem&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Online Subsystem Steam&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;(Optional) &lt;strong&gt;Online Subsystem Null&lt;/strong&gt; for fallback&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  2. &lt;strong&gt;Configure &lt;code&gt;DefaultEngine.ini&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[/Script/Engine.GameEngine]&lt;/span&gt;
&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="py"&gt;NetDriverDefinitions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;(DefName="GameNetDriver",DriverClassName="OnlineSubsystemSteam.SteamNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")&lt;/span&gt;

&lt;span class="nn"&gt;[OnlineSubsystem]&lt;/span&gt;
&lt;span class="py"&gt;DefaultPlatformService&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Steam&lt;/span&gt;

&lt;span class="nn"&gt;[OnlineSubsystemSteam]&lt;/span&gt;
&lt;span class="py"&gt;bEnabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;SteamDevAppId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;480&lt;/span&gt;

&lt;span class="c"&gt;; If using Sessions
; bInitServerOnClient=true
&lt;/span&gt;
&lt;span class="nn"&gt;[/Script/OnlineSubsystemSteam.SteamNetDriver]&lt;/span&gt;
&lt;span class="py"&gt;NetConnectionClassName&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"OnlineSubsystemSteam.SteamNetConnection"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For &lt;strong&gt;LAN testing&lt;/strong&gt;, change &lt;code&gt;DefaultPlatformService=Null&lt;/code&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  🎮 Creating Multiplayer Logic
&lt;/h3&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Creating the Game Instance Subsystem&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Instead of cluttering the GameInstance class, I created a custom UGameInstanceSubsystem to keep the session logic modular and reusable across the project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#pragma once
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"CoreMinimal.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"Subsystems/GameInstanceSubsystem.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"OnlineSubsystem.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"Interfaces/OnlineSessionInterface.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"OnlineSessionSettings.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"Online/OnlineSessionNames.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"MultiplayerSessionSubsystem.generated.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cm"&gt;/**
 * 
 */&lt;/span&gt;
&lt;span class="n"&gt;UCLASS&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Game_API&lt;/span&gt; &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;UGameInstanceSubsystem&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;GENERATED_BODY&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FSubsystemCollectionBase&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;Collection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Deinitialize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;IOnlineSessionPtr&lt;/span&gt; &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;UFUNCTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BlueprintCallable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;CreateServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;UFUNCTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BlueprintCallable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;FindServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;OnCreateSessionComplete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FName&lt;/span&gt; &lt;span class="n"&gt;SessionName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;bWasSuccessful&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;OnDestroySessionComplete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FName&lt;/span&gt; &lt;span class="n"&gt;SessionName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;bWasSuccessful&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;CreateServerAfterDestroy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;DestroyServerName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;ServerNameToFind&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;FName&lt;/span&gt; &lt;span class="n"&gt;MySessionName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;TSharedPtr&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;FOnlineSessionSearch&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SessionSearch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;OnFindSessionComplete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;bWasSuccessful&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;OnJoinSessionComplete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FName&lt;/span&gt; &lt;span class="n"&gt;SessionName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EOnJoinSessionCompleteResult&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;UPROPERTY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BlueprintReadWrite&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;GameMapPath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;UFUNCTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BlueprintCallable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;TravelToNewLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;NewLevelPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"MultiplayerSessionSubsystem.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PrintString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;GEngine&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;AddOnScreenDebugMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5.&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FColor&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//PrintString("Subsystem Constructor");&lt;/span&gt;
    &lt;span class="n"&gt;CreateServerAfterDestroy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;DestroyServerName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;ServerNameToFind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;MySessionName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"MultiplayerSubsystem"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FSubsystemCollectionBase&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;Collection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//PrintString("UMultiplayerSessionSubsystem::Initialize");&lt;/span&gt;

    &lt;span class="n"&gt;IOnlineSubsystem&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;OnlineSubsystem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IOnlineSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OnlineSubsystem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;SubsystemName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OnlineSubsystem&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetSubsystemName&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;PrintString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubsystemName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OnlineSubsystem&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetSessionInterface&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsValid&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;OnCreateSessionCompleteDelegates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddUObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OnCreateSessionComplete&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;OnDestroySessionCompleteDelegates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddUObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OnDestroySessionComplete&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;OnFindSessionsCompleteDelegates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddUObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OnFindSessionComplete&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;OnJoinSessionCompleteDelegates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddUObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OnJoinSessionComplete&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Deinitialize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//UE_LOG(LogTemp, Warning,TEXT("UMultiplayerSessionSubsystem::Deinitialize") );&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CreateServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;PrintString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;FOnlineSessionSettings&lt;/span&gt; &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bAllowJoinInProgress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bIsDedicated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bShouldAdvertise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bUseLobbiesIfAvailable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NumPublicConnections&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bUsesPresence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bAllowJoinViaPresence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IOnlineSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetSubsystemName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s"&gt;"NULL"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bIsLANMatch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bIsLANMatch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;FNamedOnlineSession&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ExistingSession&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetNamedSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MySessionName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ExistingSession&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CreateServerAfterDestroy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DestroyServerName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;DestroySession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MySessionName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SERVER_NAME"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;EOnlineDataAdvertisementType&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ViaOnlineServiceAndPing&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;CreateSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;MySessionName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;FindServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;PrintString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;SessionSearch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MakeShareable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FOnlineSessionSearch&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IOnlineSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetSubsystemName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s"&gt;"NULL"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;SessionSearch&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bIsLanQuery&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;SessionSearch&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bIsLanQuery&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;SessionSearch&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;MaxSearchResults&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;SessionSearch&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;QuerySettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SEARCH_PRESENCE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EOnlineComparisonOp&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Equals&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;ServerNameToFind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;FindSessions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;SessionSearch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToSharedRef&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OnCreateSessionComplete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FName&lt;/span&gt; &lt;span class="n"&gt;SessionName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;bWasSuccessful&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;PrintString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FString&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OnCreateSessionComplete: %d"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;bWasSuccessful&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bWasSuccessful&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;DefaultGameMapPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/Game/ThirdPerson/Maps/ThirdPersonMap?listen"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;GameMapPath&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;GetWorld&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ServerTravel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GameMapPath&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;"?listen"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;GetWorld&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ServerTravel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DefaultGameMapPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OnDestroySessionComplete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FName&lt;/span&gt; &lt;span class="n"&gt;SessionName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;bWasSuccessful&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CreateServerAfterDestroy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CreateServerAfterDestroy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;CreateServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DestroyServerName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OnFindSessionComplete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;bWasSuccessful&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;bWasSuccessful&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServerNameToFind&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;TArray&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;FOnlineSessionSearchResult&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SessionSearch&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;SearchResults&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;FOnlineSessionSearchResult&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;CorrectResult&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Num&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FOnlineSessionSearchResult&lt;/span&gt; &lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsValid&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"No-Name"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SessionSettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SERVER_NAME"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

                &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServerName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ServerNameToFind&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;CorrectResult&lt;/span&gt;&lt;span class="o"&gt;=&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CorrectResult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;JoinSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;MySessionName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;CorrectResult&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;PrintString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OnFindSessionComplete: No sessions found"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OnJoinSessionComplete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FName&lt;/span&gt; &lt;span class="n"&gt;SessionName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EOnJoinSessionCompleteResult&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;EOnJoinSessionCompleteResult&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;PrintString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OnJoinSessionComplete: Success"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Success&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SessionInterface&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetResolvedConnectString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MySessionName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;PrintString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FString&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Address: %s"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="n"&gt;APlayerController&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;PlayerController&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GetGameInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GetFirstLocalPlayerController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PlayerController&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;PrintString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ClientTravelCalled"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;PlayerController&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ClientTravel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;TRAVEL_Absolute&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;PrintString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"OnJoinSessionComplete: Failed"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;UMultiplayerSessionSubsystem&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;TravelToNewLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FString&lt;/span&gt; &lt;span class="n"&gt;NewLevelPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//Travel to new level with the connected client&lt;/span&gt;

    &lt;span class="n"&gt;GetWorld&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ServerTravel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NewLevelPath&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;"?listen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Blueprint Bindings (if using)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Use BlueprintImplementableEvents to trigger session create/join from UI.&lt;/li&gt;
&lt;li&gt;Bind session delegates to handle success/failure states.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔁 Handling Replication
&lt;/h3&gt;

&lt;p&gt;Unreal Engine uses &lt;strong&gt;server-authoritative networking&lt;/strong&gt;. Here are the basics to keep in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;Replicated&lt;/code&gt; and &lt;code&gt;ReplicatedUsing&lt;/code&gt; properties in C++ to sync data.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RPCs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Server&lt;/code&gt; functions execute logic on the server.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Multicast&lt;/code&gt; functions replicate to all clients.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Client&lt;/code&gt; functions execute logic on a specific client.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;UFUNCTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Reliable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Server_Fire&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;UFUNCTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NetMulticast&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Reliable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Multicast_PlayMuzzleFlash&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧪 Testing Locally
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;LAN&lt;/strong&gt;, use &lt;code&gt;Play → Standalone&lt;/code&gt; with multiple clients and ensure &lt;code&gt;bIsLANMatch = true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;Steam&lt;/strong&gt;, launch separate builds and test using the Steam Overlay (&lt;code&gt;Shift+Tab&lt;/code&gt;) and App ID 480 (Spacewar test app).&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧠 Pro Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Always use &lt;strong&gt;&lt;code&gt;SteamDevAppId=480&lt;/code&gt;&lt;/strong&gt; until your game is approved on Steam.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use logging extensively&lt;/strong&gt; to debug session creation, joining, and replication issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firewall/Antivirus&lt;/strong&gt; can block Steam connections — test on clean setups.&lt;/li&gt;
&lt;li&gt;Test LAN and Steam in &lt;strong&gt;shipping builds&lt;/strong&gt;, not just editor.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📌 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Implementing multiplayer using Unreal Engine's Steam and LAN systems gives you flexibility during development and release. Whether you’re building a local co-op game or an online competitive shooter, the workflow stays largely the same — just swap the subsystem and fine-tune your logic.&lt;/p&gt;

&lt;p&gt;If you’re working on a multiplayer game or have questions about Steam setup, feel free to connect with me in the comments!&lt;/p&gt;




</description>
      <category>unrealengine</category>
      <category>gamedev</category>
      <category>multiplayer</category>
      <category>steam</category>
    </item>
    <item>
      <title>Getting Started with Unreal Engine Game Development: My Journey and Insights</title>
      <dc:creator>WinterTurtle23</dc:creator>
      <pubDate>Sat, 10 May 2025 18:39:33 +0000</pubDate>
      <link>https://dev.to/winterturtle23/getting-started-with-unreal-engine-game-development-my-journey-and-insights-5gl4</link>
      <guid>https://dev.to/winterturtle23/getting-started-with-unreal-engine-game-development-my-journey-and-insights-5gl4</guid>
      <description>&lt;p&gt;&lt;strong&gt;Unreal Engine&lt;/strong&gt; has become one of the most powerful and accessible platforms for game developers, from indie devs to AAA studios. In this post, I’ll walk you through what makes Unreal Engine amazing, how I got started, and practical tips if you're planning to dive into this world.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎮 Why I Chose Unreal Engine
&lt;/h3&gt;

&lt;p&gt;Unreal Engine, especially version 5, offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Photorealistic visuals&lt;/strong&gt; thanks to Lumen and Nanite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robust multiplayer framework&lt;/strong&gt; using C++ and Blueprints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VR and mobile support&lt;/strong&gt; out of the box&lt;/li&gt;
&lt;li&gt;An intuitive &lt;strong&gt;Blueprint system&lt;/strong&gt; for non-coders or rapid prototyping&lt;/li&gt;
&lt;li&gt;A strong community and ecosystem (plugins, marketplace, forums)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you’re building a narrative game, a tactical shooter, or a training simulation — Unreal can do it all.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠 My Unreal Engine Projects
&lt;/h3&gt;

&lt;p&gt;I've worked on a range of games and simulations including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Offensive Warfare&lt;/strong&gt; – A 5v5 multiplayer deathmatch shooter (LAN + Steam)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surgical Simulation VR&lt;/strong&gt; – A realistic hand-tracking CPR and AED training app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cruiser&lt;/strong&gt; – An endless runner game for Android&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DP World Digital Twin&lt;/strong&gt; – A real-time dashboard-linked simulation for Dubai's logistics complex&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relic Hunters&lt;/strong&gt; – A co-op puzzle and combat multiplayer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each project deepened my understanding of Unreal's networking, optimization, VR, and UI capabilities.&lt;/p&gt;




&lt;h3&gt;
  
  
  💡 What I Learned
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Blueprints are powerful&lt;/strong&gt;, but mixing them with C++ gives the best of both worlds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimization is crucial&lt;/strong&gt; for mobile and VR — especially when dealing with high-polygon assets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replication is a beast&lt;/strong&gt; in multiplayer games, but Unreal handles a lot under the hood.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animation Blueprints and MetaHumans&lt;/strong&gt; are a game changer for realism.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always use version control&lt;/strong&gt; – Unreal projects can break fast.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🧰 Tools &amp;amp; Plugins I Use
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JetBrains Rider&lt;/strong&gt; – My go-to IDE for C++ programming in Unreal Engine. It offers seamless integration with Unreal projects, great IntelliSense, and efficient debugging tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Plugins &amp;amp; SDKs:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Steam &amp;amp; EOS SDK&lt;/strong&gt; – For implementing multiplayer functionality including matchmaking, lobbies, and player authentication across platforms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VaRest&lt;/strong&gt; – A powerful plugin for handling REST APIs within Unreal Engine, useful for connecting to web services or sending gameplay data to external servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quixel Bridge&lt;/strong&gt; – Provides access to thousands of high-quality 3D assets and textures, streamlining environment design with photorealistic visuals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase&lt;/strong&gt; – Integrated for backend services such as real-time databases, analytics, and user authentication, especially useful in mobile and multiplayer game scenarios.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📌 Tips for Beginners
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start with the &lt;strong&gt;Third Person template&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Learn &lt;strong&gt;Replication basics&lt;/strong&gt; before diving into multiplayer&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Blueprints&lt;/strong&gt; to prototype, then shift performance-heavy logic to C++&lt;/li&gt;
&lt;li&gt;Always &lt;strong&gt;profile and optimize&lt;/strong&gt; – especially for mobile and VR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unreal Engine Forum&lt;/strong&gt; – great place to ask questions&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  👋 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Unreal Engine has completely changed how I approach game development. Whether you're a programmer, an artist, or someone who loves tinkering with ideas — UE5 gives you the tools to bring your vision to life.&lt;/p&gt;

&lt;p&gt;If you’re working on something in Unreal or want to collaborate, let’s connect in the comments!&lt;/p&gt;




</description>
      <category>gamedev</category>
      <category>programming</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
