Hi, I'm Marcel Hara

I Graduated University in 2024 studying Game Development: Programming.
University showed me the pathway to being a programmer and I have always had a deep love and passion for learning all sorts of technologies and creating meaningful experiences for everyone.
I mainly focus in C++ and Unreal Engine 5 but have also branched into many other languages and engines such as C#, Unity and Lua!

3+ Years
C++ Icon
1 Year
C# Icon
1 Year
.NET Icon
3+ Years
Unreal Icon
2+ Years
Unity Icon

The Remaining Few

Project Length:

TBD



Team Size:

2 Person Indie Game



What I Did:

  • Handling all Gameplay Programming
  • Network Programming
  • Steam API Handling
  • AI Programming
  • Plugin Modification

Engine & Tools:

C++, Unreal Engine 5

document.addEventListener("DOMContentLoaded", function() { const containers = document.querySelectorAll('.card-container-red'); containers.forEach(container => { const card = container.querySelector('.card-red'); container.addEventListener('mousemove', (e) => { const rect = container.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; const centerX = container.offsetWidth / 2; const centerY = container.offsetHeight / 2; const angleY = -(x - centerX) / 20; const angleX = (y - centerY) / 20; card.style.transform = `rotateX(${angleX}deg) rotateY(${angleY}deg)`; }); container.addEventListener('mouseleave', () => { card.style.transform = 'rotateX(0) rotateY(0)'; }); }); });

Endless Vendetta

Project Length:

9 Months



Team Size:

11 - 3rd Year University



What I Did:

  • Weapon System
  • Recoil System
  • Attachment System
  • Voice Acting
  • Smaller gameplay features

Engine & Tools:

C++, Unreal Engine 5

document.addEventListener("DOMContentLoaded", function() { const containers = document.querySelectorAll('.card-container'); containers.forEach(container => { const card = container.querySelector('.card'); container.addEventListener('mousemove', (e) => { const rect = container.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; const centerX = container.offsetWidth / 2; const centerY = container.offsetHeight / 2; const angleY = -(x - centerX) / 20; const angleX = (y - centerY) / 20; card.style.transform = `rotateX(${angleX}deg) rotateY(${angleY}deg)`; }); container.addEventListener('mouseleave', () => { card.style.transform = 'rotateX(0) rotateY(0)'; }); }); });

Wizardry

Project Length:

2 Months



Team Size:

Solo - 3rd Year University



What I Did:

  • Lobby System
  • Network Programming
  • Map Select System
  • UI Handling & Level Designing
  • Core Gameplay Systems

Engine & Tools:

C++, Unreal Engine 5

document.addEventListener("DOMContentLoaded", function() { const containers = document.querySelectorAll('.card-container-purple'); containers.forEach(container => { const card = container.querySelector('.card-purple'); container.addEventListener('mousemove', (e) => { const rect = container.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; const centerX = container.offsetWidth / 2; const centerY = container.offsetHeight / 2; const angleY = -(x - centerX) / 20; const angleX = (y - centerY) / 20; card.style.transform = `rotateX(${angleX}deg) rotateY(${angleY}deg)`; }); container.addEventListener('mouseleave', () => { card.style.transform = 'rotateX(0) rotateY(0)'; }); }); });

Jelly World

Project Length:

48hr



Team Size:

3 - Global Game Jam 2024



What I Did:

  • Physics Ojbect Handling
  • Level Designing
  • AI Programming
  • Gameplay Systems
  • Voice Acting

Engine & Tools:

C++, Unreal Engine 5

document.addEventListener("DOMContentLoaded", function() { const containers = document.querySelectorAll('.card-container-green'); containers.forEach(container => { const card = container.querySelector('.card-green'); container.addEventListener('mousemove', (e) => { const rect = container.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; const centerX = container.offsetWidth / 2; const centerY = container.offsetHeight / 2; const angleY = -(x - centerX) / 20; const angleX = (y - centerY) / 20; card.style.transform = `rotateX(${angleX}deg) rotateY(${angleY}deg)`; }); container.addEventListener('mouseleave', () => { card.style.transform = 'rotateX(0) rotateY(0)'; }); }); });

