Monday, 21 October 2024

Sticky Golf Visual Development!

What a change one month can make! Amidst some misc feature updates, I've been focused on figuring out the visual direction for Sticky Golf. My goal has been a soft, cozy, easy to implement art style to compliment the gameplay. What I've come to is this:


September to October visual changes


My visual target level (in progress still) includes the following major changes:
  • Rounded block geo (built out of multiple pieces to maintain scaling)
  • Tiling shader for pattern textures
  • Shader animated grass and bullrush fringe for background
  • Full background parallax
  • My little bouncy mushroom!
I haven't done this much 3D modeling, UVing, and texturing since I went to art school in 2005! I've been having a blast flexing my old skills. Especially happy with the little mushrooms I made. Everything has been constructed with performance, and reusability in mind.

Mushies!


To keep myself on track, I built out a little mood board in Miro with notes on visual direction definitions. My key influence is Paper Mario: The Thousand Year Door, both the original GameCube version, and the new Switch remake.


Vis-Dev mood board snapshot



Tuesday, 24 September 2024

Portfolio Update!

I have officially finished updating my brand new design portfolio over on https://www.scottbalmergamedesign.com! Head on over and have a look!





I have been wanting to do this for a long time now, so it feels good having gone through my years of design work and noted it all down.

Sticky Golf: Ball Types and Surface Tags

 Ball Types:

My plan to make Sticky Golf even more exciting is unlockable Ball Types! Each type looks, sounds, and behaves differently on each type of surface. The current Ball Type list is as follows:

  • Sticky Ball - Default ball type
    • Standard shot power
    • Fail hitting Water
    • Reduced shot power in Sand surfaces
    • Affected by Wind
  • Float Ball - A light-weight ball that floats on surfaces and follows the wind's flow
    • Standard shot power
    • Can land on Water surfaces
    • Can land on top of Sand surfaces
    • Heavily affected by Wind
  • Heavy Ball - A heavy metal ball that doesn't shoot as far, but can break through walls and play underwater
    • Reduced shot power
    • Can sink into Water surfaces, allowing for additional exploration.
    • Fail hitting Sand surfaces (sinks)
    • Immune to Wind
    • Can break through fragile surfaces



Sticky Ball - Water Hazard


Float Ball - Water Landing


Heavy Ball - Water Diving



Audio and Gameplay Surface Tags:

In order to track what SFX, VFX, and gameplay logic to use on each surface, I made a new Surface Tag system! When a player ball collides with another object, it checks for the Surface Tag component, and performs based on.

This has saved on a lot of additional logic on a per-Ball Type basis. I just have to check against current Ball Type, current Audio Tag, and current Gameplay Tag.

The need to split gameplay and surface tags helps cover some edge cases like Breakable walls that other Ball Types can stick to.


Next Steps:
Now that everything is working, it's time to design how, when, and where players can select their current Ball Type.


Bonus!
I also made bounce pads and passthrough platforms!



Saturday, 20 July 2024

Dev Log: Title Screen and Logo Update

I've updated the Sticky Golf  title screen with the following new stuff!

  • A new logo!
  • Animation updates!
  • New background!
  • Music!
  • SFX!
  • Flag shader movement!
  • Clouds!
  • Subtle bush animations!





The new logo visual below too!



Tuesday, 14 May 2024

Dev Log: Playable Levels

Now that the gameplay tuned and bug fixed, I can go ham on level creation. With my years of level design experience, I managed to knock out 9 simple, yet fun levels in no time flat. I even made a few pieces of set dressing to deliver the vibes.




Level Layouts:

Level 1-1: Simple entry point to controls


Level 1-2: Slight obstacle, needing to deal with verticality


Level 1-3: Increasing control challenge. First likely moment of wall sticking.


Level 1-4: Development of verticality and wall sticking 


Level 1-5 - Little sticking playground with a bit of a challenge. Tests directional and launch power skills.


Level 1-6: Introduction of the Spinner obstacle!


Level 1-7: Development of the spinner, and tests control skills in a fun, twisty way. First left-hand side goal flag.


