An update from the team
Just keeping everyone in the loop, the Wind-up Giants team will be taking some time away to pursue other exciting endeavors. We will keep you all updated on any future news!
styofa doing anything
🪼

Discoholic 🪩
NASA
TVSTRANGERTHINGS
hello vonnie

❣ Chile in a Photography ❣
"I'm Dorothy Gale from Kansas"

祝日 / Permanent Vacation
taylor price

★
Sade Olutola
sheepfilms
art blog(derogatory)
Lint Roller? I Barely Know Her
Sweet Seals For You, Always

PR's Tumblrdome
YOU ARE THE REASON

blake kathryn
Monterey Bay Aquarium
seen from T1
seen from United States

seen from United States
seen from United Arab Emirates
seen from Brazil
seen from Brazil

seen from Brazil
seen from United States
seen from United Arab Emirates
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States

seen from United States
@windupgiants-blog
An update from the team
Just keeping everyone in the loop, the Wind-up Giants team will be taking some time away to pursue other exciting endeavors. We will keep you all updated on any future news!
A quick update this week showing off the striker in action! Animated by Raymond Dunster and Matthew Ramirez. All of our animations are created in Adobe Flash CS6. Follow us on Twitter! @windupgiants
NavMeshes and State Patterns
Woah, so it's been a while since we've posted anything. Well here's some progress to share!
We've had this idea of having enemies take different paths towards a target. To do this, I spent time learning about the NavMesh system in Unity, prototyping a few scenarios, and then redid the AI to work with the system.
NavMeshes
For The Big Shuffle, we need our enemies to take certain paths created at design time to get to a target, and also be able to make decisions if something interferes with their path during runtime. The NavMesh system was already there for me to try out in Unity, all I had to do was learn about it, implement it, and see if it fits our needs.
Unity has a good tutorial on how to get started with NavMeshes here and I highly recommend making a test scene to follow along. A couple issues I've come across:
No ability to modify NavMeshAgent fall/jump speed
Only one NavMeshAgent can traverse a given OffMeshLink at a time
To get around these issues, I disabled the NavMeshAgent and moved the enemy myself. You'll see a few cases in the code below where I disabled the agent whenever I wanted to take over the enemy's movement (e.g. falling, dying)
State Pattern
During the start of development, I didn't have any experience writing AI, so the code design was pretty terrible to look at and build on top of. When I started using the NavMesh system, I figured it was a good time to rewrite the AI to use the State Pattern design.
Pretty easy to look at that picture and understand what behaviours an enemy can transition to right? Yeah, I don't know why I didn't draw that up during the start of development. Following this pattern, it's also easier to look at code and see what states an enemy can transition to given its current state and also add in new states later on
That's all for this blog post, peace! - Alex
switch(currentState){
case EnemyState.IDLE:
GroundCheck();
break;
case EnemyState.GROUNDED:
if(!AttackCheck()){
agent.enabled = true;
agent.SetDestination(target.transform.position);
currentState = EnemyState.WALK;
}
break;
case EnemyState.WALK:
if(!DeathCheck() && !AttackCheck() && !ClimbCheck()){
anim.PlayWalkAnim();
agent.enabled = true;
agent.SetDestination(target.transform.position);
}
break;
case EnemyState.FALL:
agent.enabled = false;
break;
case EnemyState.CLIMB:
if(Vector2.Distance(transform.position, endLinkPos) > 0.5f){
transform.position = Vector2.MoveTowards(transform.position, endLinkPos, fallSpeed);
anim.PlayClimbAnim();
GroundCheck();
}
break;
case EnemyState.ATTACK:
if(anim.GetAttackAnimComplete() && !DeathCheck() && !AttackCheck()){
currentState = EnemyState.WALK;
}else if(anim.GetAttackAnimComplete()){
anim.PlayAttackAnim();
agent.enabled = false;
}
if(anim.GetCurrentFrame() > 22 && anim.GetCurrentFrame() < 45){
drillBox.SetActive(true);
}else{
drillBox.SetActive(false);
}
break;
case EnemyState.DEATH:
agent.enabled = false;
break;
default:
break;
}
@alexthaii , RamirezArt, @camerontoy, and RaymondDunster wishing everyone a Happy Holidays!
Hey everyone, Matthew ( ramirezart) the Art Director for the team here! Just wanted to share some new concept art for the game. Enjoy!
Object Pooling
Hey everyone,
This is Alex, the programmer on the team, and since the last update, I took a step back to look at what's been done and began working on improving some performance stats (draw calls, framerates, monitoring the Unity profiler, etc.). One thing that I had to do was get rid of all my dynamic Instantiate() and Destroy() calls when creating a bunch of enemies, projectiles, and damage text and reuse the ones I already had in order to lower the performance overhead.
Here's my class following a standard Object Pooling design pattern. The idea is to instantiate a large number of GameObjects during the Awake event, put them inside their respective pools, and turn them off. When you need a certain object, take it out of its pool, assign it whatever properties (speed, health, attack damage, etc.), and set the GameObject to be active. Once you're finished with it, be sure to return the object back to its original owner =) Feel free to modify this to your own situation and happy game-making!
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class PoolManager : MonoBehaviour {
private static PoolManager instance = null;
public static PoolManager Get(){
if(instance == null){
instance = (PoolManager)FindObjectOfType(typeof(PoolManager));
}
return instance;
}
public enum PoolObjectType {WALKER, ORB, ROOMBA, DAMAGETEXT, TURRETBULLET};
// inspector fields
public GameObject walker;
public GameObject orb;
public GameObject damageText;
public GameObject turretBullet;
// private fields
private List<GameObject> walkerPool;
private List<GameObject> orbPool;
private List<GameObject> damageTextPool;
private List<GameObject> turretBulletPool;
void Awake(){
//Create all the pools
GameObject enemiesParent = new GameObject("EnemyPool");
walkerPool = new List<GameObject>();
CreatePool(walkerPool, walker, enemiesParent.transform, 50);
orbPool = new List<GameObject>();
CreatePool(orbPool, orb, enemiesParent.transform, 50);
GameObject damageTextParent = new GameObject("DamageTextPool");
damageTextPool = new List<GameObject>();
CreatePool(damageTextPool, damageText, damageTextParent.transform, 1000);
GameObject turretBulletParent = new GameObject("TurretBulletPool");
turretBulletPool = new List<GameObject>();
CreatePool(turretBulletPool, turretBullet, turretBulletParent.transform, 20);
}
void CreatePool(List<GameObject> pool, GameObject poolObj, Transform parent, int size){
for(int i = 0; i < size; i++){
GameObject obj = Instantiate(poolObj) as GameObject;
obj.transform.parent = parent;
obj.SetActive(false);
pool.Add(obj);
}
}
public GameObject GetPoolObject(PoolObjectType poolType){
List<GameObject> pool = null;
switch(poolType){
case PoolObjectType.WALKER:
pool = walkerPool;
break;
case PoolObjectType.ORB:
pool = orbPool;
break;
case PoolObjectType.ROOMBA:
break;
case PoolObjectType.DAMAGETEXT:
pool = damageTextPool;
break;
case PoolObjectType.TURRETBULLET:
pool = turretBulletPool;
break;
}
//return first object in pool
if(pool.Count > 0){
GameObject obj = pool[0];
pool.RemoveAt(0);
return obj;
}else{
Debug.LogError("Pool is empty.");
return null;
}
}
public void AddObjectToPool(PoolObjectType poolType, GameObject obj){
switch(poolType){
case PoolObjectType.WALKER:
walkerPool.Add(obj);
break;
case PoolObjectType.ORB:
orbPool.Add(obj);
break;
case PoolObjectType.ROOMBA:
break;
case PoolObjectType.DAMAGETEXT:
damageTextPool.Add(obj);
break;
case PoolObjectType.TURRETBULLET:
turretBulletPool.Add(obj);
break;
}
obj.SetActive(false);
}
}
For this week’s peek at the game we wanted to show a bunch of new content. Not only do you finally get a glimpse of the robot enemies you'll be facing, but you also get to see the 2nd of the 4 classes you can choose from.
Introducing: The Striker!
The Striker is the Close Quarters Combat Specialist of the team. While the Striker is primarily a close range melee fighter, he does have a variety of skills at his disposal to take on any type of foe. Join us in the weeks to come as we reveal more of what The Striker can do!
A quick look at the 4 deployable items the Engineer has in her arsenal! Barrier - Absorbs enemy attacks. Mine - A proximity mine can blow enemies away. Health Beacon - Restores players shields. Turret - Destroys enemies with deadly rapid fire. Join us next week for our biggest update yet, where something brand new will be revealed!
We revealed the first of the 4 classes you can choose from in our last update, The Engineer, and so we wanted to tease a couple more tidbits of what she can do! The first, is her weapon of choice, the Shotgun. It has a modest range for her basic attack. Nothing fancy just yet. But once you've charged it, it can deal considerable damage. We will talk more about her charged attack at a later date!
The second, is her ability to deploy offensive and defensive items. Here are only a couple of the items she can deploy. On the left is a barrier that can absorb enemy attacks. On the right is a turret that can detect and fire at enemies! Each and every one of her deployables can be upgraded, but you will find out about that at another time! Join us next week for a brand new gameplay trailer using our new capture card, that will show off even more details about our game!
We got our business cards made up last week. Follow us here on Tumblr, Twitter, and Facebook to see what we're up to!
A few pieces of concept art showing off the Engineer running and aiming, and the look of our first level!
Announcing our first project - THE BIG SHUFFLE
We’re excited to share with you a behind-the-scenes look at our first game, The Big Shuffle!
The Big Shuffle is a 4-player couch, horde-mode game for the Wii U eShop. It’s set in a futuristic city with a 1920’s feel, where a rogue robot has turned the robot population against the humans.
You play as one of four classes of a special task force, to protect the city from the hordes of robots: The Striker, The Engineer, The Sniper, and The Captain.
We started working on this game near the end of July and recruited the help of our two friends, Cameron Toy and Raymond Dunster as freelancers to make us a team of 4. The game is programmed in Unity by Alex. The art is created by Matthew with the help of Raymond. And the music and sound done by Cameron with the help of Alex.
We'll have posts of artwork, videos, music, and programming tips as we continue development. Keep in touch!
Hello, we are Alex Thai and Matthew Ramirez and we're proud to officially announce our video game studio, The Wind-up Giants!
Here's a little back-story on how we got here:
We've known each other since we were kids and have always had a passion for video games. After high school, Matthew studied art at Sheridan College and became an Illustrator and Animator, and Alex studied Computer Engineering Technology and Information Technology. We briefly played around with the idea of Android game development, but we soon discovered that Unity would allow us to aim higher and build something for PCs and consoles. Near the end of 2013, we created a small game in 24 hours to give ourselves a crash course in Unity development (link here: https://db.tt/J999x7lB). Later in 2014, we learned that Nintendo had a program that allowed developers to self-publish on their digital storefront, the Wii U eShop. We sent in an application, got approved, and here we are now; working on our first game for the Wii U!
So join us on our journey and check back regularly to see what we're up to!
Twitter: https://twitter.com/windupgiants
Facebook: https://www.facebook.com/windupgiants