|
Project Title: Colorless
Development Time: ~140 hours Team size: 5 developers (1 artist) Game Engine: Unity Tools: Adobe Photoshop |
Perturbed Apples presents Colorless, a movement-based isometric puzzle game developed for the Android tablet. Within the game you guide the main character Yuki, who has been rendered colorless, through a series of different colored worlds with unique mechanics to fill up your palettes with the colors of each world and restore her features.
|
RESPONSIBILITIES
- Designed and created all art assets (environment, character, UI, menus, splash screens, animations)
- Created an isometric modular kit of both gameplay and clutter elements so that levels could be easily build and iterated on
- Created sprite sheets for all animation sets (characters, environment, portals, pickups)
- Set up lighting in levels and edited for optimization
- Oversaw and approved of level design aesthetics
- Assisted with bug fixing and script creation
- Packed sprites for game optimization
- Contributed to game design decisions
- Created marketing materials (poster, icons, DVD cover, CD image)
ENVIRONMENT As we had four distinct color worlds, each required their own set of unique assets (walkable tiles, background assets, gameplay assets, clutter assets and animations), as well as a set of generalized assets which were shared throughout all levels (light beams, particle systems). In addition to creating the assets, I made periodic passes through levels to adjust the placement of non-gameplay related sprites, as well as set up lighting, utilizing point lights and a combination of lit/unlit materials as needed. |
MODULAR ASSETS To assist with rapid iteration, I created modular asset sets which could be moved and reused anywhere throughout their respective color worlds. Each world set had one isometric tile which could be reused to make the maps and side clutter, as well as environmental assets which were unique to the theme of each world. |
Many of the environmental assets had short 2-3 frame animation sets associated with them, particularly the grass assets. This was done to add additional life to the scenes. Environmental assets are colored appropriately to match their level, and were all intentionally kept a more subdued color than the gameplay tiles, so that players could easily differentiate what in the scene was able to moved to and interacted with vs what was merely decoration. |
PICKUPS
There were two pickups present in the game which both required their own animation set. I wanted the portal orb pickup to match the design of the portal itself, to indicate to players that the two were connected, and for the footsteps to clearly convey that they were related to movement. All interactable objects in the game are highlighted in the same bright blue to indicate to the player what they can and cannot use within each level.
There were two pickups present in the game which both required their own animation set. I wanted the portal orb pickup to match the design of the portal itself, to indicate to players that the two were connected, and for the footsteps to clearly convey that they were related to movement. All interactable objects in the game are highlighted in the same bright blue to indicate to the player what they can and cannot use within each level.
PORTALS There were two color variants of the portals, blue and orange, to indicate entry and exit portals respectively. The portals needed an initial animation when they were turned on (which was then mirrored for the turn-off animation), as well as an idle animation once they were activated. I was able to utilize the same animation sheets for both color variants, simply tinting them to match the two different colors. |
CHARACTER
As our game called for the character to gradually change color as you progress through the different colored worlds, each base animation set (idle forward, idle away, walk forward, walk away, victory) had four variants (white world, red world, green world, purple world).
As our game called for the character to gradually change color as you progress through the different colored worlds, each base animation set (idle forward, idle away, walk forward, walk away, victory) had four variants (white world, red world, green world, purple world).
|
UI/UX I created and implemented functionality for all UI assets, including buttons, icons, the HUD elements, the main menu, and separate menu scenes off the main menu (options, level select, credits, team splash screen). This required implementing several simple scripts, such as the ability to close one page and open another when navigating between screens. |
SCRIPTING In addition to my art responsibilities, I also wrote and implemented several scripts, including a shader effect for our initial splash screen which set the initial image to greyscale then slowly dripped color down the screen, using Perlin noise, to create a watercolor effect. To stop the transition once it was complete, I clamped the effect to only occur from values of (-1 – 1), where the full greyscale image has a value of 0 and the colored has a value of 1, as otherwise the image would continue to re-saturate past its original color. Many of these variables were exposed, including the total time of the effect duration, the location on the screen where the effect began, and the size/degree to which the effect would remain a hard edge vs bleed into the background image. |
//--------------------------------------------------------- // BWEffect.cs //--------------------------------------------------------- using UnityEngine; using System.Collections; [ExecuteInEditMode] public class BWEffect : MonoBehaviour { public Texture noiseTexture; public float intensity; public float linePosition; public float gradientSize; private Material material; // Creates a hidden material void Awake() { material = new Material(Shader.Find("Hidden/BWDiffuse")); } // Postprocess the image void OnRenderImage(RenderTexture source, RenderTexture destination) { if (intensity == 0) { Graphics.Blit(source, destination); return; } material.SetTexture("_NoiseTex", noiseTexture); material.SetFloat("_bwBlend", intensity); material.SetFloat("_vgLine", linePosition); material.SetFloat("_gSize", gradientSize); Graphics.Blit(source, destination, material); } } //--------------------------------------------------------- // FadeOverTime.cs //--------------------------------------------------------- using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class FadeOverTime : MonoBehaviour { public BWEffect effect; public float effectDuration; private float effectTimer = 0.0f; private bool hasStarted = false; //listening for when scene loads private void OnEnable() { SceneManager.sceneLoaded += OnSceneLoaded; } //keep the scene from freezing if you exit and return private void Start() { Time.timeScale = 1; bool ShowStartEffect = PlayerPrefs.GetInt("showBwEEffect") == 1; if (ShowStartEffect == false) { effectTimer = effectDuration; } } //if scene has loaded, proceed private void OnSceneLoaded(Scene aScene, LoadSceneMode aMode) { // start load effect hasStarted = true; } // Scales the image from 0-1 (colored-greyscale), stops the image from continuing past 1 (retarded clown colors) void Update() { if (hasStarted == false) { return; } effectTimer = effectTimer + Time.deltaTime; float value = 1 - effectTimer / effectDuration; effect.linePosition = Mathf.Clamp(value,-1,1); } } I also created a simple script to initialize animations from a randomly selected frame within the animation sheet. This allowed me to reuse animations on multiple objects within a scene without having them all move perfectly in sync. In particular, I used this for the floating blocks within each level. |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class AnimationRandomizer : MonoBehaviour { //Selects a random start frame from (0-end of animation frames) to initialize on void Start () { Animator anim = GetComponent(); AnimatorStateInfo state = anim.GetCurrentAnimatorStateInfo(0); anim.Play(state.fullPathHash, -1, Random.Range(0f, 1f)); } }
POST-MORTEM
- My time estimates were accurate for art tasks, however your tasks may sometimes rely on other people's work as well, and you account for this in estimates
- Art assets were made available early and iterated on frequently, so that none of the other disciplines were ever limited in what they could do by lack of the appropriate assets.
- I adapted quickly to using a new engine, and my first time in a team game project.
- Reaching out promptly to experts (faculty) for advice helped quickly resolve problems when we were unable to come up with solutions on our own.
- I learned the importance of not falling into the trap of becoming a "hero" and taking on too many tasks outside of a given role
- Clarify early and often what the stakeholder's expectations are