Notifications
Article
Tryst of Stone
Published 6 months ago
96
0
Mini game project as learning.
The game can be found here.

Background

As a study I wanted to create a mini game, from scratch, going through everything on my own as much as possible. During this I've learned (for example) that I need to take notes on how much time I spend on it. Sadly not from the start - but I can tell it was at the very least 450 hours!

Idea

Didn't want any deep and complex game, just a light story, fit for a small game like this. So I took some of my friends, made them heroes who are fighting against the henchmen of the evil tyrant, who - after limiting most aspects of life in their country - decides to ban drinking alcohol. Our heroes can't stand this as they like to talk about the world's problems with a beer or whisk(e)y in their hand.

Making of

I'll try to keep it short, separating themes as they are in my project folder. For start here is my desktop background, it was a must for me to have something where I can see the tasks every day I power up the computer. I have an empty version if you need it. ;)

Models

I made all of the models in 3ds Max, and exported it via the inbuilt GameExporter function. Started with the environment, going for low poly design to decrease needed time - and to be honest, I'm not a sculptor of Mudbox/ZBrush.


The main steps for characters were like this:
  1. Create a simple bone system, the human template was perfect for this. Modify it a bit, like scaling and transforming bone objects to a shape resembling the character.
  2. Following the bones, create the body of figure.
  3. Everyone's most loved step: making the UV maps.
  4. Go to Photoshop and create the textures.
  5. Back to 3ds Max, creating animations like walking forward, backward, side step, shooting, secondary attack, dying.
  6. And finally clean up and an export to Unity - most of the time it worked, but when not... well, had to try it a few times (and still have strange result for one of the enemies).
I made a list of notes about the workflow, to have as little problem in Unity as possible.
Modelling - mind mirroring and UVW tiling when creating sections - create simple bone system (CAT) as a base !Before UVW! - check pivot world alignment - reset xform! - check isolated vertices, open edges Making UVW - check scales (checker texture) - tileable sections if possible After UV and texture - export test FBX and import to Unity to check if texture is correct GameExporter options: - create export selection (mesh+bones+helpers) - Animation Clips - set export object set - do not set separate anim clips, just the sum as Unity doesn't care - tick bake animation - save clips to single file - tick embed media (if you want texture in fbx too) - choose directory - settings - geometry > untick smoothing groups - lights > untick lights IK-FK in CAT --- DO NOT ENABLE IKTarget on CATMotion Layer, only in added Local layer!
And here are some WIP pictures creating the intro.

Audio

For the effects I used Audacity to edit and boost sounds found on Freesound. Most of the final effects are originating from there, but I also recorded some of them as well. I think my girlfriend is still giggling whenever she remembers as I made those "ow" "eww" "ghharr" "weee" "ouch" sounds. :)
The music were partially made in an old version of Reason, and there is one where I played on my guitar.

Textures

All of the textures, paint works, etc. were made with Photoshop. For the 3D models' textures, I spent a lot of time searching for usable templates, cutting and smoothing them together. This is especially true for the buildings, as all of them used the same image file with tiled UV. Only one layer of UVs, again just to reduce the difficulty of the whole project.
In Unity I used mostly the PSD file with multiple group of layers so I can modify it easily and see the result immediately. Once I was settled with the results I used other, simpler and smaller formats (like JPEG, PNG).

Unity

I went through Unity's Survival Shooter tutorial before starting my own similar little game, so the very basics of the scripts are from there, but I added a lot of extra to my own game like secondary attack, levels, multiple enemies, healing drops and such. I could really go on and on, but I don't want to bore you, so I put some this and that here, probably some of it will be useful - like the object fader scripts which I made in C#.
Two pictures about the progress:
The object fader scripts. Put the raycast script on the camera, and create a prefab from an empty game object with the fader script attached to it. Used this with Amplify Shader's modified simple texture (added opacity float, and made it transparent), the material change method didn't look well, there was a drastic difference between the opaque and the transparent material.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ObjectFader_Raycast : MonoBehaviour { Transform player; public float rayLenght = 100.0f; // the lenght of the ray int rayLayerMask; // layer of objects to check Vector3 dir; // direction of ray Material mat; // material to change public GameObject objectFaderPrefab; // the prefab which is placed upon the object string faderObjectName; // name of prefab ObjectFader objectFaderscript; // link to script void Start() { player = GameObject.FindGameObjectWithTag("Player").transform; rayLayerMask = LayerMask.GetMask("Shootable"); faderObjectName = objectFaderPrefab.transform.name; faderObjectName = faderObjectName + "(Clone)"; // modify the basic name to find clones } void Update() { dir = player.position - transform.position; // update the direction of ray RaycastHit[] hits; // create array of hits hits = Physics.RaycastAll(transform.position, dir, rayLenght, rayLayerMask); // populate array with hits for (int i = 0; i < hits.Length; i++) // iterate through hits { RaycastHit hit = hits[i]; // get info about the object GameObject objectHit = hit.transform.gameObject; Transform faderChild = objectHit.transform.Find(faderObjectName); string hitTag = objectHit.tag; if (hitTag != "Enemy") // enemies should not fade { // check if object already has a fader prefab if (faderChild == null) // generate one if not { GameObject faderclone = Instantiate(objectFaderPrefab) as GameObject; faderclone.transform.SetParent(objectHit.transform); } else if (faderChild) // or reset the fade back timer on it { objectFaderscript = faderChild.GetComponent<ObjectFader>(); objectFaderscript.timer = objectFaderscript.originalTimer; } } } } }
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ObjectFader : MonoBehaviour { Material mat; public float timer = 1.0f; // time to wait to fade back to normal public float fadeValue = 0.5f; // the end value of fading public float fadeTime = 0.5f; // how long should the transition take !!MUST BE SMALLER THAN timer!! [HideInInspector] public float originalTimer; // used to reset the timer from raycast void Start() { originalTimer = timer; mat = GetComponentInParent<Renderer>().material; StartCoroutine(Fader(1.0f, fadeValue, fadeTime)); } void Update() { timer -= Time.deltaTime; if ((timer - fadeTime)<0) { StartCoroutine(Fader(fadeValue, 1.0f, fadeTime)); } if(timer < 0) { Destroy(gameObject); } } private IEnumerator Fader(float startFade, float endFade, float timeFade) { float elapsedTime = 0f; float actualFadeValue = startFade; while (elapsedTime < timeFade) { actualFadeValue = Mathf.Lerp(startFade, endFade, (elapsedTime/timeFade)); mat.SetFloat("_Opacity", actualFadeValue); elapsedTime += Time.deltaTime; yield return null; } } }

Video Editing

For the intro I wanted to create a small animation, but I found out very soon (well, I wasn't that surprised), that even two dozen seconds of animation take a lot of time. So I changed it to still pictures, and sewed them together with VSDC Video Editor, which is a free editor.


Conclusion

The result is far from perfect, and it is not a game I would put on a market with good heart (or at all), but that wasn't the point of the hundreds of hours I spent doing it - I learned a lot, and that is important. Now I can move on to further my knowledge in game developement.

Zsombor Cserny
IT Admin - Other
6
Comments