Trending
Opinion: How will Project 2025 impact game developers?
The Heritage Foundation's manifesto for the possible next administration could do great harm to many, including large portions of the game development community.
Featured Blog | This community-written post highlights the best of what the game industry has to offer. Read more like it on the Game Developer Blogs or learn how to Submit Your Own Blog Post
Arrival in Hell is a classic point and click adventure game. I'll be posting weekly updates on how the game has been built. This week I'll start by explaining how navigation works.
Hello and welcome to the first instalment of the Arrival in Hell dev blog. Even though we’ve been working on Arrival in Hell in our spare time for over a year now, I wanted to kick off the dev blog from the beginning so you get a much fuller picture of how the game works.
In case you don’t know already, I’ll quickly summarize what we’re making. It’s a remake of a 2006 Flash game originally created by my friends Eduardo Mojica and Richard Rout. It is a horror point-and-click adventure game and we’ll be building it in Unity. I’ve been programming and making games for about 10 years now, but this is my first project in Unity.
The first thing I wanted to nail down early, before anything else, was the player movement. Since the game is now true 3D, the player needs to path find in 3D space. Luckily Unity already has awesome pathfinding functionality built in. To use it you simply open Window > Navigation, select objects you want to be included in the path finding and check them as ‘Navigation static’. This tells Unity that these objects are static (not moving) and should be taken into account when pathfinding.
Setting objects to ‘Navigation Static’
I’d like to take a moment to express just how awesome this is. In the past I, like most game developers, have had to build my own path finding system. I’ve done A* tile and node based pathfinding systems before, and in both cases, particularly node based, setting up the ‘walls’ has been a real pain. With a node based system you have to manually place points used by the AI to navigate between. Not only does Unity come with navigation out of the box, it also uses navigation meshes, which are far more efficient and smooth than manually placed nodes. To top it all off, you can re-bake (recalculate) the entire nav mesh by clicking one button. Gone are the days of manually fiddling with navigation nodes!
One of my less successful attempts at node based pathfinding
Once you’ve marked static objects to be included in the nav mesh, you choose a few settings (such as how steep a slope can be and how high a step can be before it’s considered a wall) and hit the bake button. This will generate your nav mesh which you can preview in the scene view. One thing worth noting is that just because an object exists in the scene, doesn’t mean it has to be part of the nav mesh. For example in the game I don’t care if the player walks over rubble, so I have not marked any rubble objects as navigation static; this speeds up the nav mesh generation.
These are the actual values used in Arrival in Hell
Baked NavMesh. Unity does an excellent job of automatically generating this
Once the nav mesh was generated I simply added a NavMeshAgent component to the player model. The game is now set up for navigation. The only thing left is adding mouse input to control the destination of the NavMeshAgent.
NavMesh Agent settings
To tell the nav mesh agent where to navigate to I:
Listen for mouse input
Get the mouse position in screen space
Convert the screen space coordinate to a ray from the camera
Cast the ray out until it hits the floor
Set the NavMeshAgent’s destination to that position on the floor
The C# code looks a little like this:
void Update () { if (Input.GetMouseButton(0)) { Vector3 screenPoint; screenPoint = Input.mousePosition; Ray ray = Camera.main.ScreenPointToRay(screenPoint); RaycastHit hitInfo; if (floor.GetComponent().Raycast(ray, out hitInfo, 10000.0f)) { Vector3 targetPoint = ray.GetPoint(hitInfo.distance); agent.SetDestination(targetPoint); agent.Resume(); } } } |
Click to set NavMeshAgent’s destination
You can visualize the destination and path in the scene view
This handles pretty much all of the navigation needs of the game. The only exception is when the nav mesh changes due to some event in the game. For example the cell door is initially closed in the first room. Later when it’s opened, the nav mesh needs to update to reflect this change and to allow the player to walk through the now open door. Rather than re-baking the entire static nav mesh at runtime, I have made use of the ‘NavMeshObstacle’ component. This component allows you to include ‘dynamic’ objects in the path finding. If the object moves, Unity’s pathfinding algorithm updates accordingly on the fly.
Navigation paths are updated automatically with changes to NavMeshObtacle
Visualisation of NavMeshObstacle changes in scene view
And there we have it; this is how the navigation works in Arrival in Hell. All of this is achieved using out of the box navigation functionality supplied with Unity. I’ve made the example shown above available here in case anyone wants it. Next week I’ll be detailing how room changes and camera angles work.
Read more about:
Featured BlogsYou May Also Like