Azure Abyss

Project Length:

9 Months



Team Size:

10 - 2nd Year University



What I Did:

  • Merchant System
  • Inventory System
  • Consumable System
  • Particle and Lighting Effects
  • Pickup System

Engine & Tools:

C++, Unreal Engine 5

document.addEventListener("DOMContentLoaded", function() { const containers = document.querySelectorAll('.card-container-azure'); containers.forEach(container => { const card = container.querySelector('.card-azure'); container.addEventListener('mousemove', (e) => { const rect = container.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; const centerX = container.offsetWidth / 2; const centerY = container.offsetHeight / 2; const angleY = -(x - centerX) / 20; const angleX = (y - centerY) / 20; card.style.transform = `rotateX(${angleX}deg) rotateY(${angleY}deg)`; }); container.addEventListener('mouseleave', () => { card.style.transform = 'rotateX(0) rotateY(0)'; }); }); });

Battle For Elador

Project Length:

4 Months



Team Size:

8 - 1st Year University



What I Did:

  • Troop Management System
  • UI Programming
  • Shop System
  • Castle Health System
  • Gameplay Designing

Engine & Tools:

C#, Unity

document.addEventListener("DOMContentLoaded", function() { const containers = document.querySelectorAll('.card-container-battle'); containers.forEach(container => { const card = container.querySelector('.card-battle'); container.addEventListener('mousemove', (e) => { const rect = container.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; const centerX = container.offsetWidth / 2; const centerY = container.offsetHeight / 2; const angleY = -(x - centerX) / 20; const angleX = (y - centerY) / 20; card.style.transform = `rotateX(${angleX}deg) rotateY(${angleY}deg)`; }); container.addEventListener('mouseleave', () => { card.style.transform = 'rotateX(0) rotateY(0)'; }); }); });

All my contact details are below including my CV and Email.

Responsible For:

- Lobby System- Integrated Steam API for Networking- Unreal Engine Sessions for in game multiplayer handling- Gameplay Code and Systems- Designing- Map Select System

The Project:

Wizardry is a Multiplayer 1v1 Top-Down game where you have to battle your opponent for victory on a wide variety of different maps which all have different art styles.

Purpose of the Project:

- Learning Unreal Networking Architecture- Learning Basics of API's (Steam)- Deep Learning of the engine and how unreal handles everything from Player Controllers to Game States- Code Improvement

Responsible For:

- UI Functionality- Designing- Castle Health Management System- Spawning Troops- Other Gameplay programming

The Project:

Battle For Elador is a RTS game created in Unity with a Medieval style. The goal of the game is to beat your AI opponents castle while also defending your own. You can either choose to attack your enemy directly or go for their income to cripple their resources.

Purpose of the Project:

- Learning Game Development Fundamentals- Unity Engine Learning and Familiarity- Programming in a Game Development Environment- Understanding C#

Responsible For:

- Pickup able and Consumable Items- Inventory System- Shop System (The Legend of
Zelda: Ocarina of Time)
- Minor Gameplay Systems

The Project:

Azure Abyss is a First Person Turned-Based Unreal game where you explore the unknown abyss and find all the secrets of the caves within, dodging monsters or killing them, While all trying to not get lost.

Purpose of the Project:

- Unreal Engine Familiarity- Blueprint Learning and Integrating with Code- C++ Understanding and how it works in Unreal- Basic Data structures and algorithm learning

Responsible For:

- Physics Object Programming- Basic AI Programming- Shader Implementation- Voice Acting- Level Designing and Creation

The Project:

Jelly world is a game created for the 48 hour Global Game Jam where you as the player have to tackle a series of obstacles with annoying NPC's blocking your every move. Can you escape Jelly World?

Purpose of the Project:

- Further Improve Gameplay Programming- Learning to work under pressure in extreme environments- Global Game Jam Participation- Learning Basic game AI