1-8: Tougher, larger challenge level dealing with verticality, spinners, and testing control skills.

1-9: Simple ending with a little twist. Tests control skills in a narrow environment.



I sent the APK to a few friends to play, and they all can't seem to get enough! Stay tuned for more Sticky Golf!

Monday, 13 May 2024

Dev Log: Gameplay Improvement Week

Last week was a busy week, focusing on gameplay improvements! A bunch of physics bugs were destroyed, and the gameplay and input overall feels way more responsive and clean.

Problems to Solve:

  1. Input isn't set up to be platform agnostic
  2. Input and ball jumps not able to be customized for input swipe lengths.
  3. The ball floats in place when sticking to a moving object.
  4. Bunch of weird physics bugs

The Solutions!

1. Make input Platform agnostic
I want to eventually put this game on mobile, Steam, and Switch, so focusing on a single aspect ratio won't do. The input was initially set-up on a single 16:9 landscape. That doesn't factor in different phone or tablet aspect ratios. What is a developer to do?

Well, I was most of the way there. I updated the Gameplay manager to take in the screensize values and divide my touch start and end positions by that. Boom, bam! Problem solved.


Now no matter the screen size or shape, players will have similar input results and swipe sizes.


2. Adjust Swipe input and ball trajectory calculations to be tunable

This one was fun. I wanted to be able to adjust the length a player needed to swipe to get a pre-set minimum and maximum power for ball launches. It took a bit of mathing, but managed something that works!



What I'm doing is:
  • Clamping the initial input from 0,1 to prevent any values over 1 from being calculated (eg. a swipe greater than the screen height)
  • Setting the clamped number to a maxLaunchInput variable if it is higher. This allows me to only require a tunable swipe length to reach max power.
  • InverseLerping the new clamped number between 0 and the max input. Gives me a position between 0 and the max input to adjust the launch power between min and max.
  • Lerping THAT between min and max launch power.
I can adjust my variables for the input min/max, and the launch power min/max however I like, and its giving me the desired result. Something to clean up later, but it works!


3. Make sure the ball doesn't float when sticking to moving objects.

When I stick the ball to a surface, I'm freezing its position and velocities until acted on again. This causes the ball to float when it licks against moving objects like my new rotator gizmo.

I love the solution for this, because it's simple, dumb, and effective. I still freeze the physics/positions, but I also re-parent the ball to the moving object it collides with. Whatever animation is playing on the moving object, the ball will follow.


I just needed to make sure the Animate Physics flag was set on the animator, otherwise spooky stuff happened.


4. Stabilize physics on the ball

I occasionally encountered really weird physics bugs, like the object getting stuck in corners, clipping into geometry, and sometimes rolling away through the air. Sometimes this caused player input to lock and you'd have to restart. Booooo!

I investigated for a while, and found a very elegant solution that solved a ton of my physics problems.

On collision with an object, I added freeze position and rotation logic. On jump, I unfreeze. This little velocity freeze function has made gameplay so much smoother and predictable. 




The result of all the hard work is a much smoother, more enjoyable to play experience!




Next up for gameplay improvements is to adjust my launch angle detection to ensure that players can't launch the ball horizontally and make it roll instead of jump.


Stay tuned!

Thursday, 2 May 2024

Dev Log: Level and UI Management

Now that the basic UI is set up, I've started working on level management. I had a tough choice to make with how I'm managing levels, but I think my decision is the optimal one.


DILEMMA: How do I set up my level management to be scalable long term?

  • Option 1: Make each game level as an individual Scene.
    • Pros: 
      • Simple and clean to load
      • Easy to tune individual level layouts
    • Cons:
      • End up with MANY Scene files.
      • Have to add the Scene files to the Build Settings or face a build break (scary!!!)
      • Have to set up necessary prefabs and components for each Scene, like managers, ui, etc.
        • Could be mitigated with a primary prefab that contains all of that anyway. Just seems like a hassle.
  • Option 2: Set each level as a Prefab instance, and manage everything in a single Scene.
    • Pros:
      • Less build/Scene management
      • Easier level loading/testing
      • Easier course/level data setup and management
    • Cons:
      • A little trickier to debug/edit each level (need to do it in the prefab, or push overrides)
        • I can mitigate this with some debug tools
      • Possibility for some manager wonkiness between level loads.

