-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstart.html
More file actions
573 lines (555 loc) · 60.5 KB
/
start.html
File metadata and controls
573 lines (555 loc) · 60.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
<!DOCTYPE html>
<html lang="en">
<head>
<title>Flying Navigation System Docs</title>
<!-- Meta -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="favicon.ico">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>
<link href="https://fonts.googleapis.com/css2?family=Fira+Code&display=swap" rel="stylesheet">
<!-- FontAwesome JS -->
<script defer src="assets/fontawesome/js/all.js"></script>
<!-- Global CSS -->
<link rel="stylesheet" href="assets/plugins/bootstrap/css/bootstrap.min.css">
<!-- Plugins CSS -->
<link rel="stylesheet" href="assets/plugins/prism/prism.css">
<link rel="stylesheet" href="assets/plugins/elegant_font/css/style.css">
<!-- Theme CSS -->
<link id="theme-style" rel="stylesheet" href="assets/css/styles.css">
</head>
<body class="body-green">
<div class="page-wrapper">
<!-- ******Header****** -->
<header id="header" class="header">
<div class="container">
<div class="branding">
<h1 class="logo">
<a href="index.html">
<span aria-hidden="true" class="arrow_carrot-2up_alt icon"></span>
<span class="text-highlight">Flying </span><span class="text-bold">Navigation System</span>
</a>
</h1>
</div><!--//branding-->
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="index.html">Home</a></li>
<li class="breadcrumb-item active">Quick Start</li>
</ol>
</div><!--//container-->
</header><!--//header-->
<div class="doc-wrapper">
<div class="container">
<div id="doc-header" class="doc-header text-center">
<h1 class="doc-title"><i class="icon fa fa-paper-plane"></i> Quick Start</h1>
<div class="meta"><i class="far fa-clock"></i> Last updated: Feb 15th, 2021</div>
</div><!--//doc-header-->
<div class="doc-body row">
<div class="doc-content col-md-9 col-12 order-1">
<div class="content-inner">
<section id="download-section" class="doc-section">
<h2 class="section-title">Download</h2>
<div class="section-block">
<p>The Flying Navigation System plugin can be found on the Unreal Engine Marketplace. It can be downloaded and installed from the Library tab of the Epic Games Launcher.</p>
<a href="https://www.unrealengine.com/marketplace/en-US/product/65b9b3247c5c458dbb6de81c79cdc8f0" class="btn btn-green" target="_blank"><i class="fas fa-download"></i> Download the Flying Navigation System</a>
<br>
</div>
</section><!--//doc-section-->
<section id="quickstart-section" class="doc-section">
<h2 class="section-title">Quickstart Guide</h2>
<br>
<p>
In order for 3D pathfinding to work, an octree needs to be created in the level.
It is used by the pathfinding algorithm to navigate around obstacles.
</p>
<br>
<h3>Part 1: Creating the Octree</h3>
<div id="step1" class="section-block">
<h5>Step 1</h5>
<p>
Once the plugin is downloaded to your engine version, create a Flying template project.
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart1.png" data-toggle="lightbox" data-title="Create a Flying template project">
<img class="img-fluid" src="assets/images/quickstart1.png" alt="Create a Flying template project"/>
</a>
</div> <!--//screenshot-holder-->
<p>
Make sure to enable the plugin (Under <code>Navigation</code>) in the Plugins window and restart the editor.
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart2.png" data-toggle="lightbox" data-title="Enable from plugin window">
<img class="img-fluid" src="assets/images/quickstart2.png" alt="Enable from plugin window"/>
</a>
</div> <!--//screenshot-holder-->
</div>
<div id="step2" class="section-block">
<h5>Step 2</h5>
<p>
Head over to Project Settings, then <code>Engine/Navigation System</code>.
Now we want to create at least one Navigation Agent.
Here two have been created, one that uses the Flying Navigation System and another that uses the standard Recast Navmesh system. Which system the agent uses is dependent on the <code>Preferred Nav Data</code> property.
</p>
<ol>
<li>Set an Agent to <code>FlyingNavigationData</code> to make it use the Flying Navigation System</li>
<li>Set an Agent to <code>RecastNavMesh</code> to make it use the default UE4 navigation.</li>
</ol>
<p>
You can also change the colour to distinguish the two, which is reflected in the debug display. For this quickstart, we won’t use the Recast agent.
</p>
<div class="callout-block callout-warning">
<div class="icon-holder">
<i class="fas fa-exclamation-circle"></i>
</div><!--//icon-holder-->
<div class="content">
<h4 class="callout-title">IMPORTANT</h4>
<p>Also make sure to set the <code>Navigation/Default Agent Name</code> to a valid name or None. Pathfinding requests will sometimes fail if an invalid name is set.</p>
</div><!--//content-->
</div><!--//callout-block-->
<div class="screenshot-holder">
<a href="assets/images/quickstart3.png" data-toggle="lightbox" data-title="Create a flying navigation agent in the project settings">
<img class="img-fluid" src="assets/images/quickstart3.png" alt="Create a flying navigation agent in the project settings"/>
</a>
</div> <!--//screenshot-holder-->
<div class="callout-block callout-info">
<div class="icon-holder">
<i class="fas fa-info-circle"></i>
</div><!--//icon-holder-->
<div class="content">
<h4 class="callout-title"><code>Nav Data Class</code> vs <code>Preferred Nav Data</code></h4>
<p>
The <code>Nav Data Class</code> property is legacy, but setting it will automatically set <code>Preferred Nav Data</code> to the same value. The pathfinding method is only determined by <code>Preferred Nav Data</code>.
</p>
</div><!--//content-->
</div><!--//callout-block-->
<p>You should also note the <code>Nav Agent Radius</code> property, as this will become useful later.</p>
</div>
<div id="step3" class="section-block">
<h5>Step 3</h5>
<p>Once the Supported Agents are set up, you can add a standard Nav Mesh Bounds Volume from the side panel.</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart4.png" data-toggle="lightbox" data-title="Add a Nav Mesh Bounds volume to the level">
<img class="img-fluid" src="assets/images/quickstart4.png" alt="Add a Nav Mesh Bounds volume to the level"/>
</a>
</div> <!--//screenshot-holder-->
<p>
At this point you should see a <code>FlyingNavigationData-FlyingAgent</code> or similar actor spawned in your level.
If you also created a Recast agent you should also see a <code>RecastNavMesh-RecastAgent</code> or similar actor.
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart5.png" data-toggle="lightbox" data-title="Make sure a Flying navigation data actor appears in the level.">
<img class="img-fluid" src="assets/images/quickstart5.png" alt="Make sure a Flying navigation data actor appears in the level."/>
</a>
</div> <!--//screenshot-holder-->
<div class="callout-block callout-warning">
<div class="icon-holder">
<i class="fas fa-bug"></i>
</div><!--//icon-holder-->
<div class="content">
<h4 class="callout-title">If you can't find it:</h4>
<p>
You may be required to reload the level after placing the bounds volume to trigger the Navigation Actor spawn. <br>
If you still don’t see the actor, make sure that <code>FlyingAgent</code> is checked under <br> <code>WorldSettings/World/NavigationSystemConfig/SupportedAgentsMask</code> <br> and <br> <code>NavMeshBoundsVolume/Navigation/SupportedAgents</code>.
</p>
</div><!--//content-->
</div><!--//callout-block-->
</div>
<div id="step4" class="section-block">
<h5>Step 4</h5>
<p>You can now scale the bounds volume to fit your scene. For the FlyingExampleMap, that looks like this:</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart6.png" data-toggle="lightbox" data-title="Scale and move the nav mesh bounds volume to fit the scene">
<img class="img-fluid" src="assets/images/quickstart6.png" alt="Scale and move the nav mesh bounds volume to fit the scene"/>
</a>
</div> <!--//screenshot-holder-->
<div class="callout-block callout-info">
<div class="icon-holder">
<i class="fas fa-info-circle"></i>
</div><!--//icon-holder-->
<div class="content">
<h4 class="callout-title">Generating Octrees in Levels</h4>
<p>
The Flying Navigation System will generate one Octree structure in the world, which is required to be a cube.
This cube is calculated from the <i>largest edge</i> of the <i>sum</i> of the Nav Mesh Bounds Volumes. (The sum of boxes is a larger box that encapsulates both).<br>
However, the building algorithm only takes meshes into account that are inside Nav Mesh Bounds Volumes (as well as some other optimisations).
The Octree cube centre is calculated from the <i>centre</i> of the <i>sum</i> of the Nav Mesh Bounds Volumes, so it can be useful to scale up and move the volume to make the best use of the flying space.
</p>
</div><!--//content-->
</div><!--//callout-block-->
</div>
<div id="step5" class="section-block">
<h5>Step 5</h5>
<p>
Select the FlyingNavigationData actor, and click <code>Rebuild Navigation Data</code> (Or click <code>Build/Build Paths</code> in the toolbar).
Make sure <code>Enable Drawing</code> and <code>Show/Navigation</code> in the viewport (press <code>P</code>) are both checked, and you should get something like this:
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart7.png" data-toggle="lightbox" data-title="The blocked voxels are displayed">
<img class="img-fluid" src="assets/images/quickstart7.png" alt="The blocked voxels are displayed"/>
</a>
</div> <!--//screenshot-holder-->
</div>
<div id="step6" class="section-block">
<h5>Step 6</h5>
<p>
We’re not quite finished yet: you might notice that the player spaceship is being treated as a blocking mesh.
This will be problematic for the pathfinding, as the destination point (the spaceship) will be inside a blocked area.
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart8.png" data-toggle="lightbox" data-title="Spaceship causes blocked voxels">
<img class="img-fluid" src="assets/images/quickstart8.png" alt="Spaceship causes blocked voxels"/>
</a>
</div> <!--//screenshot-holder-->
<p>To fix this, disable <code>Collision/Can Ever Affect Navigation</code> on the Flying Pawn's mesh:</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart9.png" data-toggle="lightbox" data-title="Uncheck Can Ever Affect Navigation under the Collision category on the static mesh">
<img class="img-fluid" src="assets/images/quickstart9.png" alt="Uncheck Can Ever Affect Navigation under the Collision category on the static mesh"/>
</a>
</div> <!--//screenshot-holder-->
<p>Rebuild the Octree, and everything should be good to go.</p>
<div class="callout-block callout-success">
<div class="icon-holder">
<i class="fas fa-thumbs-up"></i>
</div><!--//icon-holder-->
<div class="content">
<h4 class="callout-title">Congratulations!</h4>
<p>You’ve set up your first octree!</p>
</div><!--//content-->
</div><!--//callout-block-->
</div>
<h3>Part 2: Building a flying AI</h3>
<p>This is a basic UE4 AI setup; there are lots of AI programming tutorials on YouTube, such as <a href="https://youtu.be/zNJEvAGiw7w" target="_blank">this</a> one. Our AI will follow the player wherever they go.</p>
<div id="step7" class="section-block">
<h5>Step 7</h5>
<p>
Create a new <code>AIController</code> Blueprint (you'll need to search for it under <code>All Classes</code>) called <code>AIC_FollowingController</code>. <br>
Create a new Blackboard asset (<code>Right Click -> Artificial Intelligence</code>) called <code>BB_FollowingPawn</code>. <br>
Create a new <code>Pawn</code> Blueprint called <code>BP_FollowingPawn</code>. <br>
Create a new Behavior Tree asset (<code>Right Click -> Artificial Intelligence</code>) called <code>BT_FollowingBehavior</code>. <br>
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart10.png" data-toggle="lightbox" data-title="A folder containing the required AI assets">
<img class="img-fluid" src="assets/images/quickstart10.png" alt="A folder containing the required AI assets"/>
</a>
</div> <!--//screenshot-holder-->
<p>
Add a few static mesh components to the BP_FollowingPawn to make it look interesting.
Make sure to disable <code>Collision/Can Ever Affect Navigation</code> on each mesh.
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart11.png" data-toggle="lightbox" data-title="Uncheck Can Ever Affect Navigation under the Collision category on each static mesh on the pawn">
<img class="img-fluid" src="assets/images/quickstart11.png" alt="Uncheck Can Ever Affect Navigation under the Collision category on each static mesh on the pawn"/>
</a>
</div> <!--//screenshot-holder-->
</div>
<div id="step8" class="section-block">
<h5>Step 8</h5>
<p>
Add a <code>FloatingPawnMovement</code> component.
All pawns require some kind of movement component to participate in navigation. This could be the <code>CharacterMovementComponent</code> in the Character class. <br>
The movement component settings (<code>Nav Movement/Movement Capabilities</code>) define which navigation system your agent should use:
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart12.png" data-toggle="lightbox" data-title="Set Preferred Nav Data in the Movement Component Settings">
<img class="img-fluid" src="assets/images/quickstart12.png" alt="Set Preferred Nav Data in the Movement Component Settings"/>
</a>
</div> <!--//screenshot-holder-->
<div class="callout-block callout-info">
<div class="icon-holder">
<i class="fas fa-info-circle"></i>
</div><!--//icon-holder-->
<div class="content">
<h4 class="callout-title"><code>Can Crouch</code> etc. checkboxes</h4>
<p>
The <code>Can Crouch</code>, <code>Can Walk</code>, <code>Can Fly</code> etc. checkboxes are only used by <code>CharacterMovementComponent</code> and will not impact how this pawn behaves. <br>
However, the other options are used for determining which navigation data to use if you have set up multiple agents with the same <code>Preferred Nav Data</code> in Project Settings.
Please see <a href="usage.html#FNavAgentProperties" target="_blank">here</a> for more info.
</p>
</div><!--//content-->
</div><!--//callout-block-->
</div>
<div id="step9" class="section-block">
<h5>Step 9</h5>
<p>Add a <code>TargetActor</code> Object value to the blackboard, with <code>Actor</code> as the <code>Base Class</code>.</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart13.png" data-toggle="lightbox" data-title="Add a target actor variable to the blackboard.">
<img class="img-fluid" src="assets/images/quickstart13.png" alt="Add a target actor variable to the blackboard."/>
</a>
</div> <!--//screenshot-holder-->
<p>
In <code>AIC_FollowingController</code>, set up the blackboard, set the <code>TargetActor</code> property and run the behavior tree in the <code>BeginPlay</code> event.
To set the player pawn to <code>TargetActor</code>, use the <code>Set Value as Object</code> node with a string literal in the key name (in this case <code>TargetActor</code>).
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart14.png" data-toggle="lightbox" data-title="Set up the blackboard with the player pawn as the target actor">
<img class="img-fluid" src="assets/images/quickstart14.png" alt="Set up the blackboard with the player pawn as the target actor"/>
</a>
</div> <!--//screenshot-holder-->
<div class="spoiler">
<div class="btn btn-blue btn-cta spoiler-btn"><i class="fas fa-code-branch"></i> Blueprint Code</div>
<div class="spoiler-body collapse">
<div class="code-block">
<pre><code class="language-git">Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_0"
FunctionReference=(MemberName="UseBlackboard",bSelfContext=True)
NodePosX=208
NodePosY=-16
NodeGuid=3E8252FF45537C625491F2AB9495ED10
CustomProperties Pin (PinId=80F9E3BA4926DA5335D705ADCE98485F,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_Event_0 07684E254FC1C1BEF80CE894942660B6,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=11A0F87E40F44FEED746ABAD9532C2F5,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_IfThenElse_0 67B370EF4988E230B080CBA8A29ADE51,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=4285BE6D42F0420F65B66496DAA3C7CA,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AIModule.AIController"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=3F6D3995430BDFDF084D03AEAC66B8E5,PinName="BlackboardAsset",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AIModule.BlackboardData"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,DefaultObject="/Game/FlyingBP/AI/BB_FollowingPawn.BB_FollowingPawn",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=ED5D29C64055856BFFC07CB6A5366A91,PinName="BlackboardComponent",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AIModule.BlackboardComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_Knot_0 3DB90C9D4381803596FD83A2E4B68526,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=205905FA4C924368079A088C7F61A431,PinName="ReturnValue",Direction="EGPD_Output",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,DefaultValue="false",AutogeneratedDefaultValue="false",LinkedTo=(K2Node_IfThenElse_0 59D910F446245B24B02B658A9CD565E4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_IfThenElse Name="K2Node_IfThenElse_0"
NodePosX=608
NodeGuid=4E9B8A0D4745B5A30D9C54B6FE642748
CustomProperties Pin (PinId=67B370EF4988E230B080CBA8A29ADE51,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_CallFunction_0 11A0F87E40F44FEED746ABAD9532C2F5,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=59D910F446245B24B02B658A9CD565E4,PinName="Condition",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,DefaultValue="true",AutogeneratedDefaultValue="true",LinkedTo=(K2Node_CallFunction_0 205905FA4C924368079A088C7F61A431,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=AF1376E642110CC3045D028C22AF07F0,PinName="then",PinFriendlyName=NSLOCTEXT("K2Node", "true", "true"),Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_CallFunction_1 B9F78B364D41E932BA008EB3E6E46A04,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=2DDEA00A4B2D6A8C7EEE41B493D3D040,PinName="else",PinFriendlyName=NSLOCTEXT("K2Node", "false", "false"),Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_1"
FunctionReference=(MemberParent=Class'"/Script/AIModule.BlackboardComponent"',MemberName="SetValueAsObject")
NodePosX=864
NodePosY=-16
NodeGuid=8ECF39D6439EDD140C5D97A6FC0318C1
CustomProperties Pin (PinId=B9F78B364D41E932BA008EB3E6E46A04,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_IfThenElse_0 AF1376E642110CC3045D028C22AF07F0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=BA3805654910060EA3960CA9860A2A5E,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_CallFunction_4 51E3A3604D66AF5528A82AA35827F9EB,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=4F778431405F444FDEE84295F855D67E,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nBlackboard Component Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AIModule.BlackboardComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_Knot_0 3A31D3DE47963F01D6CAA5AB08ADCA35,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=CAA2AB9841C9DA4D9D8132B7D0BFC3B8,PinName="KeyName",PinToolTip="Key Name\nName (by ref)",PinType.PinCategory="name",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=True,PinType.bIsConst=True,PinType.bIsWeakPointer=False,DefaultValue="None",AutogeneratedDefaultValue="None",LinkedTo=(K2Node_CallFunction_3 D552FE464C183C0F042548A869CE5D5D,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=CA324B9C4A397AFDCC3DD7B6A19F6345,PinName="ObjectValue",PinToolTip="Object Value\nObject Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/CoreUObject.Object"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_CallFunction_2 EB19D983439B1AD57654D0BC12041954,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_Knot Name="K2Node_Knot_0"
NodePosX=640
NodePosY=112
NodeGuid=BEC83E9040158FCBE8F2BEB714985234
CustomProperties Pin (PinId=3DB90C9D4381803596FD83A2E4B68526,PinName="InputPin",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AIModule.BlackboardComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_CallFunction_0 ED5D29C64055856BFFC07CB6A5366A91,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=3A31D3DE47963F01D6CAA5AB08ADCA35,PinName="OutputPin",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AIModule.BlackboardComponent"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_CallFunction_1 4F778431405F444FDEE84295F855D67E,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_2"
bIsPureFunc=True
FunctionReference=(MemberParent=Class'"/Script/Engine.GameplayStatics"',MemberName="GetPlayerPawn")
NodePosX=528
NodePosY=256
NodeGuid=220F21E7440E10118B7DE59F55DCEF8B
CustomProperties Pin (PinId=8C571B5B4A15705CC8904F8E4567517D,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.GameplayStatics"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,DefaultObject="/Script/Engine.Default__GameplayStatics",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=82F875234A47D91CD1D71EA97418461A,PinName="WorldContextObject",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/CoreUObject.Object"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=BF09DC304B102FD58BCD8AA2C6D29489,PinName="PlayerIndex",PinType.PinCategory="int",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,DefaultValue="0",AutogeneratedDefaultValue="0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=EB19D983439B1AD57654D0BC12041954,PinName="ReturnValue",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.Pawn"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_CallFunction_1 CA324B9C4A397AFDCC3DD7B6A19F6345,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_3"
bIsPureFunc=True
FunctionReference=(MemberParent=Class'"/Script/Engine.KismetSystemLibrary"',MemberName="MakeLiteralName")
NodePosX=512
NodePosY=160
NodeGuid=CCB38595493B40CE4B332F9EB1D1B661
CustomProperties Pin (PinId=D50DECC84576E6AF98BE9988292A1471,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.KismetSystemLibrary"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,DefaultObject="/Script/Engine.Default__KismetSystemLibrary",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=49B46DA44EBDD55B77905DA7AB1ECE0A,PinName="Value",PinType.PinCategory="name",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,DefaultValue="TargetActor",AutogeneratedDefaultValue="None",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=D552FE464C183C0F042548A869CE5D5D,PinName="ReturnValue",Direction="EGPD_Output",PinType.PinCategory="name",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,DefaultValue="None",AutogeneratedDefaultValue="None",LinkedTo=(K2Node_CallFunction_1 CAA2AB9841C9DA4D9D8132B7D0BFC3B8,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_4"
FunctionReference=(MemberName="RunBehaviorTree",bSelfContext=True)
NodePosX=1200
NodePosY=-16
NodeGuid=A2CA51794912869DD84E48889A886EF5
CustomProperties Pin (PinId=51E3A3604D66AF5528A82AA35827F9EB,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,LinkedTo=(K2Node_CallFunction_1 BA3805654910060EA3960CA9860A2A5E,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=2C6D131141F53217F94F6EA638F95F1B,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=780432094105F055AE4C03A68029C615,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AIModule.AIController"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=D499286C41EE3F257EF31882D66B8948,PinName="BTAsset",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/AIModule.BehaviorTree"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,DefaultObject="/Game/FlyingBP/AI/BT_FollowingBehavior.BT_FollowingBehavior",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=5AB4B5654A4C1A9BB2AD9290DCDAAD62,PinName="ReturnValue",Direction="EGPD_Output",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,DefaultValue="false",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object</code></pre>
</div><!--//code-block-->
</div>
</div>
</div>
<div id="step10" class="section-block">
<h5>Step 10</h5>
<p>
In <code>BP_FollowingPawn</code>, set <code>Pawn/AI Controller Class</code> to <code>AIC_FollowingController</code>.
Also, set the <code>Use Controller Rotation *</code> checkboxes, so that the pawn rotates to follow the path.
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart15.png" data-toggle="lightbox" data-title="Attach AI controller to pawn">
<img class="img-fluid" src="assets/images/quickstart15.png" alt="Attach AI controller to pawn"/>
</a>
</div> <!--//screenshot-holder-->
</div>
<div id="step11" class="section-block">
<h5>Step 11</h5>
<p>
The only thing left is to fill in the <code>BT_FollowingBehavior</code> behavior tree.
First, set the <code>Blackboard Asset</code> to <code>BB_FollowingPawn</code>.
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart16.png" data-toggle="lightbox" data-title="Set the Blackboard Asset to BB_FollowingPawn">
<img class="img-fluid" src="assets/images/quickstart16.png" alt="Set the Blackboard Asset to BB_FollowingPawn"/>
</a>
</div> <!--//screenshot-holder-->
<p>
Create a Sequence, then a Wait node and a Move To node.
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart17.png" data-toggle="lightbox" data-title="Create a Sequence, then a Wait node and a Move To node in the behaviour tree">
<img class="img-fluid" src="assets/images/quickstart17.png" alt="Create a Sequence, then a Wait node and a Move To node in the behaviour tree"/>
</a>
</div> <!--//screenshot-holder-->
<div class="callout-block callout-info">
<div class="icon-holder">
<i class="fas fa-info-circle"></i>
</div><!--//icon-holder-->
<div class="content">
<h4 class="callout-title">The Move To Behavior Tree Node</h4>
<p>
That’s right, the Flying Navigation System uses the <i>same</i> Move To node as standard nav walking! <br>
Which system the node uses to find a path is determined by MovementComponent settings of the Pawn it is controlling <br> (<code>Nav Movement/Movement Capabilities</code>).
We changed this earlier in our <code>BP_FollowingPawn</code>.
</p>
</div><!--//content-->
</div><!--//callout-block-->
<p>
It’s highly recommended that you turn off <code>Allow Partial Path</code> on the Move To node, to prevent searching the whole world if the target is inaccessible.
The pathfinding algorithm will try to guess the closest point to the target if it’s in a blocked area.
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart18.png" data-toggle="lightbox" data-title="Turn off Allow Partial path on the Move To node">
<img class="img-fluid" src="assets/images/quickstart18.png" alt="Turn off Allow Partial path on the Move To node"/>
</a>
</div> <!--//screenshot-holder-->
<div class="callout-block callout-warning">
<div class="icon-holder">
<i class="fas fa-bug"></i>
</div><!--//icon-holder-->
<div class="content">
<h4 class="callout-title">IMPORTANT</h4>
<p>The behaviour tree node does not use async pathfinding (at the moment, updates are planned), which means it should only be used with simple scenes or pathfinding speed optimisations.</p>
</div><!--//content-->
</div><!--//callout-block-->
</div>
<div id="step12" class="section-block">
<h5>Step 12</h5>
<p>
Drag your <code>BP_FollowingPawn</code> into your level, press play and give it a go! Our following pawn should follow you around the level, even underneath the floor!
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart19.png" data-toggle="lightbox" data-title="Playing the flying quickstart level">
<img class="img-fluid" src="assets/images/quickstart19.png" alt="Playing the flying quickstart level"/>
</a>
</div> <!--//screenshot-holder-->
<div class="callout-block callout-info">
<div class="icon-holder">
<i class="fas fa-info-circle"></i>
</div><!--//icon-holder-->
<div class="content">
<h4 class="callout-title">Debug path drawing</h4>
<p>
You can see the path the AI calculates by enabling <code>Draw Debug Paths</code> on the <code>FlyingNavigationData</code> actor in the level.
</p>
</div><!--//content-->
</div><!--//callout-block-->
</div>
<div id="step13" class="section-block">
<h5>Step 13</h5>
<p>
It can be rather difficult to see what the AI was actually doing in the flying simulator, so you can delete the <code>FlyingPawn</code> from the template level and add a <code>DefaultPawn</code> (Search <code>DefaultPawn</code> under <code>Engine C++ Classes</code>).
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart20.png" data-toggle="lightbox" data-title="Finding the default pawn class in the engine c++ classed folder">
<img class="img-fluid" src="assets/images/quickstart20.png" alt="Finding the default pawn class in the engine c++ classed folder"/>
</a>
</div> <!--//screenshot-holder-->
<p>
If you set <code>Auto Possess Player</code> to <code>Player 0</code> and bump up the <code>Max Speed</code> on the <code>DefaultPawn</code>, you can give the AI a run for its money.
</p>
<div class="screenshot-holder">
<a href="assets/images/quickstart21.png" data-toggle="lightbox" data-title="Set auto possesses player to player 0 and increase the max speed to 6000 on the default pawn">
<img class="img-fluid" src="assets/images/quickstart21.png" alt="Set auto possesses player to player 0 and increase the max speed to 6000 on the default pawn"/>
</a>
</div> <!--//screenshot-holder-->
</div>
<div class="callout-block callout-success">
<div class="icon-holder">
<i class="fas fa-thumbs-up"></i>
</div><!--//icon-holder-->
<div class="content">
<h4 class="callout-title">Congratulations!</h4>
<p>
You've successfully created your first flying agent!
</p>
</div><!--//content-->
</div><!--//callout-block-->
</section><!--//doc-section-->
<section id="where-section" class="doc-section">
<h2 class="section-title">Where to next?</h2>
<br>
<p>
For more details on the Flying Navigation System, check out the <a href="usage.html">usage</a> page.<br>
If you have problems, check out the <a href="troubleshooting.html">troubleshooting</a> page.
</p>
</section>
</div><!--//content-inner-->
</div><!--//doc-content-->
<div class="doc-sidebar col-md-3 col-12 order-0 d-none d-md-flex">
<div id="doc-nav" class="doc-nav">
<nav id="doc-menu" class="nav doc-menu flex-column sticky">
<a class="nav-link scrollto" href="#download-section">Download</a>
<a class="nav-link scrollto" href="#quickstart-section">Quickstart</a>
<nav class="doc-sub-menu nav flex-column">
<a class="nav-link scrollto" href="#step1">Step 1</a>
<a class="nav-link scrollto" href="#step2">Step 2</a>
<a class="nav-link scrollto" href="#step3">Step 3</a>
<a class="nav-link scrollto" href="#step4">Step 4</a>
<a class="nav-link scrollto" href="#step5">Step 5</a>
<a class="nav-link scrollto" href="#step6">Step 6</a>
<a class="nav-link scrollto" href="#step7">Step 7</a>
<a class="nav-link scrollto" href="#step8">Step 8</a>
<a class="nav-link scrollto" href="#step9">Step 9</a>
<a class="nav-link scrollto" href="#step10">Step 10</a>
<a class="nav-link scrollto" href="#step11">Step 11</a>
<a class="nav-link scrollto" href="#step12">Step 12</a>
<a class="nav-link scrollto" href="#step13">Step 13</a>
</nav><!--//nav-->
<a class="nav-link scrollto" href="#where-section">Where to next?</a>
</nav><!--//doc-menu-->
</div>
</div><!--//doc-sidebar-->
</div><!--//doc-body-->
</div><!--//container-->
</div><!--//doc-wrapper-->
<div id="promo-block" class="promo-block">
<div class="container">
<div class="promo-block-inner">
<h3 class="promo-title text-center"><i class="fas fa-heart"></i> <a href="https://www.unrealengine.com/marketplace/en-US/product/65b9b3247c5c458dbb6de81c79cdc8f0" target="_blank">If you like the Flying Navigation System</a></h3>
<div class="content-holder col-lg-7 col-md-6 col-12">
<div class="content-holder-inner">
<div class="desc">
<h4 class="content-title"> Please consider leaving a review on the Unreal Marketplace</h4>
<a class="btn btn-cta" href="https://www.unrealengine.com/marketplace/en-US/product/65b9b3247c5c458dbb6de81c79cdc8f0/reviews" target="_blank"><i class="fas fa-external-link-alt"></i> Leave Review</a>
<p>Thank you for your support</p>
</div><!--//desc-->
<div class="author"><a href="https://ninepointeightgame.com/about">Ben Sutherland</a></div>
</div><!--//content-holder-inner-->
</div><!--//content-holder-->
</div><!--//promo-block-inner-->
</div><!--//container-->
</div><!--//promo-block-->
</div><!--//page-wrapper-->
<footer id="footer" class="footer text-center">
<div class="container">
<!--/* This template is free as long as you keep the footer attribution link. If you'd like to use the template without the attribution link, you can buy the commercial license via our website: themes.3rdwavemedia.com Thank you for your support. :) */-->
<small class="copyright">Designed with <i class="fas fa-heart"></i> by <a href="https://themes.3rdwavemedia.com/" target="_blank">Xiaoying Riley</a> for developers</small>
</div><!--//container-->
</footer><!--//footer-->
<!-- Main Javascript -->
<script type="text/javascript" src="assets/plugins/jquery-3.4.1.min.js"></script>
<script type="text/javascript" src="assets/plugins/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="assets/plugins/prism/prism.js"></script>
<script type="text/javascript" src="assets/plugins/jquery-scrollTo/jquery.scrollTo.min.js"></script>
<script type="text/javascript" src="assets/plugins/stickyfill/dist/stickyfill.min.js"></script>
<script type="text/javascript" src="assets/plugins/lightbox/dist/ekko-lightbox.min.js"></script>
<script type="text/javascript" src="assets/js/main.js"></script>
</body>
</html>