This week marks the end of the project and the final hand-in! You can view the trailer and raw gameplay down below.
This week marks the end of the project and the final hand-in! You can view the trailer and raw gameplay down below.
The last week and a half has currently consisted of purely polishing the level as well as finishing off the actual playable area and blocking off the areas outside the level.
To help further the idea that the player is inside a world larger than themselves I created a bunch of foliage assets like trees & ivy to make it feel more lived in, as well as adding in a landscape to represent the sand to mold the sea area and provide build-up of sand deposits where it makes sense.
“It’s coarse and rough and irritating and it gets everywhere”.
On the serious side of things creating the sand and landscape shader was a long process, though due to the player being unable to see much underwater I didn’t bother with variation textures. To break up the surface below the waterline I just used rocks.
To start with I first developed the sand textures in Substance Designer by starting with perlin noise which I manipulated with a serious of warps, directional blurs, slope blurs, and custom pixel processing in order to build the height map which drives the rest of the substance.
The pixel processor and slope blur (with negative values) was the main driving factors to this material. Big thanks to Bruce Slater for leading me to the function 1-(abs(sin(in)) which was originally something I explored for a more optimised water simulation (though only is useful in scalar displacement as opposed to vector displacement which gerstner provides).
This function essentially provides waves with sharp peaks and soft valleys which was useful here, and then by using slope blur with the input as the intensity you can bulge the map or pinch with negative values.
The shader for the sand material uses the master base shader function but with added features such as parallax occlusion mapping, dynamic distance field flow mapping, & a secondary specular calculation (to add the speckles).
The secondary specular is simply a tiled noise map multiplied by directional specularity. The calculation for that is written in HLSL to gain access to the reflect() HLSL function. It should be noted this calculation is not physically accurate and is limited to the directional light due to the nature of the deferred renderer, if I wanted to make this physically accurate I would have to compile a custom engine build to inject my own BRDF which isn’t worth it for a small effect which can be faked in.
The flow map side of things works the same as the water shader (I have modularised into its own shader function in fact) by using distance mesh fields to find the XY gradient between surfaces and distort the coordinates using this. This is useful to make the sand feel more natural as it would gather and be pushed around surfaces.
I considered adding in flow map painting to distort the sand with custom painting, though I didn’t feel as though it was worth the time to implement.
Foliage always helps to push a scene in terms of art, but here it not only helps to fill out the space but make the world feel more natural and lived in.
To create the foliage I first created the textures I needed – I started this by first updating the leaves from the procedural texture I initially created to one generated through a bitmap. This gave me a much more accurate albedo at the expense of a poorer normal – though in this case I don’t think it matters too much.
To clean and edit the bitmaps I used Substance Designer which massively sped up the process, and also has nodes for cleaning up scan data (which this technically is in a sense). For example I generated ambient occlusion and removed this from the albedo.
I used Substance Designer to create the bark as well, though I wanted to gain a nice mix between stylisation and realism with a focus on the larger forms instead of the tertiary detail so I opted for a procedural workflow here. I used reference from both the game, and actual scan data I processed prior to this project (only as a point of reference though, you can visit my shameless photogrammetry plug here – https://www.artstation.com/artwork/zR9D6). I also referred to this guide to help me get started with the larger forms – https://www.artstation.com/artwork/AgJ1V.
This bark Substance helped me to create the bark ends (the caps left where branches are pruned by SpeedTree) by converting from Carteasian to Polar space and working from there. It should be noted this texture was not intended to tile as opposed to the bark.
With these textures in place I then just used SpeedTree to quickly generate the spines I needed with my materials set up. This is an extremely powerful workflow I found as I can procedurally generate the foliage I need, as well as use forces to drive the generation (such as wrapping ivy along a wall).
I also re-created some posters from Dishonored 2 & Death of the Outsider with some slight changes. I did this from scratch in Photoshop using references by overlaying images and painting in areas, though I made good use of smart objects, layers, grouping, and FX layers to keep things as non-destructive as possible! In places I even layered up FX adjustments using groups which was useful for complex fonts etc.
These were very useful to add narrative and help further the idea that the world exists both around the player and as a result of the player’s actions to give a sense of player agency. For example the wanted posters are referring to “The Outsider” which is the player.
As of writing this post there is just over a week until the project hand-in. Everything is all set up and ready to go. At this point everything can be handed in and I would happy with it too, though I will continue to polish up the areas & adding small things I think will benefit the project.
I also need to do a final lighting bake though I will wait until I’m 100% happy with the improvements before I do this.
The past 3 weeks have been a bit slower in terms of production due to personal reasons and organising stuff for my soon move to work at Sumo Digital.
I’ve mostly focused on level production & creating more assets over this period of time, and for the next few weeks will close off the level, develop a polish listing, and then work through that to make adjustments as required – namely art-based.
I also spent one week of this time writing my dissertation to free up time & stress to further polish the project.
The level production is an iterative process which will is being constantly refined by adding smaller areas and props to fill out the space.
From here I will be closing off the level & refining the art for the existing sections and adding details such as environment narrative elements & infrastructure (i.e. the lampposts, drains etc).
To help block the player off from accessing areas outside the level I developed a quick spline based tool which adds buoys at each spline vertex (with buoyancy and a random rotation to remove repetitiveness), and generates a collider along the spline to create the bounding box.
I’ve also added buoyancy to elements in the water along with dynamic flow mapping to allow the water to flow around objects. My approach to the buoyancy does not match with the water’s simulation as this is both too expensive without using multiple render targets so an approximation works fine. The approximation generates sin waves based on world position so everything bobs at different rates. This is controlled through an ocean controller (an actor which drives the values) so everything is consistent.
I had to do this via scripting to affect collision as using world position offset or displacement in the vertex or geometry shaders respectively is done at GPU time so it would not affect collision.
I’ve also worked on making the scene more dynamic with rolling fog, particles, and props such as fans. This is also backed up by other small elements such as wind rolling through the canopies.
I also updated the screen space fog shader to utilise rolling fog generated using 3D noise – this gives a more volumetric feel to the fog instead of it being very static.
These are the assets I’ve worked on – they are made using the same prop workflow as I’ve been using over the course of the project. I’ve also been experimenting with further optimising my use of texture space – for example the back of the mirror is the same as the front which is re-welded back into place. This idea has been essential for the level of detail on areas such as the cabinet which covers a large surface area.
I’ve also been experimenting with secondary reflections & anisotropic contribution in Toolbag 3 and seeing how I can bring any of that over to UE4. In the process of this I looked into this article aimed at graphics programmers about rendering in Far Cry 4 – https://www.gdcvault.com/play/1022235/Rendering-the-World-of-Far.
While distorting the reflection itself is not something I can do in the base surface shader (I would need to write and inject my own BRDF in a custom engine build), I managed to engineer the anisotropic specular highlight itself as a shader function.
While this is only a subtle effect and does not affect the actual specularity (though is still driven by roughness), it does open up more material options and allows me to add extra complexity to existing materials.
From here I will be developing a polish list and working through that – adjustments that need to be made currently are ones such as adjusting albedo values to be more physically accurate. Also I will be finishing up a desk prop to replace the prototype desk (first prop made in the project) as the style now falls too far beyond the rest to be consistent.
I will also be further developing the shaders – such as the water shader to potentially add procedural waves purely in the shader. But apart from that it’s just polish from here on out to the art & finishing up the level.
This week has been solely focused around asset creation, namely for exterior props. I also worked on some foliage, rocks etc. The other focus has been on the UI side of things in which I have been getting the usability of the demo up to speed and removing debug UI – this is now complete and features a fully modular scripted system for attribute bars (health, mana, breath when underwater), and ability slots (including the pistol) – which is used on the HUD, weapon wheel, and to show how many health/mana vials the player currently has.
You can view the Artstation post of the assets I worked on here – https://www.artstation.com/artwork/3XQy2
There isn’t much to say on the props side of things other than I have developed a load of props to fill out the space. I did however investigate into Marvellous Designer further (as this is a software where my knowledge is lacking) in order to simulate cloth for the covered furniture and small rag.
I also created some procedural foliage using Substance Designer and combined them into an atlas using the Atlas Maker node from Substance Share. – https://share.allegorithmic.com/libraries/18
I did also create some leaves but I’m not happy with how they turned out so I’ll be using ZBrush to generate the alpha and normal maps for those and then procedurally texturing them via Substance Designer.
By keeping my scripting design modular and in an object-orientated approach I managed to cut down the workload significantly as I identified within the original UI of Dishonored 2 what data and functionality is shared across different but similar UI elements. I then used this in tandem with the modular ability system to store data about each ability (name, description etc) which is then populated on the weapon wheel procedurally, meaning the system relies solely on creating and adding a new blueprint to the player to add an ability (or equipment such as the pistol as that lies within the same system).
The slots themselves are objects (or more specifically widgets) which are then populated at the start around the weapon wheel using some basic vector math to rotate the position around the wheel based on how many abilities the player has.
While creating the lampposts I also created a system to connect them in a network which will then generate wires between set points. The gravity of each wire can also be adjusted, and it will droop down more the further the two lampposts are.
From here I need to implement the VFX for the last ability (the dark ability), and wrap up the level design. I will also most likely continue to polish up areas in terms of design and environment art while I write my dissertation.
The last 2 weeks I have rolled into a single blog post as a lot of the work hasn’t been interesting enough to write about for a single week. The main focus though has been on implementing enemy AI systems and polishing up gameplay, where a lot of animation has naturally come along as I link the 2 together.
The beginning of week 7 started with me first reworking and refining my asset production pipeline from a production standpoint, where I have introduced a new slot into my spreadsheet connected to Google drive to allow me to link to images also stored in my Google drive, and I can also comment on sections of these images. While this sounds simple, this has improved productively massively as I don’t lose sight of what I’m setting out to produce and have constant reference which is easy to refer back to as I work my way through the list.
For this project as it is based on an existing IP with an established art style it does refer back to screenshots I have took from in-game, though in a production environment on a new IP this could easily refer back to real world reference images.
To start with I produced these 2 procedural materials as I felt I needed more variation in the flooring.
I also introduced more variation into the interiors by adding in door grates and a new archway section which introduces more opportunities for varying up the flooring on the same level.
I also produced some “clutter” props early in week 7 using the same standard 3ds Max > Substance Painter pipeline, though in this case I also utilised ZBrush for extra sculpted detail on the woods, bricks, and some on the box. The texturing workflow was approached procedurally (i.e. I created a cardboard generator to add damage to the cardboard box by painting in a mask).
As explained in my last blog post I re-use a lot of texture space and focus on creating re-usable components to then build my final prop meshes. This helps to save on texture space and reduces the work load as for example you’ll never be able to see both sides of a crate at the same time, and in the case of placing them next to each other for their scale in the world the difference is negligible.
I also utilise face weighted normals on my very blocky meshes which have bevelled edges, such as the bricks and planks. This simply weights the normals based on the average of surrounding faces based on the angle of said faces – this helps to correct incorrect shading caused by normals all facing out from their face normal.
I also generated used the roof tiles material I made last week to generate these new roof pieces to add extra variation to the environment. The second shot utilises a material instance of those for darker tiles. This also helps fit the environment closer in with the Venice/Italian architectural theme.
I feel it’s also worth noting that I based the roof tiles for the second shot from a photo I took in Sheffield which is a good place with a lot of varied architecture, with some of that being really close to the architecture I’m referencing from.
I revamped (again) the FPS rig to bring it up to quality from the prototype rig I built. This was a risky move as I had to recreate all the animations to match, but was something I realised would save me time while I was revamping the model and saw a lot of issues with the rig. This time round I opted to use Biped in 3ds Max for the arms (from the clavicles downwards) with a mixture of helpers and custom bones to control stuff like the pistol, blade, and camera.
The benefit of this new rig over the old one which used bones and IK handles is that IK/FK blending is already set up for me and has a system already in-built to copy/paste poses, which is extremely useful when working with the hands. Also something I noticed when vigorously re-animating all the clips is that a lot can be faked in first person as long as it looks and feels good.
I keyframed this animation with the FPS and guard rig in the same file so I could link them up. This was my first time animating with multiple rigs interacting so closely, and was difficult to transfer to UE4. In the end I implemented a system which zeros the camera smoothly, and allows me to move the player to a pre-defined spot smoothly. This happens at the start of the montage being triggered for both the player and the enemy so that they link up in time for the important parts of the animation to play – the only catch is placing the root of the player in the correct place to animate, removing root motion from the animation clip, and linking that value into triggering the montage which doesn’t always match the animations up perfectly (possibly due to the capsule collider of the player) – though this is something I will refine if I decide to create more animations like this.
VFX and sound is then linked up in UE4’s (very nice) animation clip editor.
To start with I investigated behaviour trees but then quickly realised that using this system would only benefit me in a much larger more complex project with different AI patterns, whereas my project only contains the basic guard AI as the power complex is the focus gameplay-wise so most the time the player will just be avoiding the guards, or engaging in combat which ends as quick as it starts.
So I simply used Blueprint scripting to set this up with custom events and sub-systems for triggering animations which disable movement while they occur. I also have a coroutine which runs every 0.25 seconds to handle patrolling and attacking the player.
This stealth graph handles the majority of the logic behind the stealth and combat systems. And while this isn’t maintainable in a larger project it fits the needs, and the general rule of thumb for AI is that it should only be as smart as it needs to be (i.e. Goombas in Mario only need to move side to side).
The attribute component which is used for health & mana handling was also used here to handle the alert metre which defines the points at which the AI switches from passive to aggressive, and already has the internal logic for refilling after x seconds which helped to abstract the behaviour here.
The behaviour is simplified into idle/patrolling, and when the AI becomes alerted it will actively search out the last spot where something was spotted or a sound was heard (depending on which came last). If the player is in view they will actively try to follow the player, attack if in range, or shoot if at a distance with an element of chance.
Stealth is determined by a concealment value on the player which is altered based on different conditions, and then used to scale noises made by the player (picked up by the AI’s pawn sensing component) and sight. If below a range there is no effect, so crouching in a dark space will make it very hard for the guards to spot you.
As usual for easy tweaking the scale at which these things occur based on their distance is scaled using curve assets so I can control the falloff very specifically and fine tune these.
The main thing that affects the player however apart from crouching, is their visibility. To do this I use triggers with their own concealment bonuses applied – when sampling the player’s concealment value it will grab the maximum concealment value of the trigger overlapping with the player. I do this as literally sampling how visible the player is, is an extremely difficult and unnecessary task with too many variables involved, and this also gives me control over the gameplay so I can lower visibility on vantage points.
For editor purposes these boxes will become more red the more they conceal the player, though this is hidden in-game and from light rendering.
To match the VFX of the blink concept which utilises rats and smoke instead of the energy appearance I revamped this from the VFX side of things, though it functions the same.
The rats just use particle meshes so they can’t be animated (at least not skeletal animation), but for the sake of this VFX I think it works nicely. I may animate the rats further down the line for the environment and crawling up the player’s arm if I have time, though I feel as though cutting the rats from crawling up the player’s arm makes the power more responsive as the animation could potentially draw it out too much.
From here I will be further refining gameplay as I go, but the biggest focus is now on further expanding and refining the level design & environment art. As stated previously I need more exterior assets such as clutter, rubble, and foliage. I have already planned out these assets in terms of priority in the revamp of the asset list – though these were pushed back to get the game playable which is vital to the level design as I needed to know what I have to work with first.
I also still need to implement the VFX on the last power (the dark ability), though this should be fairly simple. And as a stretch more UI work to allow the player to see what they have selected (and for the pistol how much ammo they have) would be nice, as well as switching weapons. And as an further stretch a quick main menu to come back to after dying for the sake of demoing would be preferable to have, as well as more stealth kill animations.
Next week I’ll be focusing on level design & foliage as top priority however – but the end is in sight!
This week’s focus has been very heavily geared around creating interiors, more material work, and figuring out a lighting workflow which allows for a high standard of lighting with an optimal frame rate and frame pacing (revised lighting workflow took FPS from 30-40 average to 70-80 FPS).
I also revised the FPS hands model to fit with the narrative and to bring it up to quality, as well as finish off the rats ready to use in the Blink VFX (as per the concepts).
This week’s main focus has been on interior environment art in order to help flesh out the space in the levels. I want the level to feel expansive and a part of a real world, so interiors help me to do this, tell more of a story, and also provide more opportunities and routes through the level for the player.
In this example the player can climb through a window and use the stairs to gain access to the 2nd floor where they will encounter a torn up room with some environmental narrative and some pickups. They can then progress by climbing through the window to climb along the pipe system outside which provides a vantage point as a reward for exploring the level.
To create these interiors the new interior pieces had to use a standard size of 400cm in height, whereas the previous interior pieces (wallpapered wall kit from the prototype) uses 275cm, and the building pieces were 300cm in height (originally intended to provide 25cm of floor/ceiling space height). I have now overhauled the building pieces to use 400cm as the standard height, and using the building tiler system the transition has been easier. The Overseer’s office interior from the prototype had to be tweaked but remains in-tact and still utilises the 275cm height without any issues though this may change down the line.
During the transition process I also started to separate areas into their own levels which utilise level streaming to be loaded in, whether I use this as just an organisation tool or something to actually optimise the whole level is something to look into down the line.
static/dynamic/stationary, shadows, fps (hitting 70-80fps)
I decided to revisit lighting as throughout my years of experience with building games the main killer of performance I have noticed is lighting and shadows. So I investigated heavily into how to actually utilise UE4’s lighting system which allows for a mix of static lightmapping, reflection mapping, shadow mapping, dynamic shadows, and dynamic lighting.
I found that the basic run down of the 3 lighting modes are:
If you want to read up in much more detail you can find where I found the majority of my research here – https://forums.unrealengine.com/development-discussion/content-creation/3076-static-or-stationary
So with all that in mind I decided to utilise dynamic lighting in the exterior as this was the easiest and an exterior level is far too large in scale to utilise lightmapping where this could actually hurt performance, and only requires 2-3 light sources as dynamic, and some strategically placed bounce/fill lights for specific focal points.
My exterior lighting consists of atmospheric and exponential height fog in combination with a sky sphere – this creates the atmosphere and fogs out at a distance, while also allowing me to utilise volumetric fog/lighting (voxel lighting).
Lighting for interiors requires more intervention however with much more precise use of bounce lighting, fill lights, and reflection captures. I would normally use a lot more lights for interiors but that is a much more brute force approach which would only work with static lighting (which sadly doesn’t contribute to specular reflections, making lighting fall very flat).
So to revise my interior lighting workflow I very strategically place lights, starting from light sources and focal points first – usually with spot lights which I default to not using inverse squared (physically accurate lighting) as I am trying to fake in lighting (I will use inverse squared for physical light sources). And I also place reflection captures along the space (with a revised radius), and I will place more in areas with reflections need to more accurate (usually with metals/surfaces with very low roughness/high specular).
By default I also use stationary lighting and turn shadows off as this is the biggest performance killer – I will only use shadows in strategic areas such as from windows, and physical light sources (though these I will usually opt to use dynamic lights). If I do enable shadows I will almost always disable dynamic shadows unless I want to create a specific type of atmosphere or I know very specific gameplay will happen in that area. With my spot lights I also make good use of temperature, colour, intensity, inner/outer cone angles, falloff exponent, and min roughness.
For areas which transition from exterior to interior (or vise versa) I use light portals to help leak that sky lighting, as well as bounce cards (a spot light bouncing off a very light grey plane) outside – this helps to create soft shadows and lighting which feel more natural. And the bounce card technique is the same idea as pointing a light at a white sheet to fill out the space in photography shoots.
Technical details aside I will put in these focal light points, then follow the lighting round with bounce lights, usually adjusting colour to create mood and atmosphere, while also faking in and exaggerating global illumination as lighting will retain some energy (colour) from the surface it bounces from – so if a light hits a green wall it will carry that green as it bounces. I also use point lights to fill out dark spots, lift detail, and generate ambient lighting – these can use static lighting, or stationary with no shadows and adjustments to min roughness as they are not actual light sources so I don’t want them to be captured in reflections.
To achieve this I first focused on materials with a heavy emphasis on the Substance Designer to 3ds Max workflow I have been using throughout the project. I created new materials for wooden floorboards, a rug, an alpha cutout decorative trim (it would cost too much in geo to use the regular metal trim for those details), a rugged wall, and tiling marble (for the staircases). These materials can and most likely be re-used across many interiors and in other areas, as has the previous materials been re-used here.
I’m extremely heavy on procedural workflows wherever possible, so to create the decorative metal trim I utilised 3ds Max in a procedural way where I purely used splines, the loft modifier (to extrude closed shapes along splines), the symmetry modifier (to create the patterns), and double smooth tessellation (turbosmooth with Catmull-Clark tessellation by smooth groups, then again normally to polish edges). This allowed me to purely control the pattern by manipulating the symmetry modifier and editing splines (seen to the left).
This was then baked to a flat plane, tiled and textured using Substance Designer, and in 3ds Max applied to a plane using masked opacity blending, where I also cut out large areas of unused space to reduce overdraw. This is because with masked opacity overdraw only occurs in un-used space where the currently rendered fragment is thrown away if the opacity falls below a threshold – but the small overhead vastly reduces geometry complexity which would also cause issues with light maps due to how complex the geometry would have to be despite its small scale.
I feel it’s worth mentioning that while creating the interiors I needed to find a way to help direct the player through them, as the lighting contrast to the exterior is massive so it can be easy for the player to get lost. This is also especially true as transparency isn’t an option as it will cause too many problems, so my solution was to integrate directional lit translucency to the backface lighting of interiors.
This works as all windows are only planes which ignore the winding order which would otherwise cull their backfaces, I can however in the shader determine what side of the face is being rendered to the current fragment (pixel), so I can use that to blend in the lighting contribution (added to emissive) which is calculated using the standard equation for lit translucency which is essentially lambertian diffusion except it passes through the object so the normal is flipped.
Light = -N.L or more simply put Light = Dot(Inverted Normal, Light)
The basic run down is that this means windows when viewed from the interior will emit light if the directional sun light passes through it, otherwise if it’s shadow the contribution is much smaller. The actual direction of the sun light is passed through a uniform variable (collection parameter) which is calculated from the forward vector (X) of a blueprint which extends the directional light class.
I had to create some unique props for the interior as I needed to actually provide light sources to help me with the lighting. So I created these 3 props – a box light, a wall lamp, and an electrical box. They all use the same material to save texture memory, draw calls, and just generally reduce the texture count (helps with organisation).
My workflow for actually producing these props starts with the high poly generated from the low poly using the double smooth modelling workflow, which involves using one turbosmooth by smoothing groups and multiple iterations to tighten up the surfaces, then another turbosmooth to polish edges. This allows me to be much more free with my concepting and idea stage as I don’t have to worry too much about having to generate the same meshes with different topology and using nearly as many support loops.
I also use splines a lot to help generate the wires, lamp frame, and lamp head, as well as symmetry modifiers, and instanced geometry which allows me to work on a planar work environment while seeing the changes applied in real time to the piece with the correct orientation and position on the prop itself. I also keep in mind repetition, patterns etc for my low poly down the line (such as the wire for example).
Generating the low poly is as easy as duplicating the prop pieces, removing what I don’t need to save texture space (this will be repeated back later), adding support loops/geo for the bakes (especially on cylinders), and creating one tiling piece of wire (the UVs will range from 0 to 1 in V so I can tile that one section, and the U seam will be hidden).
I also use smoothing groups as opposed to chamfers for the most part as this makes unwrapping easier as the geo is simpler, and provides a better bake (the bevels will be captured regardless). When I unwrap I usually use unwrap by smoothing groups, or for more complex pieces I use my custom script which breaks edges by smoothing groups – this whole process is much quicker using all the custom scripts I’ve written as seen on my custom ribbon.
I then export both the low and high as a single FBX for each with tangents & binormals (incorrectly named, should be named to bitangents but oh well!), and smoothing groups. These are then baked by mesh name (important for avoiding intersecting bakes), once the bake is fine and finalised with no UV errors then I begin layering on base materials I’ve amassed in my library (usually consisting of base with baked lighting > overlays > roughness > fine detail > dirt > sharpen).
I fine tune the materials and paint in any specific details after that, where I try to stick to being as procedural for as long as possible so I can fine tune the lookdev with ease. This is done by using lots of generators, fill maps, grunge maps, noise maps, mask building, filters etc.
I also use the baked lighting filter for my base material – though I even out all the directional lighting contributions so it’s extremely subtle, and then adjust AO/cavity & edges so that it makes the asset pop a bit more while remaining physically accurate (as per the Dishonored 2 style).
The textures are then exported using a custom export preset which packs the metalness, roughness, and ambient occlusion into one texture, and ensures all naming conventions are correct by using the material name (set in 3ds Max, for example TX_Props_Lights will give me a normal map named TX_Props_Lights_N). And with these textures applied (so I can see the ambient occlusion namely) I duplicate the low poly meshes again, remove support loops/geo/tessellation, and set up the symmetry modifiers and instanced geometry again then combine each prop into one mesh, name it, ensure the pivot is placed sensibly and the prop has a sensible orientation, then batch export which gives me an FBX using the mesh’s name.
These props are then imported into UE4, materials set-up, collisions set-up (I used a series of box colliders for the wall lamp), and placed in the world.
When placed in the interiors I feel these really help sell the feeling that world is connected, along with pipe systems etc leading up through the walls. This to me is vital as the player will be experiencing these environments and exploring them, not just looking at images of them where I can choose what they can or can’t see.
I also revised the first person arms as I felt the old model from the prototype was lacking in quality and polish, and the hand model also felt very off. So I refined the sculpt and simplified the model to match the character choice I chose earlier in pre-production (The Outsider) – opting for a more simple design of just simple sleeves and cuffs with a button, and more stylised and slightly larger hands.
I also incorporated some more narrative by changing the outsider’s tattoo into a red scarred version cut into the back of his hand. I made this choice as the Outsider doesn’t bare his own mark as he is the one who grants it as a gift to others in the storyline, so to stay true to this and the *spoilers* ending of Death of the Outsider in which he is freed (canonically returned to his mortal form), I felt it was fitting he would try to access the power of the void where he was trapped through very crude means. The tattoo also now glows red as a result of this as I wanted the powers to feel much more raw and less tame.
I also completed the rat model which was modelled in ZBrush using dynamesh and ZSpheres first, then retopologised using the freeform tools in 3ds Max. I kept the topology very low as there will be many on-screen at once using particles, but also optimised for animation as I will be rigging them for specific animations (such as climbing along the player’s hand during Blink), and potentially for scuttling around in the world.
This week I will be focusing on polishing up my progress report for the deadline, along with creating environment assets aimed at the exterior portions of the level, along with further expanding the level per the level design top down plan (namely the docks and shop/courtyard area). I will also work on VFX for the Blink ability, and if I have time I’ll start designing and implementing in the guard’s AI & stealth system – if not I will be working on that next week alongside animations to accompany the guard’s various states & combat.
This week’s focus has been purely engine focused with a lot of back-end groundwork for the ability system implemented and refined, improvements to existing mechanics for added “game-feel”, and a start on the level design.
This week I have been working heavily on implementing and refining the abilities, as well as more importantly their VFX (post-processing, shaders, and particle effects). I have also refined the groundwork to provide me with more control when scripting the abilities (something that is constantly being refined).
I am using a component based design paradigm when it comes to scripting these abilities, where each ability is its own blueprint actor (object) which inherits from the base class (BP_Ability_Base) which includes all the base functionality and virtual functions which I can override, but are handled by the base class as all the abilities and equipment follow a consistent control standard (i.e. tap/hold controls etc) – this essentially makes me base class an abstract class as this itself will never be implemented.
Following the component & object orientated paradigms I have added more systems to make it easier to script gameplay – this works well as Dishonored uses a systems based design paradigm in which gameplay is created by making the systems interact with each other.
For example I have created a system for creating explosions which is handled internally in its own actor, as well as a component which when added to anything compatible will apply fire damage over time and destroy itself when completed – this makes it easy to apply fire damage to anything by simply adding that component to the actor, as well as for these systems to interact with each other (i.e. explosions will apply fire damage to enemies within range).
For example this explosion blueprint is handled in this script here, and then neatly cleans up after itself by destroying itself which keeps the object orientated approach and makes sure the memory is freed after it has been used.
But this can be spawned easily using the SpawnActor function which also exposes all the variables I have selected to customise how the explosion visually and functionally. For example this is how the fire hold ability works which simply spawns an explosion at the player’s hand, but if I wanted to make a grenade I could use this exact same system without any changes other than to the inputs and where I’m spawning the explosion.
Level design is a huge part of the Dishonored franchise, and while my project is not focused around this I do feel it’s still important to put the time into developing a well flowing level with multiple entry & exit points, different routes, and emergent gameplay opportunities. This is to best showcase the powers in a real-time game scenario and allow the player to just experience using them in a tested environment.
*Be aware that lighting hasn’t been baked in many areas and buildings haven’t been vertex painted or had proper decal passes as those are lost when tweaking – so when an area is finalised those will be dealt with.
As mentioned previously having multiple entry/exit points is an important part, so as you can see here with the interior there are multiple points which the player can use to move between different points in the environment, or bypass entirely in this case! To provide incentives for the player to say explore the environment in this case I have provided 2 safes which will hold pickups for the player to help them progress (i.e. health vials).
This interior is completely level however with no verticality – in this case I will most likely leave it as a single level to avoid too much complexity with the exterior transitions.
To combat this I created a back alley area which will allow the player to avoid combat by entering an interior environment through an open window, where I will then develop an interior with a staircase (on my to-do list in the upcoming week!) to provide access to the upper levels. In terms of level flow this will provide access to the vantage point of the pipes to either get a drop on some enemies which will be in the alley, or to bypass them and gain access to the overseer’s office (red building).
To provide small visual landmarks I have made sure all the buildings have different heights, shapes, colours, architectural styles, and even small unique details such as the roof exit point on the green building. This allows the player to navigate the environment with ease and return to earlier points without getting lost.
There is still a lot to go however and in order to further the environment I will be taking a small step back and just working through some more assets such as foliage (bushes, grass, trees, leaves), roof pieces (ceramic tiles, and roof pieces with windows), and interior pieces (staircases, floor material, wall material etc). This in order to give myself the most flexibility when designing the level further.