Jump to content
  • Advertisement

Unity Weekly updates #24 - I'm capable, you know...

jb-dev

931 views

Hey, nice seeing you again! 

I can safely say that this update is packing quite a punch, so let's get right to it!

Patching up holes

First, I want to talk about navigation meshes. Previously, only the procedurally generated floors were included in the navmesh baking process. This meant that all special rooms (aside for landfills and gyms) were completely inaccessible for any NPCs.

This was due to two issues. The first one was simply that the navmesh baker only looked for the generated floor rather than any walkable surface. In Unity, it was just a matter of changing things a bit to use a bound box rather than checking in the object's hierarchy. The other issue was the way the floor was generated...

Previously, most special rooms using static assets had floors that only covers the room itself, without counting the actual connective gap between it and the rest of the rooms. Because the floors were generated using marching squares, that connection's floor turns into an awkwardly shaped triangle, and thus created two small triangular holes.

The problem was fixed by simply adding another square of the floor after that connective square. 

With these two solutions, NPCs are now able to enter and navigate special rooms, so there's no escape now!

enemyInside.thumb.png.0774275f482859894a17feba8cae9250.png

New Relics and capacities

Next, there's now a lot of newly implemented capacities (and thus relics).

Backup Floppy

backupFloppy.png.bd051c3ba8bfea48f181caba34cfb4ec.png

Quote

Don't get caught with your pants down!

Please make regular backups using this sassy floppy.

 

You could even save yourself in it!

 

Capacities

This relic comes with the Second Chance capacity

Second Chance

When the player is about to die, then they instantaneously regain 25% of their health.

This capacity can only be used once. You can, however, have that capacity many times and thus have multiple chances.

Stats Bonuses

  • DEF -35%
  • HP -25%

Beach Ball

ball.png.6fc66fa06ad880351f7b0c18a9a3eb9a.png

Quote

Beach balls can easily change their direction in the air.

Capacities

This relics only has one capacity: Double Jump.

Double Jump

This capacity is self-explanatory: You can now jump again in mid-air.

Stats Bonuses

  • AGL -12%

Concentrated ATK Juice

atkj.png.b2b743824af1e63ca2ad5b1a59b09047.png

Quote

This refreshment is so dope. I feel I can lift mountains with it...

Capacities

This relics comes with two capacities: Slow Attack and Charge Up

Slow Attack

This capacity simply slows down the attack speed. It also influences the charging times of chargeable weapons (like bows).

This capacity can also be applied multiple times, meaning that attacks get slower and slower the more Slow Attack capacities you have.

Charge Up

This capacity lends to the wearer the capacity to charge attacks with swingable weapons like swords.

A charged attack will have a somewhat substantial damage bonus depending on how long the player held the attack button.

Quite useful to deal with stronger enemies!

Stats Bonuses

  • ATK +25%
  • AGL -10%

Echo Drop

echod.png.b44a62739f2f3b1d2383d51e4fbe6de5.png

Quote

 

Our engineers have been able to capture the first dew drop of last Monday morning.

This stuff is potent, so careful.

 

Capacities

This relic only got one capacity: Shockwave.

Shockwave

With this capacity, the entity can generate a shockwave when they attack if they're lucky. 

This makes any enemies in a small radius take damage no matter if they're hidden or not

Stats Bonuses

  • DEF -29%

Electronic Mask

msk.png.f6868c3ed4cc387d5bbd179f678e5229.png

Quote

 

Experience a whole new level of calmness with the Electronic Mask.

Everything in your life will become clearer and less confusing.

 

Capacities

This relic comes with two capacities: See Enemy Health and Clairvoyance.

See Enemy Health

This capacity is quite self-explanatory. It gives the player the ability to see any targeted enemy's current health. 

image.png.b6081bbbf6a744c27dbb0d58ca4952d6.png

Quite handy for planning attacks!

Clairvoyance

This capacity helps the player find their way by rendering a nice glowing path to the exit.

