Into the Light is a third-person action adventure game which follows the story of Will as he follows his son, Elliot, in a realm that leads to paradise.
A thank you video from the development team.
From left to right: Alexandra Arcega, Jed Pascua, Paul Aguilar, Alson Entuna, Josh Ignacio, David Ramos |
Frome left to right: Josh Ignacio, Jed Pascua, Alexandra Arcega, John Alson Entuna, Paul Aguilar |
Into the Light is our entry for our final requirements for CAPSTN2(Thesis2) and the developement time alloted for this project was approx. 10 weeks including documentation and development proper of our proposed game.
Development Team:
1. John Alson Entuna - Project Lead, Technical Director, Lighting Director, Cinematic Director, Character Artist, Gameplay Programmer
2. Mario Joshua Ignacio - Lead Programmer, Game Designer, Script Writer
3. Paul Aguilar - Lead Game Designer, Game Director, Level Designer, Level Scripter, Producer
4. Alexandra Arcega - Environment Artist, Marketing, Advertising
5. Jed Ralph Pascua - Art Director, Character Artist, Environment Artist
Thesis Consultant/Adviser - David Ramos
Roles played:
1. Project/Team Lead
2. Technical Director - Programming and Art
3. Gameplay and Tools Programmer - C++
4. Cinematics Director - Cinematic Direction, Camera Manipulation, Engine Scripting
5. Lead Character Artist - Sculpting, Modelling, Rigging, Skinning, Engine Integration, Quality Control
6. Lighting Director - Scene Lighting and Post Process
7. Sound Effect Engineer - SFX and BGM Integration
In part of the development of Into the Light, GoaTo Interactive would like to thanks the following:
1. Zchelmer Gamboa
2. Vincent Entuna
3. Marco Rabat
4. Samantha Velayo
5. Eddelaine Colbera
6. Cyrus Tuico
7. Daryll Espanola
8. Rigel Marco
9. Aguilar Family
10. Arcega Family
11. Entuna Family
12. Ignacio Family
13. Pascua Family
Tools used by the development team:
1. Unreal Engine 4.15.0 - Game Engine
2. Visual Studio 2015 Community - IDE
3. Visual AssistX - Visual Studio Intellisense
4. Visual Studio Team Foundation - Git Repository Server
5. Autodesk Maya 2016 - 3D Modeling Software
6. ZBrush 4R7 - 3D Sculpting Sofware
7. Marvelous Designer 5 - 3D Cloth Simulating Software
8. Substance Painter 2 - 3D Texture Software
9. Substance Bitmap2Material - 3D Bitmap Generating Software
10. Git and SourceTree - Source Control
11. Discord - Team Chat
12. NVidia Gameworks - Realtime Physics Simulating SDK
13. Adobe Photoshop CC - Photo-editing Software
14. Adobe Audtion CC - Audio editing Software
15. Audacity - Audio editing Software
16. Sublime Text Editor - Text editing Software
17. Crazy Bump - Texture Map Generating Software
18. Streamframe - Project Management Web App
In-engine Screenshots:
These screenshots are not rendered and are taken in realtime. Most of them are from the game's cinematics and are part of the main game.
Into the Light Official Soundtrack
Into the Light is powered by Unreal Engine's latest version 4.15.0
The team decided once again to use the Unreal Engine 4 because of its development tools that could help us in the development of our game concept. We actually started off using the 4.12 version of it when we began developing Into the Light. GoaTo Interactive wanted to push the technicality of Into the Light by using the engine's advanced features.
C++
I started off as a Lead Programmer in the early development of the game and later on took the role as a Technical and Cinematic Director in the other half of the development of Into the Light. With C++ in our hands, it was really an advantage for us to use C++'s powers which is faster compared to any other programming language. Ofcourse it wasn't easy at first since we decided to mainly use C++ rather than blueprints because as what I've researched, blueprints uses a virtual machince that runs in the background for it to execute during runtime. So with that we've decided to mainly do scripting in C++ as much as possible and try to cope up with its new version C++14.
The header file of the API of our main character |
In coding C++ we're using Visual Studio 2015 Community and I assure you guys that this IDE is really helpful and powerful especially the tools it is with out of the box. Well we had a little bit of problems in terms of intellisense with C++ but our team has already been using a tool called Visual AssistX wherein it totally makes it more convenient when coding in C++. Yes we all know that C++ Intellisense is not that good but hey there's Visual AssistX to help you and I've got to say that it's really convenient and also has tools that you could use for debugging certain lines of code. Well when the project got bigger, compile time started to get slower depending on the speed of your computer. Yes, we had to sometimes wait for a couple of minutes just to check if our code compiled or not. But when we upgraded to 4.15 it pretty much improved the compile time and made it faster compared to the previous versions.
Source control for Into the Light using SourceTree |
Visual Studio Team Foundation Git Repository dashboard |
Ofcourse when you're in a team and working remotely like we do I really recommend using source control. During our development we've used Git as our main source control and Visual Studio Team Foundation to host our repository since GitHub and Bitbucket have repository file limits. But the only limitiation for VSTF is the commit per file size restriction wherein it only limits you to commit a single file not greater than 50mb. We've somehow managed to bypass this since the embedded git of SourceTree already has Git LFS which makes chunks of your commit to make it easy to push to your repository. It's really recommended for you to use source control since it's easy for you to revert changes whenever you feel like you did something wrong and wanted to just use your old implementation. Also I would like to high recommend working on different branches rather working only in the master branch since it's more neat and organized to work on different features because it's difficult when for example you did something bad and you want to revert that change, everyone who is working in that branch will also be affected. That's why working on different branches is more efficient when you're working on teams. Source control was a big help to our team because we did a lot of implementations that somehow broke our game and it wasn't a problem for us because we just reverted back to our working commit.
Here are some Git Client Clients and Servers that I would recommend you using.
Servers/Hosts:
2. GitLab
3. Bitbucket
4. GitHub
Clients:
1. SourceTree
2. Visual Studio Team Explorer
Visual Studio 2017 Community |
3. Git Kraken
Git Kraken Client |
Code snippets from our Game Mode and Character API classes |
The picture above shows our character API and the GameMode which also handles whether or not the player is using an Xbox Controller or not. Yes, our Input System adapts to what current input mode the player is and also our UI adapts in realtime.
In-engine representation of our C++ classes |
During my days as a lead programmer of the team, I was responsible for making the gameplay framework and some other features of the game like player controls, Timeflow System, Aging System, Save and Load System, Input Systems, etc. After leaving and taking the position as a Technical Director, it was now my responsibility to manage both art and technical aspects of the game. So basically what I did is that I sphereheaded and communicated with the art members and tried to gets as much detail from their assets without having to deal a big amount of frame rate drops and as well as what the programmers need in their development like there is this feature we have wherein the intensity of the emission of the enemies strenghthen as they enter the rage mode. So in this case I need to coordinate with the artist to get the texture maps that I need for this kind of faeture we have.
Our character class in its Blueprint Version and with extensions using the Blueprint Editor |
Also at the final part of development, we really spent on optimizing our game and trying to make it run on 60 fps even on lower end hardware. We spent atleast 2 - 4 weeks of optimization and we're happy to see our game run on lower end hardware and having fast loading times compared to our previous games which really took time in loading one level.
Here's a list of the features that I was able to implement:
1. Player Controls System
2. Character Animation System
3. Character Camera System (LockOn, Cinematic, Spline, Blend, Lerp)
4. Timeflow System
5. Aging System
6. Pause System
7. Level Streaming System
8. Save Load System
9. Lock On System
10. Sound Manager
11. Cinematic Systems
12. Flag Systems (Spawners, Cinematics, Game Actors)
13. Climbing System
14. Carry System
15. Aiming System
16. Game Mode System
17. Interactable System
18. Objective System
19. Tools
20. other Miscellaneous Systems
Blueprints
Level Blueprint for Level 1 |
Blueprints is the visual scripting of Unreal Engine 4 which was called Kismet back in UE3 and UDK. It's pretty much programming in visual representation using nodes that execute from left to right in a chronological order. Blueprints are done inside the UnrealEd and it usually is scripted using the Event Graph.
Character API extended in Blueprints |
I actually have nothing against Blueprints since there are a lot of stories in the internet/forums that are having the C++ vs Blueprints topics all the time. I myself use Blueprints and I find it really powerful since Blueprints is built on top of C++ and you really have to learn about references and some of programming logic for you to actually start coding in blueprints. We use blueprints in Into the Light but we don't use it frequently since when I was able to research more in depth about these things it somehow has a bit of slowness during execution and C++ is just faster than Blueprints.
Climbing System purely done in Blueprints |
You know why? Blueprints has this virtual machine running when the game gets compiled and packaged. So meaning that when you try to think of it, when you run your game and it has blueprints in it imagine another background process running inside of your game to execute your blueprint code. Well in my stand, Blueprints is very useful especially for Game Designers to quickly prototype and build game mechanics out of these things. It's just a matter of optimization and trying to make your blueprint scripts as efficient as possible and try not to make them as process intensive because it could make your game slower. But then again it is indeed a very powerful tool that could help you get started in Unreal development. We started of in Blueprints before when we even got to C++ back in the days and I really do encourage you to use this awesome tool but when you have the knowledge and skills already to do C++ then do so because C++ is faster and you could do more that Blueprints just couldn't do.
If you were wondering why do we have C++ to Blueprints in UE4 and why don't we have Blueprints to C++? Well Unreal has actually this feature wherein when you package your game it will convert every single Blueprint that you've created into a C++ class. So meaning that if you want your Blueprints to be converted into raw C++ code then you should try this feature called Blueprint Nativization Method.
Just to warn you that by means of nativizing Blueprints into C++ you're not actually able to see the C++ version of it and it's somehow a raw file that only Unreal understands. When you want to edit that C++ file, you may want to edit it in the Blueprint Editor rather than the raw file because they're just a series of code that you might not understand. It's just somehow a solution of Unreal for users who want the fastness of C++ but wish to script in Blueprints.
Level Design Tools
I wouldn't go through everything that the UnrealEd has to offer but I'll just tackle a little bit of what I liked the most during the development of Into the Light which helped a lot in the development of the level design of the game.
Level 01 Layout |
The UnrealEd is one of the best level editing tools that I've worked on. It has a bunch of neat tools that could speed up both your level design workflow and at the same time optimized your game as well. It's quite the same with Unity but for me I guess it just has more tools and I came across one of their level design tools wherein you could actually optimize things inside the level itself. It's very useful when you're making larger levels and try to organize them per sectors.
Level 1 with only the Cathedral Streaming level turned on |
Level 1 with all Streamed Levels turned on |
You could check and learn about streaming levels here: Streaming Levels in UE4
One thing I loved about UnrealEd was about how it handled the creation of large levels. Into the Light contains a somehow large level wherein we divided Levels into sectors and each sector has its own unique identity. Like for example we've separated parts of the Cathedral from the Catacombs. This was made through streaming levels.
One thing I loved about UnrealEd was about how it handled the creation of large levels. Into the Light contains a somehow large level wherein we divided Levels into sectors and each sector has its own unique identity. Like for example we've separated parts of the Cathedral from the Catacombs. This was made through streaming levels.
A merge actor level for Level 3 |
One that really sold me to Unreal was their Merge Actor feature which was really suiting for a modular type of level like ours. One problem that we've encountered during level designing the levels for Into the Light was the occlusion culling of modular assets. Since modular level design tends to have separated parts like walls and floors it is only usual for an engine to occlude then when the camera is not facing the asset. Yes it may seem to be a good thing but here's the catch, when your camera moves at a speed that the occludder doesn't reposn immediately you somehow get a frame skip or a delay on how the occludded mesh/actor reappears. What this means is that there is this delay in an instance that the occludded actor should reappear since the camera is already facing the actor/mesh but tends to have a delay like for say 0.1 secs before it properly shows again causing you to have a somehow glitchy like feel in some of the parts of your modular level.
But thanks to this Merge Actors feature in that Unreal has provided I guess in the 4.12 version, modular level design has gotten more efficient than ever. What this does is it tries to merge multiple actors into one single actor. The good part about this is it also tries to compress every UV of that actor into one single atlas reducing the amount of gpu processing. Also did I forgot to mention with this feature, it also combines these actors lightmaps into one single lightmap. How great is that! Not only do you have a major gpu optimization in your part but also you're lessening the draw calls of your level.
A merge actor sample that used to be a modular asset |
We were able to solve our problem with modular level design and occlusion because of this feature and I would really recommend you guys using modular design to try this out. It's really handy and saves a lot of time since you could also reuse your merged actor in other levels/areas that you want.
DX11 Tools
Tessellation Implementation in one of the wall assets |
With the use of the DirectX 11 feature, I was able to implement a distance based tessellation for on of the wall asset which was mainly used in the Cathedral and the Catacombs areas in the game.
Tessellation example by NVidia |
Tessellation shader of one of our assets |
You may wonder does Tessellation actually do? Well just imagine an asset that already has a Normal Map in it and you wanted to add more detail to that asset. Like you wanted to bump up that detail by adding more geometry to the mesh so that the deformations of the Tessellation Shader wouldn't ruin your mesh. It's somehow the method of breaking down polygons of your mesh asset into finer pieces which adds more realism to the mesh. Tessellation is only avaialable only for DirectX11.
Tessellation in Max Value |
Tessellation with 0 Value |
You could check out a gif on how Tessellation looks like inside our game here: Tessellation
See how the examples above show you how did Tessellation increase and refined the number of polygons in the mesh to make it more realistic and pops the details out of the texture and height maps.
Tessellation is a pretty much GPU demanding feature of DirectX and I myself experienced that when I first implemented tessellation, I really saw the framerates dropping intensively. That is why I looked up in some of the games using tessellation and I was able to discover that they were using a method called Distance Based Tessellation wherein tessellation value is affected depending on how far the camera is from the tessellated object.
Sequencer
What was really useful for us was the new iteration of their cinematic system called the Sequencer. Since we aimed for a more cinematic like game wherein we wanted to push the cinematic level of Into the Light, Sequencer was just one neat tool for us. Matinee was good but Sequencer just had more tools and option for us to do more cinematic shots compared to Matinee.
Using the sequencer at first really felt like using Adobe Premiere Pro since the user interface was really the same like any other video editing software and I really love that kind of user experience compared to Matinee which really was a pain in the back when I was doing the cinematics for Ragnarok Protocol back then. I loved how they improved sequencer from its early versions like adding more features like animation blending which we really need at the time because we were just reusing animations that we had and it was not good to see snapping animations at that time during the 4.14 version and when we upgraded to 4.15, I immediately converted and added animation blendings to all of our cinematics.
Events track in Sequencer |
Adding an event |
Implementation of the event when it is called by the Sequencer |
I just love the way how Sequencer is compatible with event messaging because there are just times that you want realtime events to happen during the cinematics. Like for example in a cinematic that we have, there is a a part wherein we needed to activate a certain feature/blueprint actor that is tied up with the sequence. So what I did is I added events to the sequencer itself and it's just like animation notifies wherein when the sequencer reaches that time or frame it will immediately fire off that event and anything that is binded to that event will receive it once it hears the event.
Below is a sample render of the cinematics which was exported directly from Sequencer.
NVidia Gameworks
Since this is our last project as game development students, we've stepped up our 3D Tech by using NVidia's Gameworks SDK. I applied for a developer account at NVidia and as soon as I was granted the developer account, I started researching and implementing PhysX for our assets which we decided to put realtime cloth simulation inside it. Both implementation and optimization were practiced during the development of Into the Light.
Using the PhysX SDK for Maya was pretty much like painting skin weights when you're rigging and you just need to get the proper simulation values for the cloth like how much gravitia or inertia it should have to achieve that kind of hard cloth that you want or depends on what cloth type you're making. Also making cloth simulation is not only painting and just typing in random simulation values but you should take in mind that it's rendered in realtime meaning it will also consume memory in your game.
NVidia Gameworks 3.4 Plugin for Maya 2016 DCC |
So after realizing this and some frame tests inside Unreal, I came up with values that were optimal enough to sustain our game and maintain the framerates whenever we have realtime cloth simulation in a given level or cinematic. Somehow some of the values for self collision and collision thickness really had a big consume on the game's rendering and processing power that's why I did optimizations with it. After setting up the values in Maya, I exported the apex file and imported it inside the game engine. After importing, I did a little bit of tweaking inside Unreal itself and surprisingly Unreal supports that realtime tweaking.
Apex Editor inside Unreal Engine 4 |
Adding a wind source for the cloth to simulate during runtime. |
It actually took me some time to master this SDK due to the fact that when I upgraded from version 3.3 to 3.4 it started to have bugs wherein the apex (.apx) file wasn't readable in Unreal Engine 4.14 and Epic Games was actually aware of that when I was able to post a bug report for this one. When 4.15 came out that issue was fixed and it was really a big help to me to finish my pending tasks that were delayed due to this bug they had. Gameworks really was fun to use and I really would recommend it to game developers who want to have realtime cloth or hair physics inside their game. But you sould all the time take into consideration that this is a "realtime" simulation and it would really have a major problem if you wouldn't optimize how you simulate cloth inside your game engine.
Lighting
Another thing that I enjoyed the most during the development of Into the Light was lighting up the levels. At first I had troubles with lighting since our adviser wanted us to have a realistic lighting wherein we should mimic what actual light in the game world. Meaning that light should only come from a lightsource. So in our case we had minimal light sources since the setting was somehow in a chamber like world. The team actually had a lot of comments that our worlds were to dark and they find it hard sometimes to navigate through the levels. With those comments that we've received, the team decided to add more light source to all levels so that we could achieve a realistic lighting that has actual lightsources in it. Since our adviser wants us to have that atmospheric feel it was just perfect to add a little bit more light source into the level.
IES Light Profiles |
During the lighting process, I was able to find out about IES Light Profiles. IES is somehow a blueprint that you attach or add to a light object in your engine and simulates how actual lights work in the real world. It's like taking information from actual lightbulbs and putting it inside a game engine or even a rendering application and simulate how actual light would actually look like. For our game I was able to get Light Profiles from Philips which they made it free for developers and even engineers.
Audio System
One thing I also liked about Unreal was their Audio Editing system whereing sound engineers could play around with the built in tools they have for editing the sounds inside Unreal.
The audio system of the UnrealEd is surprisingly similar to its Blueprint System since they made it a node based scripting system for audio this time. In this system you could add more effects and make sound have multiple behaviors. Also you have this function wherein you can also add parameters to determine what sound to play in any scenario. It's very useful especially when you want dyanmic sounds inside your level and wanted to blend out some of your current sounds into one sound file/ sound cue without mixing them in a 3rd party audio editing software.
Attenuation Class of one of the ambient sounds |
Development screenshots:
It is worth noting that some of these screenshots were taken at the early stage of development and may not be included or were already changed in the Incendium Build of Into the Light.
Gameplay screenshots:
Developing in Unreal was fun especially when you and your team realized that somehow there tools that were lacking and there were existing bugs that made a lot of headache to the group. Well I guess it's just a usual part in game development wherein when you're using a software/framework that is still under development, you somehow feel you that needed more and tend to write your own tools to compensate on what your team needs for the development. But none the less, Unreal is really indeed a very powerful engine and I really excited on what Epic Games has instore for us with their next versions of the Unreal Engine.
Gameplay Video
If you want to have a look on what the game is, here's a little bit of gameplay video for you to check on. Also this gameplay video may be a spoiler to you guys but if you want to download this game it is available at the bottom part of this post and try it for yourself.Gameplay Video
Sorry for having no audio because our screen recording device did not record in game audio due to driver issues on our test device. Thanks for understanding.
Download Link:
Prepare for a 2gb download size and make sure to read the ReadMe.txt in the folder before you install.
Into the Light - Game Version
Into the Light - GameCon PH Update
Into the Light - GameCon PH Update
Overall I had fun and enjoyed a lot during the development of this game. Learning and applying what we learned in the game was one of the things we're proud of. Another thing that I was proud of and probably one of the memories that I will treasure the most is how my team grew together without anyone getting left behind. We stood through all the challenges and managed to resolve our differences and helped one another to become who they are today. I'm just happy to see my team improve and learn from one another and I really do hope that someday when we come to this project again we would say that this game was indeed one of the things that molded me for who I am today. As we part ways and pursue our own different fields, I've got to say that GoaTo Interactive has been one of the best things that ever happened to me in my journey as a game development student and I hope to see them succed in their own chosen fields someday. From the bottom of our hearts, thank you so much who supported and played Into the Light. You guys made us happy and made us realize how fulfilling it is to be a game developer seeing our players enjoy our game. For me this is game development is all about. Learning and creating together with your team, sharing and creating experiences that you will keep and cherish as you go along with your career. Thank you so much GoaTo Interactive!
No comments:
Post a Comment