Team Size: 3

Responsible For:

- Weapon System which includes a Rifle, Sniper, Shotgun & Pistol all scalable for infinite variations and customization- Modular Recoil system that feels good and realistic and can be changed on the fly- Attachment System which includes a Suppressor, Extended Magazine and Grip which can be swapped out and put onto any weapon- Attachment Workbench which handles swapping attachments- Other minor gameplay features

The Project:

Endless Vendetta was created for my big final year project at Falmouth University. This game was the largest game I have ever worked on collaborating in a large team of 11 people and it simulated a real working environment giving me lots of experience and growing my skills.

Purpose of the Project:

- Further Improve Gameplay Programming- Learning to work under pressure in extreme environments- Simulating a real industry environment working on a prolonged amount of time- Passion and Fun creating a large FPS Game

Endless Vendetta Game Mechanics

Weapon System

One of the biggest focuses of Endless Vendetta was the weapon mechanics and how they would feel and work in-game. We discussed a lot about whether we wanted the weapons to feel like an arcade shooter or a hardcore punisher. An example of the two would be Call of Duty or Escape from Tarkov.From the style of the game and the vision we had, we decided to go for a more realistic weapon system that was very similar to Counter Strike and Escape from Tarkov, with the recoil being almost impossible to control while moving and forcing the player to take a slower approach by making them stand still and aim in. The weapons were created with a base weapon being the most basic type, which we chose to be an assault rifle, and then on top of that, you could modify the weapon and create infinite variations of it, including pistols, snipers, and shotguns, which were all blueprint-friendly for easy use.
Using a mix of these games as inspiration, we created guns that felt good to use, which slowed the overall pace of the game, forcing the player to think carefully instead of running in guns blazing which meant we had to design the levels to be more interesting and challenging by adding verticality and other intricate designs to keep the player interested and to give them many opportunities to approach the mission differently.

With the weapon system in mind, we wanted to give the player the option to add attachments, which would improve the weapons significantly and not punish them as much for a wrong move.
The idea of the attachment system was going to be that the player has to enter a workbench to equip attachments, and as they earn enough money, they could unlock better attachments for their weapons, but sadly, we did not manage to implement that feature in time, so instead we decided to just let the player equip any attachment they want from the start of the game.

Challenges:

  • Creating a good weapon feel that was easy to learn and use but also feeling challenging.

  • Weapon system had to be modular to create variations of different weapons easily.

  • Attachment system had to work with the weapons correctly ensuring they are easy to understand of what they did and how they would work.

  • A lot of balancing had to be done to make the weapons not feel too overpowered or underpowered.

Solution:

  • Researched a lot of games and deep-dove into what made their weapons feel good and natural to use.

  • Experimented a lot with different values of weapons such as fire rate and how much screen shake output to not overwhelm the player and also keep the realism feel when using the weapon.

  • Created many prototypes of a weapon system to see which would be the easiest to create infinite variations of in the future and now we can make how ever many different weapon types needed with all different values such as damage, fire rate and recoil handling.

  • Experimented a lot with sockets to try to get the best position and placement for attachments to snap-onto weapons.

  • We had many playtests to balance out the weapons and attachments which included random players playtests and team playtests. We have had over 150+ builds of just playtests and experimenting different values of weapons and attachments.

Attachment System

For the attachment system we had in mind to have a Suppressor, Extended Mag and a Grip but only managed to release a Suppressor due to not having full models for the other attachments. The attachments use a simple socket system provided by Unreal which then just modified the values of the weapon you currently held. The idea of the attachment system workbench was similar to Call of Duty with displaying the gun and having the attachments visibly on the weapon.

The biggest challenge for the attachment system was how to handle it equipping on the weapons because I have never dealt with sockets but after a few hours of experimenting it turned out to be very easy and the way it is handled is I use a function which is a blueprintable event which has a static mesh as the parameter and then the rest is done via c++ which handles the attachment including attaching a class that handles the actual attachment changing the stats of the weapons.