The path actually gets refreshed every 5 seconds, and there's even a nice fade-out.

Here's a picture of that path 

16768398_image(19).thumb.png.797fd0006686ca6ea522c5f0322125db.png

As you can see it's really AESTHETIC.

The colours of that path are picked from our palette, meaning that it changes colours depending on the current level.

Stats Bonuses

  • DEF + 5%
  • HP -20%

Fan Of Violence

fanofv.png.4931e398cd64dc54aa8ee313e538cde2.png

Quote

 

This manual fan has the word "fire" written on it.

Holding it, you feel really violent...

 

Capacities

This relic lends two capacities: Corrosive Spead and Enflamer

Corrosive Spead

This capacity makes any killed enemies drop a puddle of poisonous blood.

If another enemy walks on it they instantaneously become poisoned (if they don't have any other status effect that is).

The puddle dries up after a while. 

As of now, there's no actual damaged dealt directly to enemies when they stand on a puddle. This might an idea for later, though.

Enflamer

This capacity is quite easy to understand: you now deal fire damages and have a chance to give the burning status to any attacked entities.

Stats Bonuses

  • ATK +5%
  • HP -5%

Flying Shoe

image.png.dbc83537b8e4c3d4f27a203649fdc28d.png

Quote

 

This is a single skating shoe with some kind of wings on each side.

Holding it makes you feel floaty...

 

Capacities

This relic only got one capacity: Hover.

Hover

This capacity makes the entity able to glide for a short period of time after a jump.

Simply press and hold the jump button to glide. After a bit, the glide will stop. You can also release the jump button during a glide to stop it.

One would think that the Double Jump capacity would counteract with this one but one would be wrong: just hold the button down after the double jump.

This paired with a ranged weapon will make a deadly combo.

Stats Bonuses

  • HP -5%

New Activatable Item

Next, I want to talk about a new activated Item: French Fried

French Fried

Alignment: Future Funk

frechfried.png.a03ffdc582ef89768a6356a6b89031b3.png

Quote

Holding it you can hear seagulls screaming in French.

Description

This is a rather funny looking moustached french fry wearing a beret and smoking a cigarette (Don't smoke, kids).

This item can summon a seagull familiar that attacks any nearby enemies for a limited amount of time.

Once the time runs out the seagull disappears.

The player can have up to 3 seagulls at a time. there's also a cooldown before the item can be used again.

Capacities

Aside for its activatable ability, the Hover capacity is also given to the player as long as they hold the item.

Stats Bonuses

  • DEF -11%

Headshots!

I've previously thrown the idea around of having different damage bonuses if the player targets a specific body part with a projectile.

I'm proud to say that the feature is now fully implemented. Now there's a 5x damage multiplier to projectile if they hit the head (for example).

Although these bonuses exist, there's still a lot of balancing to do and whatnot.

But I got to say that it's quite fun headshooting enemies with arrows (mainly because enemies aren't balanced yet).

This works (of course) for any projectiles.

Mouse Refactored

There's also have been a big mouse control refactor. Previously, the mouse script I used wasn't as flexible as I originally thought. Rather than coding everything from the ground up, I've decided to cherry-pick code from Unity's standard Assets FirstPersonController script.

I Initially wanted to fully use the controller, but there were some input delays with the Update and FixedUpdate functions. I decided to pick its MouseLook script and integrate it into my custom PlayerController.

The results were night and day. Not only I could easily change the sensitivity, but there's even a "Smooth Mouse" function which interpolates mouse movements.

Mouse Sensitivity

Speaking of mouses, I've also added the ability to change the mouse sensitivity.

This was made after many feedbacks of my playtesters, who were either unable to use the mouse properly or complained about an excessively sensitive mouse.

The Mouse Sensitivity setting takes the form of two components:  a slider and an input field.

image.thumb.png.0d7f3d59db4402e567bf04b4c01fbf43.png

In essence, the input field is used to save the actual sensitivity, while the slider is just a more tactile way to set the sensitivity.

Right now, changing the slider will update the input field, which in turns updates the mouse sensitivity. If the player wants an absurd sensitivity (like 100 or something), they can't use the slider for that (which only goes up to 20 right now) and instead have to manually input this in the input field.

There's also another checkbox component controlling that previously mentioned "Smooth Mouse" mode.

Pause Screen Option Tab

Now there's an options tab in the pause menu:

pauseOptionTab.thumb.png.d110bb0c8cc67426e68feae14dfbff4b.png

This is a quick way to change common settings such as volume slides and mouse sensitivity among other things.

These work just like their Main Menu counterparts.

Once the player closes the pause menu, options are automatically saved.

Quite handy if you want to adjust your mouse sensitivity mid-game, or lowering volumes while streaming.

Closed Rooms

Previously, all rooms were open form the getgo. The player could technically speedrun their way through the game without breaking a sweat.

This kinda made the game quite boring, as there weren't any valid reason to destroy every enemy in each room. This was in a dire need of change.

So I've now implemented a linear progression system, in which the player needs to clear the room of any enemy before passing on. 

Of course, the player can break walls or enter special rooms anytime (mainly because these rooms are optional and won't provide any shortcuts at all), but in order to go to the next room, they need to clean the room first.

image.thumb.png.73c890a3cf039b4bf5720646743398f9.png

The way this works is by having closed/opened doors (much like locked doors but without any type of locks).

This makes the game feel more like a game, although there's still place for improvement.

Minor Upgrades

  • Fixed the MSAA artifact bugs
    • It was quite simple: just use FXAA
    • Technically I can also do TAA (Temporal Anti Aliasing), but this could be put in the options.
    • Of course, there's a lot of other options, but right now FXAA does the job just fine
    • There might be better options, or maybe an MSAA fix but this will wait.
  • Added a  looping testing sound effect when fiddling around with the Sound Effect volume slider
    • This is for both the Main Menu's options screen and the Pause Menu Options tab.
  • Fixed a lot of bugs, especially with destruction/creation
  • Charging an attack now slow down the player
    • Once the player unleashes its attack it resets
  • Previously both the Quick and Slow Attack capacities only affected swing speeds. Now they also affect the charging rate.
  • Added a touch of Ambient Occlusion
    • I will probably put this in the options later on...

Next Week

Even with a cold doing its thing I'm still trying to be proactive and work on the game.

In fact, yesterday I started working on a draft of a boss behaviour tree. Although still really rough and full of bugs I think I can have a working boss ready for next week.

Afterwards, It'll be modelling time again, but this time it'll be level specific stuff.

And after that, there's other relics, items, food, capacities and abilities that are left in the design document that needs to be implemented in the game, which means modelling, coding, designing and whatnot.

But right now let's focus on bosses...




0 Comments


Recommended Comments

There are no comments to display.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Advertisement
  • Advertisement
  • What is your GameDev Story?

    In 2019 we are celebrating 20 years of GameDev.net! Share your GameDev Story with us.

    (You must login to your GameDev.net account.)

  • Blog Entries

  • Similar Content

    • By Transcendent
      So this is the problem that I have :- https://youtu.be/kU8Dm5bDJXg
      This is the code i am using:-
      using System.Collections; using System.Collections.Generic; using UnityEngine; namespace SA { public class AnimatorHook : MonoBehaviour { Animator anim; StateManager states; public void Init(StateManager st) { states = st; anim = st.anim; } void OnAnimatorMove() { if (!states.canMove) anim.ApplyBuiltinRootMotion(); states.rigid.drag = 0; float multiplier = 1; Vector3 delta = anim.deltaPosition; delta.y = 0; Vector3 v = (delta * multiplier) / states.delta; states.rigid.velocity = v; } } } For additional reference see the following code
      using System.Collections; using System.Collections.Generic; using UnityEngine; namespace SA { public class StateManager : MonoBehaviour { [Header("Init")] public GameObject activeModel; [Header("Inputs")] public float vertical; public float horizontal; public float moveAmount; public Vector3 moveDir; public bool rt, rb, lt, lb; [Header("Stats")] public float moveSpeed = 5f; public float runSpeed = 8f; public float rotateSpeed = 20; public float toGround = 0.5f; [Header("States")] public bool onGround; public bool run; public bool lockOn; public bool inAction; public bool canMove; [Header("Other")] public EnemyTarget lockOnTarget; [HideInInspector] public Animator anim; [HideInInspector] public Rigidbody rigid; [HideInInspector] public AnimatorHook a_hook; [HideInInspector] public float delta; [HideInInspector] public LayerMask ignoreLayers; float _actionDelay; public void Init() { SetupAnimator(); rigid = GetComponent<Rigidbody>(); rigid.angularDrag = 999; rigid.drag = 4; rigid.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationZ; a_hook = activeModel.AddComponent<AnimatorHook>(); a_hook.Init(this); gameObject.layer = 8; ignoreLayers = ~(1 << 9); anim.SetBool("onGround",true); } void SetupAnimator() { if(activeModel == null) { anim = GetComponentInChildren<Animator>(); if(anim == null) { Debug.Log("no model found"); } else { activeModel = anim.gameObject; } } if(anim == null) { anim = activeModel.GetComponent<Animator>(); } //anim.applyRootMotion = false; } public void FixedTick(float d) { delta = d; rigid.drag = (moveAmount > 0 || !onGround) ? 0 : 4; DetectAction(); if (inAction) { // anim.applyRootMotion = true; _actionDelay += delta; if(_actionDelay > 0.3f) { inAction = false; _actionDelay = 0; } else { return; } } canMove = anim.GetBool("canMove"); if (!canMove) { return; } //anim.applyRootMotion = false; float targetSpeed = moveSpeed; if (run) targetSpeed = runSpeed; if(onGround) rigid.velocity = moveDir * (targetSpeed * moveAmount); /* if (run) lockOn = false; */ Vector3 targetDir = (lockOn == false) ? moveDir : lockOnTarget.transform.position - transform.position; targetDir.y = 0; if (targetDir == Vector3.zero) targetDir = transform.forward; Quaternion tr = Quaternion.LookRotation(targetDir); Quaternion targetRotation = Quaternion.Slerp(transform.rotation, tr, delta * moveAmount * rotateSpeed); transform.rotation = targetRotation; anim.SetBool("lockon", lockOn); if (lockOn == false) HandleMovementAnimations(); else HandleLockOnAnimations(moveDir); } public void DetectAction() { if (canMove == false) return; if (rb == false && rt == false && lt == false && lb == false) return; string targetAnim = null; if (rb) targetAnim = "Sword And Shield Attack"; if (rt) targetAnim = "Stable Sword Outward Slash"; if (lb) targetAnim = "Standing Melee Attack Horizontal"; if (lt) targetAnim = "Sword And Shield Slash (1)"; if (string.IsNullOrEmpty(targetAnim)) return; canMove = false; inAction = true; anim.CrossFade(targetAnim,0.2f); //rigid.velocity = Vector3.zero; } public void Tick(float d) { delta = d; onGround = OnGround(); anim.SetBool("onGround", onGround); } void HandleMovementAnimations() { anim.SetBool("run", run); anim.SetFloat("Vertical", moveAmount ,0.4f,delta); } void HandleLockOnAnimations(Vector3 moveDir) { Vector3 relativeDir = transform.InverseTransformDirection(moveDir); float h = relativeDir.x; float v = relativeDir.z; anim.SetFloat("Vertical", v, 0.2f, delta); anim.SetFloat("Horizontal", h, 0.2f, delta); } public bool OnGround() { bool r = false; Vector3 origin = transform.position + (Vector3.up * toGround); Vector3 dir = -Vector3.up; float dis = toGround + 0.3f; RaycastHit hit; if(Physics.Raycast(origin,dir,out hit,dis)) { r = true; Vector3 targetPosition = hit.point; transform.position = targetPosition; } return r; } } } I've been stuck on this for too long, any help will be highly appreciated
    • By jb-dev
      This is a short .gif showing off visuals effects for the parrying mechanic
    • By Dyonisian
      Note: This article was originally published on LinkedIn.  If you enjoy my article, please click through and consider connecting with me.
       
      Can programmers art? How far can creativity and programming take you?
      I have summarized what I learned in several months into 7 key techniques to improve the visual quality of your game.
       
      "Programmer art" is something of a running joke. For those unfamiliar with the term, it refers to the "placeholder" or "throw-together" art that programmers tend to use while developing games.
      Some of us don't have the necessary artistic skills, however, sometimes we just can't be bothered to put in the effort. We're concerned about the technical side of things working - art can come later.
      Here's what this usually means -

       
      I worked on a game jam with some new people a few months ago. I just wanted to make sure that my gameplay and AI code was doing what it was supposed to do. This would have to interface with code from other teammates as well, so it was important to test and check for bugs. This was the result.
      That's not what I'm going to talk about today though.
       
      I'm going to take a different angle on "programmer art" - not the joke art that programmers often use, but the fact that there's a LOT that a programmer can do to improve the visual appeal of a game. I believe some of this falls under "technical art" as well.
       
      My current job kind of forced me to think in this capacity.
      I was tasked with visualizing some scientific data. Though this data was the result of years of hard work on the part of scientists, the result was unimpressive to the untrained eye - a heap of excel files with some words and numbers.
      There are very few people in the world who can get excited by seeing a few excel files.
      My job? To make this data exciting to everyone else.
      My task was to visualize connectome data for a famous worm known as C. Elegans, made available by the wonderful people working on the OpenWorm project.
      Part of the data parsing to read and display the data as a worm's body with neurons on it was done by my teammate. My main task was to improve the visuals and the overall graphical quality.

       
      The first thing that comes to mind is using HD textures, PBR materials and high-poly models. Add in a 3D terrain using a height map, some post-processing and HDR lighting, and BOOM! Gorgeous 3D scene. I'm sure you've all seen loads of those by now.
      Except, almost none of that would really help me.
      The idea was very abstract - neurons and connections visible in a zoomed-in, x-ray-like view of a worm. I don't think rolling hills would have helped me much.
      I had no 3D modelling skills or access to an artist - even if I did, I'm not sure what kind of 3D models would have helped.
       
      As a result, what I've made isn't a gorgeous 3D environment with foliage and god-rays and lens flares. So it's not applicable in every case or the perfect example of how a programmer can make a gorgeous game.
      But, it does provide a distinct viewpoint and result. The special sets of constraints in the problem I had to solve led to this.
      So here's what I actually did:
       
      The 7 things I did to improve the visuals of my Unity game
      1. Conceptualizing the look
      This could be considered a pre-production step for art or any visual project. Ideally, what should it look like? What's the goal? What are your references?
      In this case, the viewer had a hologram-like feel to it (also there were plans to port it to a HoloLens eventually). I liked the idea of a futuristic hologram. And the metaphor of "AI bringing us towards a better future".
      So what were my references? Sci-fi of course!
      My first pick was one of my favourite franchises - Star Wars. I love how the holo-comms look in the movies.

       
      Holograms became a key component of my design.
      This is a HUD design from Prometheus that I found on Google -

       
      In this case, the colours appealed to me more than the design itself. I ended up basing the UI design on this concept.
       
      Key takeaway - Your imagination is the very first tool that helps you create impressive art. Use references! It's not cheating - it's inspiration. Your references will guide you as you create the look that you want.
       
      2. Shaders can help you achieve that look 
      I had some shader programming experience from University - D3D11 and HLSL. But that work had been about building a basic graphics engine with features like lighting, shadows, and some light post-processing. I had done some light Shader programming in Unity before as well.
      What I really needed now was impressive visual effects, not basic lighting and shadows.
      I was really lucky that this was about the time Unity made Shader Graph available, which made everything much easier. I can write Shader code, but being able to see in real time what each node (Which can be considered a line of code) does makes it so much easier to produce the effects you want.
      I familiarized myself with all the samples Unity had included with this new tool. That wouldn't have been enough though. Thankfully due to my previous experience with Shaders, I was able to make some adjustments and improvements to make them suit my needs.
      Some tweaking with speed, scaling, colours, and textures led to a nice hologram effect for the UI panels.

       
      I wanted the viewer to feel good to interact with as well, and some work implementing a glow effect (alongside the dissolve effects) led to this -
       
      Key takeaway - Shaders are an extremely powerful tool in a Game Programmer's repertoire. Tools like Unity's Shader Graph, the old Shader Forge asset, and Unreal's material editor make Shaders more accessible and easier to tune to get the exact look you want.
      PS - Step 5 below is also really important for getting a nice glow effect.
       
      3. Visual Effects and Animations using Shaders
      I was able to extend the dissolve and hologram shaders to fake some animation-like visual effects.
      And a combination of some timed Sine curves let me create an animation using the dissolve effect -
       
      The work here was to move the animation smoothly across individual neuron objects. The animation makes it look like they're a single connected object, but they're actually individual Sphere meshes with the Shader applied to them. This is made possible by applying the dissolve texture in World Space instead of Object Space.
      A single shader graph for the neurons had functionality for colour blending, glow, and dissolve animation.
      All of this made the graphs really large and difficult to work with though. Unity was constantly updating the Shader Graph tools, and the new updates include sub-graphs which make it much easier to manage.
      Key takeaway - There is more to shaders than meets the eye. As you gain familiarity with them, there are very few limits to the effects you can create. You can create animations and visual effects using Shaders too.
       
      4. Particle systems - more than just trails and sparks
      I have no idea why I put off working with the particle systems for so long!
      The "neurons" in the viewer were just spheres, which was pretty boring.
      Once I started to understand the basics of the particle system, I could see how powerful it was. I worked on some samples from great YouTube tutorials - I'm sharing a great one by Gabriel Aguiar in the comments below.
      After that, I opened up Photoshop and experimented with different brushes to create Particle textures.
      Once again, I referred to my sources of what neurons should look like. I wanted a similar look of "hair-like" connections coming out of the neurons, and the core being bright and dense.
      This is what it looked like finished, and the particle system even let me create a nice pulsating effect.
       
      Part of my work was also parsing a ton of "playback data" of neurons firing. I wanted this to look like bright beams of light, travelling from neuron to neuron. This involved some pathfinding and multi-threading work as well.
       
      Lastly, I decided to add a sort of feedback effect of neurons firing. This way, you can see where a signal is originating and where it's ending.
       
      Key takeaway - Particle systems can be used in many ways, not just for sparks and trails. Here, I used them to represent a rather abstract object, a neuron. They can be applied wherever a visual effect or a form of visual "feedback" seems relevant.
       
      5. Post-processing to tie the graphics and art together
      Post-processing makes a HUGE difference in the look of a game scene. It's not just about colours and tone, there's much more to it than that. You can easily adjust colours, brightness, contrast, and add effects such as bloom, motion blur, vignette, and screen-space reflections.
      First of all, Linear colour space with HDR enabled makes a huge difference - make sure you try this out.
      Next, Unity's new post-processing stack makes a lot of options available without impacting performance much.
      The glow around the edges of the sphere only appears with an HDR colour selected for the shader, HDR enabled, and Linear colour space. Post-processing helps bump this up too - bloom is one of the most important settings for this.
      Colour grading can be used to provide a warm or cool look to your entire scene. It's like applying a filter on top of the scene, as you would to an image in Photoshop. You can completely override the colours, desaturate to black and white, bump up the contrast, or apply a single colour to the whole scene.

       
      There is a great tutorial from Unity for getting that HD look in your scenes - if you want a visible glow you normally associate with beautiful games, you need to check this out.
       
      Key takeaway - Post processing ties everything together, and helps certain effects like glows stand out.
       
      6. Timing and animation curves for better "feel" 
      This is a core concept of animation. I have some training in graphic design and animation, which is where I picked this up. I'm not sure about the proper term for it - timing, animation curves, tween, etc.
      Basically, if you're animating something, it's rarely best to do it with linear timing. Instead, you want curves like this -

       
      Or more crazy ones for more "bouncy" or cartoon-ish effects.
      I applied this to the glow effects on the neurons, as I showed earlier.
      And you can use this sparingly when working with particle systems as well - for speed, size, and similar effects. I used this for the effect of neurons firing, which is like a green "explosion" outwards. The particles move outwards fast and then slow down.
      Unity has Animation Curve components you can attach to objects. You can set the curve using a GUI and then query it in your C# scripts. Definitely worth learning about.
      Key takeaway - Curves or tweens are an animation concept that is easy to pick up and apply. It can be a key differentiator for whether your animations and overall game look polished or not.
       
      7. Colour Palettes and Colour Theory - Often overlooked
      Colour is something that I tend to experiment with and work with based on my instincts. I like being creative, however, I really underestimated the benefits of applying colour theory and using palettes.
      Here's the before -
       
      Here are some of the afters -
       
      I implemented multiple themes because they all looked so good.
      I used a tool from Adobe for palettes, called Adobe Colour - link in the comments.
      I basically messed around with different types of "Colour harmony" - Monochrome, triad, complementary, and more. I also borrowed some colours from my references and built around that.
      Key takeaway - Don't underestimate the importance of colour and colour theory. Keep your initial concept and references in mind when choosing colours. This adds to that final, polished look you want.
       
      Bonus - consider procedural art
      Procedural Generation is just an amazing technique. I didn't apply it on this project, but I learned the basics of it such as generating Value and Perlin noise, generating and using Height maps for terrains, and generating mazes.

       
      Procedural art is definitely something I want to explore more.
      A couple of interesting things (Links in the "extra resources" section below) -
      Google deepdream has been used to generate art. There's an open-source AI project that can colour lineart. Kate Compton has a lot of interesting projects and resources about PCG and generative art. I hope this leads to tools that can be directly applied to Game Development. To support the creation of art for games. I hope I get the opportunity to create something like that myself too.
      Conclusion
      These 7 techniques were at the core of what I did to improve the visual quality of my project.
      This was mostly the result of the unique set of constraints that I had. But I'm pretty sure some famous person said: "true creativity is born of constraints". Or something along those lines. It basically means that constraints and problems help channel your creativity.
      I'm sure there is more that I could have done, but I was happy with the stark difference between the "before" and "after" states of my project.
      I've also realized that this project has made me more of an artist. If you work on visual quality even as a programmer, you practice and sharpen your artistic abilities, and end up becoming something of an artist yourself. 
       
      Thanks for reading! Please like, share, and comment if you enjoyed this article.
      Did I miss something obvious? Let me know in the comments!
       
       
       
       
       
      Extra Resources
      OpenWorm project
      Great tutorial by Gabriel Aguiar
      Unity breaks down how to improve the look of a game using Post processing
      Another resource on post-processing by Dilmer Valecillos
      Brackey's tutorial on post-processing
      Adobe Colour wheel, great for colour theory and palettes
      An open-source AI project that can colour lineart
      A demo of generative art by Kate Compton
       
      Note: This article was originally published on LinkedIn. If you like it, please click through, get in contact, and consider connecting.
    • By invent71
      Hi GameDevs,
      We have been busy working on a new Retro Shoot em up called "IRIDIUM", A frantic new 2D shoot 'em up with huge levels and truly massive enemy ships. Mixing game styles from Uridium, Xenon 2 and Nemesis.
      We do have a demo to play for PC  https://nebula-design.itch.io/iridium
      If you love shootemups as much as us, please let us know your thoughts. Some example images below  We'd love to get this on NintendoSwitch if we can reach our goal.
       
       

×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!