Search Unity

Assault Android Cactus - twin stick shoot-em-up (PC)

Discussion in 'Works In Progress - Archive' started by FlaxSycle, Apr 15, 2013.

  1. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    Haha we were in contact with Unity and provided the footage, but we didn't know how or to what extent we'd be featured.

    Yeah! Was super stoked about this! We ran into the IGN AU team at PAX, so I guess they liked the game to give it a second go!

    Thankyou! For environments, I'm not doing anything special, it's a mix of the built in shaders, with a sparing use of normal maps.

    For characters, I customised my own shaders because I had a specific look in mind, and for gameplay reasons. Here's one of the enemies showing the difference the shader makes :



    The main thing was a rim light to pull the silhouette out from the crowd and an emissive map for the enemy indicator lights. The emissive map is black and white, and tinted in the shader - this lets me fade all the enemy lights from blue to red so you can tell how many hitpoints they have left.



    The main characters use a more complicated shader - still has rim and emissive lights (for the ears, that change from green to red to indicate health) but also has normal maps and 'ambient maps'. You can see how much they brighten up the character and let me control shading colour per surface, even with a single light source. The effect isn't physically realistic in the slightest and requires an extra texture, but it gave me the feel I wanted.

    The other thing was the glass shader for the visor - the default shaders don't do clear with high specular very well, so I ended up making one which increases opacity where the shine is. It also has a rim light. Rim lights for all!
     
  2. leo3duy

    leo3duy

    Joined:
    Sep 8, 2013
    Posts:
    3
    :-D It looks great!!! Congrats and thank you for your detailed info.
     
  3. sti4thewin

    sti4thewin

    Joined:
    Apr 21, 2013
    Posts:
    31
    This is really amazing what you guys have been doing with a 3 man team.
     
  4. leo3duy

    leo3duy

    Joined:
    Sep 8, 2013
    Posts:
    3
    I played the demo and now I bought the early access on steam! The game play is great and the boss it's really insane! :D good job!
    I invite our unity dev fellows to support this project, deserve it!
    http://www.assaultandroidcactus.com/p/buy-cactus.html
     
  5. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    Thankyou! I've been doing all the game code and graphics, it takes a lot out of me, but it's very satisfying.


    Thanks! Hope you like it and continue to enjoy the updates! :)

    For the first update I hooked up Steam leaderboards (via the Ludoisty Steamworks wrapper)



    It's been pretty exciting seeing all the high scores come in! Competition has been fierce!
     
  6. Malclay

    Malclay

    Joined:
    Jun 4, 2013
    Posts:
    16
    This looks fantastic! I love twin stick shooters!! Way to go :D
     
  7. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    So a while back I started showing progress on the second boss, codename Queen. I was hoping to just build straight through and post my progress as I went but it ended up being a slightly bumpy journey with plenty of interesting detours! As a reminder, this is how she was looking




    So moving forwards, here's how her arena stage came up




    and here's how the texturing went




    and here's the finished texture, how she looks in MAX and how she looks in Unity




    there's a few more pictures and a slightly better explanation of the process over on the blog but I'm also happy to talk about stuff here!
     
  8. miguelvesga

    miguelvesga

    Joined:
    Aug 1, 2012
    Posts:
    88
    Played the demo. Looks awesome!
    Keep it up :D
     
  9. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    We released our next playable character on Steam Early Access last week and made a mini trailer to celebrate!




    she's called Aubergine, she's a plucky ship security officer. Instead of a main weapon she controls Helo, a madly spinning robot that can chop up enemies. It takes a little while to get used to, but we've had a great response from her so far. Her secondary weapon is a singularity generator that creates a black hole that pulls enemies towards it.




    Very happy with how she plays! Here is a quick working sheet of some of the sketches and designs I went through and an in progress modelling shot. Helo went through a few different ideas, originally I was thinking he'd be like a box with a little floaty part that shocked nearby enemies, or hit them with his claws, in the end I went with his ears 'opening' to reveal fire vents and spinning like a top!

     
  10. jin76

    jin76

    Joined:
    Mar 4, 2010
    Posts:
    364
    hey this looks fantastic. Your shaders are especially is fantastic.
     
  11. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    A couple of people have asked for the shaders used in the images at the top of this page. They're not anything special and mostly cobbled together from examples in the docs, but if they're useful to anyone I'm happy to share. If anyone spots that I'm doing something really stupid / expensive, let me know! Would love to improve them.

    Enemy Shader

    Code (csharp):
    1. Shader "Ramp Lit Enemy Indicator" {
    2.     Properties {
    3.         _Color ("Main Color", Color) = (1,1,1,1)
    4.         _MainTex ("Base (RGB)", 2D) = "grey" {}
    5.         _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
    6.         _Shininess ("Shininess", Range (0.01, 1)) = 0.078125
    7.         _IndicatorTex ("Indicator Lights (RGB)", 2D) = "black" {}
    8.         _Indicator ("Indicator Color", Color) = (1,1,1,1)
    9.     }
    10.      
    11.     SubShader {
    12.         Tags { "Queue" = "Geometry+2" "RenderType"="Opaque" }
    13.        
    14.         Pass {         
    15.             Tags { "LightMode" = "Always" }
    16.             AlphaTest Greater 0.0
    17.             ZWrite Off
    18.             ZTest Greater
    19.            
    20.             Color [_Indicator]
    21.         }
    22.    
    23. CGPROGRAM
    24. #pragma surface surf BlinnPhong exclude_path:prepass fullforwardshadows
    25.    
    26.         uniform float4 _Color;
    27.         uniform float4 _Indicator;
    28.         uniform half _Shininess;
    29.         uniform sampler2D _MainTex;
    30.         uniform sampler2D _IndicatorTex;
    31.        
    32.         struct Input {
    33.             float2 uv_MainTex;
    34.             float3 viewDir;
    35.         };
    36.        
    37.         void surf (Input IN, inout SurfaceOutput o) {
    38.             o.Albedo = tex2D ( _MainTex, IN.uv_MainTex).rgb * _Color;
    39.             o.Emission = tex2D ( _IndicatorTex, IN.uv_MainTex).rgb * _Indicator * 3;
    40.            
    41.             half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
    42.             o.Emission += tex2D ( _MainTex, IN.uv_MainTex).rgb * 1.0 * pow (rim, 2.5);
    43.            
    44.             o.Gloss = 1.0 - tex2D ( _IndicatorTex, IN.uv_MainTex).r;
    45.             o.Specular = _Shininess;
    46.         }
    47.    
    48. ENDCG
    49.     }
    50.    
    51.     Fallback "VertexLit"
    52. }

    Avatar Shader

    Code (csharp):
    1. Shader "Custom Ambient" {
    2.     Properties {
    3.         _Color ("Main Color", Color) = (1,1,1,1)
    4.         _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
    5.         _Shininess ("Shininess", Range (0.01, 1)) = 0.078125
    6.         _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
    7.         _AmbTex ("Ambient", 2D) = "white" {}
    8.         _BumpMap ("Bump (RGB)", 2D) = "bump" {}
    9.         _IndicatorTex ("Indicator Lights (RGB)", 2D) = "black" {}
    10.         _Indicator ("Indicator Color", Color) = (1,1,1,1)
    11.         _Glow ("Glow Color", Color) = (0,0,0,1)
    12.         _Silhouette ("Silhouette Color", Color) = (0.5, 0.5, 0.5, 1)
    13.     }
    14.      
    15.     SubShader {
    16.         Tags { "Queue" = "Geometry+3" "RenderType" = "Opaque" }
    17.        
    18.         Pass {         
    19.             Tags { "LightMode" = "Always" }
    20.             AlphaTest Greater 0.0
    21.             ZWrite Off
    22.             ZTest Greater
    23.  
    24.             Color [_Silhouette]
    25.         }
    26.                
    27. CGPROGRAM
    28. #pragma surface surf BlinnPhong noambient exclude_path:prepass fullforwardshadows
    29. #pragma target 3.0
    30.  
    31.         uniform float4 _Color;
    32.         uniform float _Shininess;
    33.         uniform float4 _Indicator;
    34.         uniform float4 _Glow;
    35.         uniform sampler2D _MainTex;
    36.         uniform sampler2D _AmbTex;
    37.         uniform sampler2D _BumpMap;
    38.         uniform sampler2D _IndicatorTex;
    39.  
    40.         struct Input {
    41.             float2 uv_MainTex;
    42.             float2 uv_BumpMap;
    43.             float3 viewDir;
    44.         };
    45.  
    46.         void surf (Input IN, inout SurfaceOutput o) {
    47.             fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
    48.             fixed4 ambTex = tex2D( _AmbTex, IN.uv_MainTex);
    49.            
    50.             half3 ambC = saturate(UNITY_LIGHTMODEL_AMBIENT * 15.0).rgb;
    51.  
    52.             o.Albedo = tex.rgb * _Color.rgb - ambTex.rgb * ambC;
    53.             o.Gloss = tex.a;
    54.             o.Specular = _Shininess;
    55.             o.Emission = tex2D ( _IndicatorTex, IN.uv_MainTex).rgb * _Indicator.rgb * 2.0;
    56.            
    57.             o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
    58.            
    59.             half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
    60.             o.Emission += ambTex.rgb * (pow (rim, 3.0) + ambC);
    61.             o.Emission += rim * 3.0 * _Glow;
    62.         }
    63.  
    64. ENDCG
    65.     }
    66.    
    67.     Fallback " Glossy", 0
    68. }
    ... now the observant might notice that I'm forcing the shaders to use forwards rendering and pushing forwards their Queue. That's so my extra pass, which just shows a solid colour, can show up whenever they go behind geometry. It works as I want it to, but I'm not happy with the mechanism, I keep trying to think of a cleaner way to do this with a post effect. What I'm getting at is if you strip that part out, you get a much simpler shader

    Enemy Shader again (no occlusion indicator)

    Code (csharp):
    1. Shader "Ramp Lit Enemy Indicator" {
    2.     Properties {
    3.         _Color ("Main Color", Color) = (1,1,1,1)
    4.         _MainTex ("Base (RGB)", 2D) = "grey" {}
    5.         _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
    6.         _Shininess ("Shininess", Range (0.01, 1)) = 0.078125
    7.         _IndicatorTex ("Indicator Lights (RGB)", 2D) = "black" {}
    8.         _Indicator ("Indicator Color", Color) = (1,1,1,1)
    9.     }
    10.      
    11.     SubShader {
    12.         Tags { "Queue" = "Geometry" "RenderType"="Opaque" }
    13.    
    14. CGPROGRAM
    15. #pragma surface surf BlinnPhong
    16.    
    17.         uniform float4 _Color;
    18.         uniform float4 _Indicator;
    19.         uniform half _Shininess;
    20.         uniform sampler2D _MainTex;
    21.         uniform sampler2D _IndicatorTex;
    22.        
    23.         struct Input {
    24.             float2 uv_MainTex;
    25.             float3 viewDir;
    26.         };
    27.        
    28.         void surf (Input IN, inout SurfaceOutput o) {
    29.             o.Albedo = tex2D ( _MainTex, IN.uv_MainTex).rgb * _Color;
    30.             o.Emission = tex2D ( _IndicatorTex, IN.uv_MainTex).rgb * _Indicator * 3;
    31.            
    32.             half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
    33.             o.Emission += tex2D ( _MainTex, IN.uv_MainTex).rgb * 1.0 * pow (rim, 2.5);
    34.            
    35.             o.Gloss = 1.0 - tex2D ( _IndicatorTex, IN.uv_MainTex).r;
    36.             o.Specular = _Shininess;
    37.         }
    38.    
    39. ENDCG
    40.     }
    41.    
    42.     Fallback "VertexLit"
    43. }
     
  12. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    Progress on the game continues! And we were just featured in the Made In Unity section which was super cool!

    We recently started implementing art for world 3, which has a glass and steel security theme to it. Lots of blue, reflective floors and videoscreen walls, that kind of thing.



    The videoscreen walls are made out of a low res texture and a repeating mask. The idea was to put various animated images on the wall, but for now the two ideas I've implemented is a music visualiser and a simple looping frame animation using a texture sheet.



    the effect works great in game, particularly with the reflections in the floor!

    So far I've dressed two of the World 3 levels, here are there before and afters

    Checkpoint


    Revolution


    There's more detail over on the blog if anyone's interested!
     
  13. jebo87

    jebo87

    Joined:
    May 11, 2012
    Posts:
    21
    WOW! This game looks amazing! i'll buy it for sure when it comes out.
     
  14. Spelle

    Spelle

    Joined:
    Jul 3, 2013
    Posts:
    41
    So fluent and dynamic! Really impressive production.
     
  15. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    Thankyou! :)

    I started working on the next enemy type, it's still rough (first pass texturing etc) but it's nice to get a model and rig to the point where I can export it, drop it in Unity and see how it looks with the other characters. I guess I've been hacking away at the game for a while now so it's moments like this that keep me motivated :)



    he's a floating enemy type, with disconnected limbs (Rayman-esque I guess :) ) and his armour plates hang off him in strips to give the cloak look. Instead of moving, he's going to teleport about, should make him feel distinct from the other enemies.

    here's a rough test animation to make sure his 'clothing' animates correctly! (because of the amount of enemies I put on screen I bake all my secondary, so I used a look-at constraint / spring controller combo to add the sway in 3DS MAX)



    I'm juggling all kinds of tasks at the moment, but I'm hoping to script his attack patterns in the next day or two.
     
  16. MattCross-CFG

    MattCross-CFG

    Joined:
    Nov 25, 2013
    Posts:
    7
    Game looks great will buy it on steam at the weekend.
     
  17. Deleted User

    Deleted User

    Guest

    Your doing a great job with this game, keep it up :)
     
  18. snowconesolid

    snowconesolid

    Joined:
    Dec 9, 2011
    Posts:
    868
    yes! so awesome! I love this enemy. Excellent job. The whole project is very well polished and you have done an amazing job since the start. Keep up the good work! :)
     
  19. shaderbytes

    shaderbytes

    Joined:
    Nov 11, 2010
    Posts:
    900
    This new enemy looks great!! The animation is top notch as well ;)
     
  20. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
  21. Cheburek

    Cheburek

    Joined:
    Jan 30, 2012
    Posts:
    384
    aww he just wants a hug!

    What do you use to make gifs like that?
     
  22. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    After a bit of trial and error my current method is to use Fraps to capture the video (since that animation is playing inside Unity) then I use VirtualDub to crop and trim the frames to the range I want and Export > Image Sequence. Then I open the sequence in Photoshop and Save for Web so I can tune the GIF settings for a good result.

    (for showing playblasts out of 3DSMAX, I use Create Preview Animation to render frames and load those into Photoshop)

    It's a little overkill for simple cases, but the nice thing about the process is it handles gameplay well and I can create 60fps GIFs.
     
  23. diegzumillo

    diegzumillo

    Joined:
    Jul 26, 2010
    Posts:
    418
    Visually this looks fantastic. And the gameplay looks very fun too! so... yeah, I got nothing constructive :p get this game released so I can buy it.
     
  24. Cheburek

    Cheburek

    Joined:
    Jan 30, 2012
    Posts:
    384
    thanks. Its a nice replacement for youtube videos when just need to show animation or something small.
     
  25. Kaze_Senshi

    Kaze_Senshi

    Joined:
    Feb 19, 2012
    Posts:
    243
    It looks awesome, nice job with those transition effects. And the bosses reminds me those bullet hell bosses :)

    Me too :(
     
  26. Foestar

    Foestar

    Joined:
    Aug 12, 2013
    Posts:
    350
    Amazing work so far. Very fun looking and impressive. I find it also great that the levels are not really all too much and yet for what little they are they seem big and detailed when in game.
     
  27. JaimeAriz12

    JaimeAriz12

    Joined:
    Mar 6, 2014
    Posts:
    28
    this looks awesome, can't wait to give it a try.
     
  28. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    Thanks :) There's only three of us and I'm doing the art and most of the code so I something I live by is to try and get a lot of value out of everything I do. The levels are pretty simple geometry wise, and a lot of the effects we do aren't anything special but we try to make up for it with clever design and making the whole thing feel like more than the sum of its parts.


    Slowly making progress on the game, we've added the next playable character, she uses a railgun and propeller mines, which are little spinning mines that launch themselves into the air and explode when enemies get close. They're really fun!




    Right now I'm still working on the next boss, he's coming along slowly but surely, has animations and attacks now!



    I wrote up another blog post about it if anyone is interested in more details!
     
  29. Alex Storm

    Alex Storm

    Joined:
    Jul 21, 2014
    Posts:
    11
    This game looks really awesome. Great work!
     
  30. Aiursrage2k

    Aiursrage2k

    Joined:
    Nov 1, 2009
    Posts:
    4,835
    Ok this is looking good
     
  31. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    Hey everyone! :) I'm still alive, still making progress on the game!

    Justice is all finished now, did a pass on his textures and dressed his stage - this is how he's looking in game, although I'm cheating a little since I moved the camera so you can see his detail better :)



    I've also added another playable character, completing our intended character roster of eight!



    She's called Peanut and her guns are the Magma Welder and a Giga Drill. The Drill is kind of cool, it locks the player into a direction and rockets them forwards doing damage to any enemies it hits. If the enemy has a lot of hitpoints, it instead gets impaled on the front and carried forwards until it hits an edge.



    At this point I'm really keen to wrap the whole game up, we've got two bosses left to build (I'm working on the next one at the moment!) and levels to art dress. It still feels a bit far away which is scary, but it's getting closer!
     
  32. OboShape

    OboShape

    Joined:
    Feb 17, 2014
    Posts:
    836
    please remove your post Jimmy, dont think its right mate. indie devs spent alot of time and effort creating titles of this calibre to try and make a few quid back..

    sounds a bit suspect anyway.

    on another note, truly well done guys, its looking amazing :) keep it up!!
     
  33. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    Thanks for watching our back! Yeah, it's hard enough making this stuff as it is without that sort of thing...

    Development continues steadily, but at a slower rate than we'd like. On a more positive note, the game is continuing to be well received (even if this isn't reflected in our Early Access sales) and we were chosen to be in the indie section of the Tokyo Game Show! Since this was a potentially once in a life time opportunity and Japan is only a short hop from Australia, we found some cheap 2 for 1 fares, crashed at a friends place, and hit the show!



    we were fortunate to have help from Playism to translate some of our front end



    Here's what it was like at the show itself - TGS is split into two business days, and two public days. The public days were absolutely bonkers!

    We recently added Infinity Drive, a new game mode where you fight escalating waves of enemies, I wrote a bigger blog post about that here, and I'm currently working on the next boss, which will coincide with Peanut being a playable character.



    work in progress of one of his later stages! Webs and exploding spiders!

    I'm glossing over a lot, but yeah, that's about where we're at! Here, have another gif!

     
  34. Aiursrage2k

    Aiursrage2k

    Joined:
    Nov 1, 2009
    Posts:
    4,835
    Are you guys going to port to ps4?
     
  35. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    yes, we already have it running on PS4 and have shown it at a few trade shows so far, but the plan is to finish porting it after we release the finished PC version.
     
  36. Aiursrage2k

    Aiursrage2k

    Joined:
    Nov 1, 2009
    Posts:
    4,835
    Can you give me a tip for the third boss. I beat all the levels but they greyed out ones and that boss. I didn't even realize that some of the levels weren't finished because I'm so used to programmer art
     
    Last edited: Oct 2, 2014
  37. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    Sure! Which phase is giving you trouble?

    The trick with all the Cactus bosses is you have to put damage on them as quickly as possible, any time they distract you from depleting their health bar, you're basically losing a war of attrition.

    With Justice, in his first phase you have to watch out for his shields which absorb damage - either strafe around to the back/sides or "thread the needle" and hit him right in the face. Also the laser fences drop powerups - you can only have three on the field at a time, but if you break a few, use them, then break a few more, it'll leave powerups on the field for phase 2, which is useful.

    In his second phase, focus on dodging his attacks while putting everything you can on him (make sure you maximise use of the secondary weapon) If you can stay alive and use powerups, this will go pretty smoothly.

    In the third stage, mine powerups by breaking the laser fences as they fall in. It gets pretty chaotic, but if you're getting knocked down a lot, focus on Shutdowns to stay safe and you should be able to make it through!

    Hope that helps!
     
  38. Aiursrage2k

    Aiursrage2k

    Joined:
    Nov 1, 2009
    Posts:
    4,835
    I only made it to the second phase with the laser girl -- and it seemed depenedant on me getting the "tiny robot" powerups. In the second phase i couldnt really figure out how to dodge his ramming attack.
     
  39. FlaxSycle

    FlaxSycle

    Joined:
    Oct 6, 2012
    Posts:
    232
    Assuming you've been slowed by his shockwave attack and don't have Accelerate/"tiny wings", the best way to dodge his run is to get a bit of distance on him and the moment he commits to a direction, immediately start moving either left or right. If you're caught too close, you can switch weapons just as he reaches you - the brief moment of invulnerability when your character gets a white edge glow is enough to get you through.
     
  40. Aiursrage2k

    Aiursrage2k

    Joined:
    Nov 1, 2009
    Posts:
    4,835
    Finally beat him and using auberine on my first time -- I was able to tank him -- though i only got a D ranking. seems like some of these androids are way better at some of the bosses then others.
     
  41. Aiursrage2k

    Aiursrage2k

    Joined:
    Nov 1, 2009
    Posts:
    4,835
    The game was featured in the steam controller ad -- seen by over 1 million people (along with the witcher3 and some other AAA games) I think unity owes AAC an apology (and thats just a reference to review tech usa).