James T Shaw

0 %
James T Shaw
| Developer |
| Designer |
| Producer |
  • Residence:
    USA
  • City:
    Orlando
  • Age:
    35
Programming Languages Confidence:
C++
C#
SQL
Engine / Modelling Experience:
Unreal Engine
Unity
Blender
Godot
0

No products in the cart.

Hollow End

Hollow End

Project Details                                                                                               

Elevator Pitch

In Hollow End you’ll start in a sanctuary where you can pick one of two characters with different abilities, unlocking the rest of the characters as you play the game. There will be 3 biomes containing 5-7 levels each. Your goal is to clear out all the enemies at that level so that you can reach the next one. For each level you complete, you get an item tailored to the type of level you entered. At the end of each biome, there will be a simple boss that gives you keys on top of an item, with enough keys you can unlock a new character back at the sanctuary.

Our team had three months spanned between three different classes working in Unreal Engine to conceptualize, prototype, Beta/Alpha, and Gold Standard our game. We utilized Jira for planning and Perforce for version control. Below you can see examples of my contribution.

My Contributions

– Producer/Team Lead
– Documentation
– Jira for Project Management
– Perforce
– Level Design (Enemy List Widget / Hub World / City Biome Level)
– Scripting Enemy AI Logic / Animation / Navigation
– Revision control / Sprint Turn-Ins / Project Packaging

– Behavior Tree/ Blend Space / BTTask / BTService logic

-Blueprint Design 
– Implemented a loading screen for rendering time

– Scene/level transfer logic

– Custom built Niagara effects/Particle Effects for levels and enemies (blood splatter, Debris throwing, Projectiles)

– Widget, and UX/UI  work

Level Design Prototyping

Once the project was green-lit, I designed a level where our players could utilize the abilities given while remaining fast-paced and close-quartered. I also designed the hub world and Enemy list page as well. I take pride in design elements as much as I do development so I took advantage of more opportunities to create levels for this project.

Main Menu Features

I designed the title image using a procedurally generated AI image that fit the game’s theme, updated the UI to match the game’s aesthetic, and outsourced all the music to a close friend. Additionally, I developed the level loading system to handle world transitions with a functional loading screen.

Enemy AI / Environmental Mechanics

Enemy AI/Environmental Mechanics

For this game, I handled the creation and implementation of all enemy AI as well as how the player and enemies functioned in the game environment. I created five unique enemy types for this game that all functioned with different types of spawners and particle effects to enhance the look of their abilities.

Melee Zombies

The melee zombies were your standard run-of-the-mill attacking fodder for the player to gun down and usually created blockages that the player could get stuck between if they were not careful. These zombies stay in constant pursuit of the player always trying to get close enough to attack. The spawner for the zombies would randomly spawn one of three designs for the melee zombies so there was variety in the hoards.

Ranged Infected

Next, we had the ranged infected that would throw an infected projectile to damage the player. Like the zombies, these enemies always pursue the player but if the player attempts to run toward them, they evade the player to maintain a specific distance. these enemies also had their own spawner that allowed a specific amount of them onto the map.

Spitter Infected

I created these enemies as an upgrade from the Ranged enemy that would also pursue the player and throw the infected projectile as well as a melee attack but to make them unique I gave them a flash step feature. I would do a ray trace check to see if the player’s cross-hair is passing over the enemy and if it was and the enemy’s cool-down was not in effect, they would be teleported randomly within a 500-unit range around their original location. A Niagara effect was also created to give it feedback that they had disappeared. 

Juggernaut Infected

This enemy was created to keep the player on their toes when playing as an attack from this enemy can be devastating to the player. This enemy pursues the player until they are within a set range and when that range is reached, this enemy’s jump animation is called and would attempt to explode on the player taking over half their health. 

The Hollow

This enemy was created as a telekinetic enemy that hurls debris projectiles at the player and also has devastating long-reaching melee attacks with its claws. These projectiles keep the player needing to move and dodge attacks giving our rogue-like game a bullet-hell feel as well.

Spawners

I created a spawner class that the script can be turned into a blueprint so you can assign any asset as a spawn location. From there, you can assign however many enemy types into an array to be selected from randomly by the script. The spawner also controls the overall gameplay so inside this script the control for how long the rounds last and the frequency of enemies produced is set here as well. It will then relay this to the game mode to take the player to the next level or if the player loses, etc. In this script we are also able to set Niagara effects to give the player feedback to what is happening.

Behavior Tree Logic

Enemy Selection Behavior Tree

Enemy Selection Behavior Tree

This Behavior tree I built used tags on the specific enemy AI to determine which sub-behavior tree it should be broken down into. when the game would run, the tree would locate the tag and assign that enemy type to the AI allowing it to use specific functions and attributes as you can see in the next example below.

Example Enemy Behavior Tree

Sub Tree breakdown 

Once the enemy type has been selected based on the tag, you can see here now we have a full breakdown of how this particular enemy with interact in the game. I used a simple parallel to allow the enemy to continuously move towards the player while also using a BTService to check the range to the player to determine which type of attack was appropriate. From there I used a series of BTTasks to implement the logic for specific attack types and to broadcast the animations that went with them.