I'm going with Option 2! When I go to make a new level, I want as little in my way as possible to set it up and get playing. I also don't like the idea of having a million scenes in my project.


Now how am I to structure my level management? I hit up my old whiteboarding friend Miro to work things out.




Getting the scriptable objects set up for Course and Levels took 10 minutes, maybe. Making a new Level Manager and UI Manager to run the level loading and UI updates properly took a lot longer.

I needed to do a bunch of updates to the Player Manager, and add necessary signal dispatches to make sure Levels and the Player Ball were spawning correctly based on the data. Then I ran through and made sure the UI was updating correctly. I also moved a bunch of small UI scripts into my main UI Manager for ease of use.

It's now all working, and currently bug free! See the video below for progress!



Next up on my list are the following:
  • Detail out level design metrics and tune gameplay
  • Create level building blocks (with updated visuals)
  • Build a suite of levels to test out!

Stay tuned for more!

Tuesday, 30 April 2024

Dev Log: UI Day!

Basic gameplay is working, and I was having some difficulties deciding what to do next. I chose to do something easy and fulfilling, so it became UI day!

I started out with setting a panel prefab parent, but realized the layout wasn't what I was looking for. I hit up my old friend Miro to do some wireframing.

Basic UI panel wireframing

Once that was done, I just jumped into engine and started working. I completed the following:

  • Set up main Panel prefab parent
  • Set up Button prefab parent
  • Created temp button art and simple 9-sliced panel backgrounds
  • Scripted Panel string updater so I don't have to hardcode anything.
    • Will switch over to a string db at some point down the road. I've been wanting to learn how to do that.
  • Set up Main Menu, Pause Menu, Gameplay UI prefabs (scalable to UI size)
    • Clickblocker included for things like the Pause Menu.
  • Set up Signal/Receivers for gameplay and pause menu.
    • Stroke counter functional
    • Pause menu functional (timescale set to freeze gameplay.
  • Main Menu > Gameplay > Pause > Main Menu flow functional

That was a lot for one day, but again, super enjoyable. I've missed just building/scripting. The end result looks like thiiiis:



What's up next? Now that I have the UI working, I'm going to focus on getting the level select/progression structure built. Once that's done, I can start whipping together some more test levels and tune the gameplay to my liking!


Until next time!

Tuesday, 23 April 2024

Golfing with a twist

I realized recently that I've missed just making games.

Sitting down, and building things. I've spent a lot of time over the past four years at various companies working on product development, design direction, documentation, tuning, balancing, and leadership skills... but not a lot of just building from scratch.

Well, now that I have some time again, I've started brushing up on my old coding skills.

2 days to prototype after I figured out Unity's new Input Manager, and I have something fun and playable! I'm trying to rebuild an old chestnut from earlier in my career that I never got to fully develop.


Next up is polishing the sticking, and adding some extra juice. I want it to feel absolutely perfect when playing on device.


A Look Back - Halloween 2015

I was poking through some old photos the other day and came across my Halloween costume from 2015: Zant the Usurper King (Legend of Zelda: Twilight Princess). I had this project in mind for years prior, but somehow 2015 was the year.

Made with foam floor tiles, contact cement, paint, and a crazy amount of planning. The armor set came together over the course of 2 months (Sept/Oct). The full costume consisted of the following:

  • Shoulder Armor (foam)
  • Helmet (foam)
  • Mouth Guard (removable, attached by magnets)
  • Robe
  • Pants (sewed them myself!
  • Gold Dragon shoes

My favorite part was the mouthpiece. Magnets place inside it and the helmet allowed me to remove and re-attach it with ease. I was initially going to do face paint underneath, but due to time constraints, I decided to go without. The helmet was more than enough.