vividhelix









Level 0 Re: Semispheres - single-player co-op stealth puzzler « Reply #22 on: August 11, 2015, 06:22:55 AM » Behind The Scenes - Achieving A 2D Portal Effect



This post will explore how to achieve an effect like this:







My game started off as a ludum dare game for LD30 - Connected Worlds. It featured a single mechanic - each of the two main characters could make a noise (ping) in the identical connected world on the other side of the screen. About half of the people playing the game had a hard time grasping the concept easily, so I changed it around a bit.



I made the ping so that it works in your current world, unless you're inside a portal (in which case it will manifest in the alternate world). I tried a few implementations of the portal, including swapping the characters over to the other world but that was jarring and confusing.



I thought a lot about how to implement this, but because there were simply too many moving pieces, doing it on an item by item basis would have been extremely difficult. This brought me to a shader-based solution to this problem.



Conceptually the following shader works as a camera post-effect, just like the blur or vignette unity built-in filters work. It receives an input image (well, RenderTexture ) and has an output one with the result of the operation.





1. Shader and post-effect setup



Let start with the least useful post-effect just to prove this set-up works. Create a Camera with mostly default settings:







The most important changes are Clear Flags (so it doesn't clear the screen), make it ortographic and set its depth above the other camera(s) from your project (so it gets rendered after them). Then create a new script ( PortalEffect.cs ) with this initial code:



Code: using UnityEngine;

using UnityStandardAssets.ImageEffects;



[ExecuteInEditMode]

[RequireComponent(typeof (Camera))]

public class PortalEffect : PostEffectsBase

{

private Material portalMaterial;

public Shader PortalShader = null;



public override bool CheckResources()

{

CheckSupport(false);



portalMaterial = CheckShaderAndCreateMaterial(PortalShader, portalMaterial);



if (!isSupported)

ReportAutoDisable();

return isSupported;

}





public void OnDisable()

{

if (portalMaterial)

DestroyImmediate(portalMaterial);

}



public void OnRenderImage(RenderTexture source, RenderTexture destination)

{

if (!CheckResources() || portalMaterial == null)

{

Graphics.Blit(source, destination);

return;

}

Graphics.Blit(source, destination, portalMaterial);

}

}



Now create a new shader, PortalShader.shader with the following code:



Code: Shader "VividHelix/PortalShader" {

Properties {

_MainTex ("Base (RGB)", 2D) = "white" {}

}

SubShader {

Pass {

CGPROGRAM

#pragma vertex vert

#pragma fragment frag



#include "UnityCG.cginc"



uniform sampler2D _MainTex;



struct vertOut {

float4 pos:SV_POSITION;

};



vertOut vert(appdata_base v) {

vertOut o;

o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

return o;

}



fixed4 frag(vertOut i) : SV_Target {

return fixed4(.5,.5,.5,.1);

}

ENDCG

}

}

}



After you create the shader, don't forget to set it in the PortalShader property of the PortalEffect script.



Here's a screenshot from before the effect is active:







After activating the effect you should see this:







The grey is caused by the line fixed4(.5,.5,.5,.1) - it's a gray with 50% red, green, blue and an alpha of 1 .





2. Adding UV coordinates



Let's bring in the UV coordinates. These range from 0 to 1 . It's useful to think of this post processing effect as operating on a single screen wide quad with a texture of what the previous cameras rendered.



This new code:



Code: struct vertOut {

float4 pos:SV_POSITION;

float4 uv:TEXCOORD0;

};



vertOut vert(appdata_base v) {

vertOut o;

o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

o.uv = v.texcoord;

return o;

}



fixed4 frag(vertOut i) : SV_Target {

return tex2D(_MainTex, 1-i.uv);

}

Will create a double-flip, flipping the image both vertically and horizontally (equivalent to a 180-degree rotation):







Not exactly useful, the magic happens in the 1-i.uv part. Replacing that with just i.uv will result in this effect becoming an "identity" effect, where it doesn't really perform any changes on the source image. Doing something like return tex2D(_MainTex, float2(1-i.uv.x,i.uv.y)); will do just a horizontal (left vs right) flip:









3. Pasting another area



We can modify the shader a bit to copy over a different area of the screen by messing with the UV values:



Code: fixed4 frag(vertOut i) : SV_Target {

float2 newUV = float2(i.uv.x, i.uv.y);

if (i.uv.x < .25){

newUV.x = newUV.x + .5;

}

return tex2D(_MainTex, newUV);

}





Notice how the left quarter of the screen is overwritten. Playing with the .25 value to affect how much of the left side will be overwritten. The .5 we're adding make the x jump from 0-0.25 to 0.5-0.75 which is on the opposite side of the screen.





4. Pasting a circular area



Let's introduce a distance function to paste a circular area:



Code: if (distance(i.uv.xy, float2(.25,.75)) < .1){

newUV.x = newUV.x + .5;

}





Hmm, that ellipse could be a bit more circular. The problem here is caused by the width and height of the screen not being equal (we're effectively computing distances between 0-1 ranges). Measuring it, this ellipse's diameter height will be 20% of the screen height and its width will be 20% of the screen's width (since we're checking the radius against .1 or 10% ).





5. Pasting a circuler area revisited



To fix this problem, we need to consider the screen width and height in our distance call:



Code: fixed4 frag(vertOut i) : SV_Target {

float2 scrPos = float2(i.uv.x * _ScreenParams.x, i.uv.y * _ScreenParams.y);

if (distance(scrPos, float2(.25 * _ScreenParams.x,.75 * _ScreenParams.y)) < 50){

scrPos.x = scrPos.x + _ScreenParams.x/2;

}

return tex2D(_MainTex, float2(scrPos.x/_ScreenParams.x, scrPos.y/_ScreenParams.y));

}







6. Swapping areas



Swapping is now equivalent to performing a double swap, from one location to the other:



Code: if (distance(scrPos, float2(.25 * _ScreenParams.x,.75 * _ScreenParams.y)) < 50){

scrPos.x = scrPos.x + _ScreenParams.x/2;

}else if (distance(scrPos, float2(.75 * _ScreenParams.x,.75 * _ScreenParams.y)) < 50){

scrPos.x = scrPos.x - _ScreenParams.x/2;

}



Getting there:









7. Introducing edge fading



The transition looks rather abrupt so we can introduce a bit of fading. We can use a lerp function for that.



Starting simple:



Code: float lerpFactor=0;

if (distance(scrPos, float2(.25 * _ScreenParams.x,.75 * _ScreenParams.y)) < 50){

scrPos.x = scrPos.x + _ScreenParams.x/2;

lerpFactor = .8;

}else if (distance(scrPos, float2(.75 * _ScreenParams.x,.75 * _ScreenParams.y)) < 50){

scrPos.x = scrPos.x - _ScreenParams.x/2;

lerpFactor = .8;

}

return lerp(tex2D(_MainTex, i.uv), tex2D(_MainTex, float2(scrPos.x/_ScreenParams.x, scrPos.y/_ScreenParams.y)), lerpFactor);

This code will fade between the source and destination areas, using 80% (corresponding to the .8 ) of the newly swapped pixels:







Now let's make this fading a bit more gradual by using a distance function (and focusing on a single paste operation rather than the full swap for simplicity):



Code: float lerpFactor=0;

float2 leftPos = float2(.25 * _ScreenParams.x,.75 * _ScreenParams.y);

if (distance(scrPos, leftPos) < 50){

lerpFactor = (50-distance(scrPos, leftPos))/50;

scrPos.x = scrPos.x + _ScreenParams.x/2;

}

return lerp(tex2D(_MainTex, i.uv), tex2D(_MainTex, float2(scrPos.x/_ScreenParams.x, scrPos.y/_ScreenParams.y)), lerpFactor);

This is working, but needs a bit more tuning:









8. Edge fading with falloff



A short detour through the thought process of figuring this out. Let's say we want to fade only the outer edge of the portal with a thickness of 15 . That means we'd have to make that lerp factor be 1 for distances of 35 and under, and lerped from that 1 to a 0 value at a distance of 50 . Our distance is between 0 and 50 in this if branch. Let's create a small table to come up with the final formula:



value/formula min cut-off max distance 0 35 50 distance-35 -35 0 15 (distance-35)/15 -35/15 0 1 saturate((distance-35)/15) 0 0 1 1-saturate((distance-35)/15) 1 0 0



The saturate function is equivalent to clamp(0,1) (converting negative values to 0 ).



With the final formula of lerpFactor = 1-saturate((distance(scrPos, leftPos)-35)/15) we end up with this result:







Bringing in the full swap results in this full code:



Code: float2 leftPos = float2(.25 * _ScreenParams.x,.75 * _ScreenParams.y);

float2 rightPos = float2(.75 * _ScreenParams.x,.75 * _ScreenParams.y);

if (distance(scrPos, leftPos) < 50){

lerpFactor = 1-saturate((distance(scrPos, leftPos)-35)/15);

scrPos.x = scrPos.x + _ScreenParams.x/2;

} else if (distance(scrPos, rightPos) < 50){

lerpFactor = 1-saturate((distance(scrPos, rightPos)-35)/15);

scrPos.x = scrPos.x - _ScreenParams.x/2;

}







9. Introducing shader parameters



Our shader is almost complete, but not very useful with all those hardcoded values. We can extract them to shader parameters that can be set from code.



Extracting these values ends up in the final shader code looking like this:



Code: Shader "VividHelix/PortalShader" {

Properties {

_MainTex ("Base (RGB)", 2D) = "white" {}

_Radius ("Radius", Range (10,200)) = 50

_FallOffRadius ("FallOffRadius", Range (0,40)) = 20

_RelativePortals ("RelativePortals", Vector) = (.25,.25,.75,.75)

}

SubShader {

Pass {

CGPROGRAM

#pragma vertex vert

#pragma fragment frag



#include "UnityCG.cginc"



uniform sampler2D _MainTex;

uniform half _Radius;

uniform half _FallOffRadius;

uniform half4 _RelativePortals;



struct vertOut {

float4 pos:SV_POSITION;

float4 uv:TEXCOORD0;

};



vertOut vert(appdata_base v) {

vertOut o;

o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

o.uv = v.texcoord;

return o;

}



fixed4 frag(vertOut i) : SV_Target {

float2 scrPos = float2(i.uv.x * _ScreenParams.x, i.uv.y * _ScreenParams.y);

float lerpFactor=0;

float2 leftPos = float2(_RelativePortals.x * _ScreenParams.x,_RelativePortals.y * _ScreenParams.y);

float2 rightPos = float2(_RelativePortals.z * _ScreenParams.x,_RelativePortals.w * _ScreenParams.y);

if (distance(scrPos, leftPos) < _Radius){

lerpFactor = 1-saturate((distance(scrPos, leftPos) - (_Radius-_FallOffRadius)) / _FallOffRadius);

scrPos.x = scrPos.x + rightPos.x - leftPos.x;

scrPos.y = scrPos.y + rightPos.y - leftPos.y;

} else if (distance(scrPos, rightPos) < _Radius){

lerpFactor = 1-saturate((distance(scrPos, rightPos)- (_Radius-_FallOffRadius)) / _FallOffRadius);

scrPos.x = scrPos.x + leftPos.x - rightPos.x;

scrPos.y = scrPos.y + leftPos.y - rightPos.y;

}

return lerp(tex2D(_MainTex, i.uv), tex2D(_MainTex, float2(scrPos.x/_ScreenParams.x, scrPos.y/_ScreenParams.y)), lerpFactor);

}

ENDCG

}

}

}

With the default (non-symmetrical) values it looks like:







Those shader properties can be set from (in our case, PortalEffect.cs ) like this:



Code: public void OnRenderImage(RenderTexture source, RenderTexture destination)

{

if (!CheckResources() || portalMaterial == null)

{

Graphics.Blit(source, destination);

return;

}



portalMaterial.SetFloat("_Radius", Radius);

portalMaterial.SetFloat("_FallOffRadius", FallOffRadius);

portalMaterial.SetVector("_RelativePortals", new Vector4(.2f, .6f, .7f, .6f));

Graphics.Blit(source, destination, portalMaterial);

}



10. Finishing touches



Even with the falloff, the transition doesn't seem to look all that great. Adding some sort of border around the portal would make it look better. In an older version of the code, I was using a

particle system around it:









With the overhaul of the art style, I changed it so it's surrounded by a simple circle sprite that's rendered using the "walls on fire" shader in my previous post









11. End result



Here are a couple more gifs of the end result in action:







This post will explore how to achieve an effect like this:My game started off as a ludum dare game for LD30 - Connected Worlds. It featured a single mechanic - each of the two main characters could make a noise (ping) in the identical connected world on the other side of the screen. About half of the people playing the game had a hard time grasping the concept easily, so I changed it around a bit.I made the ping so that it works in your current world, unless you're inside a portal (in which case it will manifest in the alternate world). I tried a few implementations of the portal, including swapping the characters over to the other world but that was jarring and confusing.I thought a lot about how to implement this, but because there were simply too many moving pieces, doing it on an item by item basis would have been extremely difficult. This brought me to a shader-based solution to this problem.Conceptually the following shader works as a camera post-effect, just like the blur or vignette unity built-in filters work. It receives an input image (well,) and has an output one with the result of the operation.Let start with the least useful post-effect just to prove this set-up works. Create a Camera with mostly default settings:The most important changes are Clear Flags (so it doesn't clear the screen), make it ortographic and set its depth above the other camera(s) from your project (so it gets rendered after them). Then create a new script () with this initial code:Now create a new shader,with the following code:After you create the shader, don't forget to set it in theproperty of thescript.Here's a screenshot from before the effect is active:After activating the effect you should see this:The grey is caused by the line- it's a gray with 50% red, green, blue and an alpha ofLet's bring in the UV coordinates. These range fromto. It's useful to think of this post processing effect as operating on a single screen wide quad with a texture of what the previous cameras rendered.This new code:Will create a double-flip, flipping the image both vertically and horizontally (equivalent to a 180-degree rotation):Not exactly useful, the magic happens in thepart. Replacing that with justwill result in this effect becoming an "identity" effect, where it doesn't really perform any changes on the source image. Doing something likewill do just a horizontal (left vs right) flip:We can modify the shader a bit to copy over a different area of the screen by messing with the UV values:Notice how the left quarter of the screen is overwritten. Playing with thevalue to affect how much of the left side will be overwritten. Thewe're adding make thejump fromtowhich is on the opposite side of the screen.Let's introduce a distance function to paste a circular area:Hmm, that ellipse could be a bit more circular. The problem here is caused by the width and height of the screen not being equal (we're effectively computing distances betweenranges). Measuring it, this ellipse's diameter height will beof the screen height and its width will beof the screen's width (since we're checking the radius againstor).To fix this problem, we need to consider the screen width and height in our distance call:Swapping is now equivalent to performing a double swap, from one location to the other:Getting there:The transition looks rather abrupt so we can introduce a bit of fading. We can use a lerp function for that.Starting simple:This code will fade between the source and destination areas, using(corresponding to the) of the newly swapped pixels:Now let's make this fading a bit more gradual by using a distance function (and focusing on a single paste operation rather than the full swap for simplicity):This is working, but needs a bit more tuning:A short detour through the thought process of figuring this out. Let's say we want to fade only the outer edge of the portal with a thickness of. That means we'd have to make that lerp factor befor distances ofand under, and lerped from thatto avalue at a distance of. Our distance is betweenandin this if branch. Let's create a small table to come up with the final formula:Thefunction is equivalent to(converting negative values to).With the final formula ofwe end up with this result:Bringing in the full swap results in this full code:Our shader is almost complete, but not very useful with all those hardcoded values. We can extract them to shader parameters that can be set from code.Extracting these values ends up in the final shader code looking like this:With the default (non-symmetrical) values it looks like:Those shader properties can be set from (in our case,) like this:Even with the falloff, the transition doesn't seem to look all that great. Adding some sort of border around the portal would make it look better. In an older version of the code, I was using aparticle system around it:With the overhaul of the art style, I changed it so it's surrounded by a simple circle sprite that's rendered using the "walls on fire" shader in my previous post here . Since this is rendered before the portal swap takes place, the falloff makes it look pretty cool:Here are a couple more gifs of the end result in action: Logged Semispheres - single-player puzzler







Greenlight | @VividHelix | http://semispher.es

vividhelix









Level 0 Re: Semispheres [Unite Boston #madewithunity showcase] « Reply #31 on: September 14, 2015, 09:21:21 AM » Calgary Mini Maker Faire Post-Mortem



This weekend I had the opportunity to showcase Semispheres at Maker Faire as part of the the Calgary Game Developers section. It was an interesting experience, educational in many ways but unfortunately not very productive in terms of playtesting (which was my goal when deciding to attend).



Here's a couple of photos of the event:











It's hard to speculate on the reasons why this didn't work out that well, I'll just post some of the symptoms and leave it at that. Attendance was average. My target age group (teens and older) was mostly missing. The young kids were hogging my station content to waste 5 minutes on moving things on a screen. This is no way an indication of the quality of the event. The organization was almost flawless and it was a great event. It just wasn't a good fit for me trying to playtest my game.



Enough of that, on to what I've learned.



More reinforcement of the theory that non-gamer audiences unsurprisingly have trouble using a controller.



I shuffled and swapped out some of the levels a few times during the two days. This gave me the opportunity to playtest some of the new levels I designed recently, especially the ones employing the swap mechanic that has't seen that much play time.



The interesting piece here is that I choose to ignore some of the findings since the audience was significantly less skillful and I was being a bit aggressive in introducing mechanics to get to the new levels faster and reduce overall play time.



The best playtest sessions came from other makers. A few of them enjoyed it a lot - giving me a bit of a confidence boost after the many frustrating kids play sessions.



One of the other game devs in our group found a great resource - a paper mailing list sign-up sheet by Ultimate Chicken Horse guys found



Promotional materials also turned out really well. I went all out on the orange-cyan theme. I printed out a poster with the new concept art I got done recently. My business card (two sided - orange and light blue) were delivered to the wrong address, but then on Saturday that kind person brought them over to my house. My tie-dye t-shirts (half bright orange, half cyan) that I got make locally turned out great (got four of them with different designs). For the signup sheet I grabbed two colored crayons (orange and blue). Unfortunately I didn't take any photos of my shirt, so here's a not so great shot:







Watching people play was a lot easier now that my laptop has the same resolution as the monitor so I could mirror the screen and observe from either side.



Overall this wasn't the greatest experience. Not time fully wasted as I've met a few nice folks and I've seen a few people greatly enjoying my game. I'm undecided on whether I will attend next year, but it will definitely not be for both days.



Looking forward to Unite Boston, it's coming up really fast! This weekend I had the opportunity to showcase Semispheres at Maker Faire as part of the the Calgary Game Developers section. It was an interesting experience, educational in many ways but unfortunately not very productive in terms of playtesting (which was my goal when deciding to attend).Here's a couple of photos of the event:It's hard to speculate on the reasons why this didn't work out that well, I'll just post some of the symptoms and leave it at that. Attendance was average. My target age group (teens and older) was mostly missing. The young kids were hogging my station content to waste 5 minutes on moving things on a screen. This is no way an indication of the quality of the event. The organization was almost flawless and it was a great event. It just wasn't a good fit for me trying to playtest my game.Enough of that, on to what I've learned.More reinforcement of the theory that non-gamer audiences unsurprisingly have trouble using a controller.I shuffled and swapped out some of the levels a few times during the two days. This gave me the opportunity to playtest some of the new levels I designed recently, especially the ones employing the swap mechanic that has't seen that much play time.The interesting piece here is that I choose to ignore some of the findings since the audience was significantly less skillful and I was being a bit aggressive in introducing mechanics to get to the new levels faster and reduce overall play time.The best playtest sessions came from other makers. A few of them enjoyed it a lot - giving me a bit of a confidence boost after the many frustrating kids play sessions.One of the other game devs in our group found a great resource - a paper mailing list sign-up sheet by Ultimate Chicken Horse guys found here . This worked really well compared to previous events. I found it a very useful gauge of the engagement with the game.Promotional materials also turned out really well. I went all out on the orange-cyan theme. I printed out a poster with the new concept art I got done recently. My business card (two sided - orange and light blue) were delivered to the wrong address, but then on Saturday that kind person brought them over to my house. My tie-dye t-shirts (half bright orange, half cyan) that I got make locally turned out great (got four of them with different designs). For the signup sheet I grabbed two colored crayons (orange and blue). Unfortunately I didn't take any photos of my shirt, so here's a not so great shot:Watching people play was a lot easier now that my laptop has the same resolution as the monitor so I could mirror the screen and observe from either side.Overall this wasn't the greatest experience. Not time fully wasted as I've met a few nice folks and I've seen a few people greatly enjoying my game. I'm undecided on whether I will attend next year, but it will definitely not be for both days.Looking forward to Unite Boston, it's coming up really fast! « Last Edit: September 15, 2015, 08:10:43 AM by vividhelix » Logged Semispheres - single-player puzzler







Greenlight | @VividHelix | http://semispher.es

vividhelix









Level 0 Re: Semispheres [Unite Boston #madewithunity showcase] « Reply #32 on: September 16, 2015, 08:46:15 AM »



Here's the feedback:



Quote + Good "Show, don't tell" tutorial. Rather jump into the game and learn in-game as opposed to reading a wall of text. Even though this game probably wouldn't need a wall of text.

+ Good use of jumping back and forth with panels. At first, I was worried that it would be a bunch of symmetrical puzzles where you move both characters at the same time. Was very happen when turned out not to be the case.

+ Really happen that pickups were introduced. Adds to the variety and complexity of puzzles.

--

+- Neat visual style. Can see the potential for a lot of cool effects, "enemies"/deterrents/etc if more levels were created. It did feel a bit bland after a while, though, and would benefit from some variety or a bit more polish.

--

- No music. Really could have gotten more into it with music.

- Would really dig seeing more than alarms and portals.

- Menu controls didn't really seem to do much? I couldn't restart the game. In addition to that, it'd be nice to have a "fast" restart button.

--

I think this is a cool concept for a split controller type of game, whether it's amongst two friends, or a person playing on their own. I beat it on my own, but if you wanted to make this even more suitable for two people to play at the same time with one controller, the puzzles need to be more devastating for a single person to play on their own. Not impossible, but something much easier for a duo to encounter, instead of someone on their own. Of course, something like that will take time to play/test/etc. Just a thought for the future.

There's a lot of room for really neat puzzles and more mind complex designs. For example, it's relatively easy for players to keep control over a specific character since they're on opposite sides of the screen. However, for added complexity, maybe it would be neat to have the characters switch sides? Not from the get go, but maybe a level that caused them to be on the opposite side of the screen for a short period of time. Again, there's a large range of complexity that you can bring into this.

It'd also be nice to see a timer implemented. Something for the people who want an extra challenge. A simple timer mechanic. < 40 seconds = gold, < 60 seconds silver, etc.

There really isn't too much more to add, as it was a simple concept that you executed well. If the game is expanded upon, there's a real chance to have something special and unique.



-----

Replicas is a well made prototype, but feels very early in its development and a bit rough as a result.



The lack of sound effects or music are understandable for an early prototype, but for a Beta it must have a soundscape. Having no sound really makes the whole experience drag and feel a bit tiring. When I know I have to move my character from point A to B, and just watch the character walk for a few seconds in silence, it's roughness shows.



The visuals look clean and polished, but aren't stylistically all that interesting and a few key animations are lacking: no animation when both players enter the portal, no interesting animations when a player is caught by an AI. Sound, visual effects, and animations would help a lot with the currently very dry game feel.



The concept of the game design is okay, but feels a bit too shallow still. The puzzles are all fairly obvious or simple, and executing on them doesn't feel all the exhilarating. I'd focus on making the puzzles either more cerebral or more mechanically demanding of controlling two things at once in real time. I would cut all levels where you can complete the whole level with one side and then the other after the first 2-3 levels.



My favorite moment when playing the game was the a-ha! moment when using the portal for one character to use their beacon/homing item in the other character's world, but besides that nothing made me go "ooh!" or "aha!" A glance at the level design revealed the puzzle's solution, more or less. I think you could go deeper with these mechanics, either add another puzzle element or two, or make it more action-y with more real-time demands.



I would decrease the length of the hit-box of the enemy sentry's vision frustrums - I was consistently feeling caught at the far end of it when I thought I shouldn't have been caught. I would also increase the speed of the player character's walking and also speed up the AI to keep it the same relatively. Moving around the levels can feel a bit dull.



Keep working on it though, it's clean and a solid place to build on. Hope to see an improved version out in the world in the future! Best of luck and hope this feedback helps.

I agree with most of the feedback. The one new idea that jumps out is timed mode, which is something really interesting considering I was trying to speedrun a set of levels yesterday and it is interestingly hard.



There are plenty more "mean" levels that I've playtested showing both the "a-ha" moment and the "wait a minute" one. Graphics completely revamped. Audio added and works quite well. Hitbox size too large I agree with, it's been on my list for a while.



Unfortunately when I submitted this I included some earlier levels that didn't fully exploit the dual nature of the game. More recent playtesting with a more aggressive mechanic introduction seems to work better in terms of keeping players interested.



Now back to work... News from Indiecade, unsurprisingly I didn't get in. I'm happy though that most (all?) items in the feedback have been sorted since I submitted that build (which had the previous art style and no audio) and a limited set of levels. Also submitted under the old name - "Replicas".Here's the feedback:I agree with most of the feedback. The one new idea that jumps out is timed mode, which is something really interesting considering I was trying to speedrun a set of levels yesterday and it is interestingly hard.There are plenty more "mean" levels that I've playtested showing both the "a-ha" moment and the "wait a minute" one. Graphics completely revamped. Audio added and works quite well. Hitbox size too large I agree with, it's been on my list for a while.Unfortunately when I submitted this I included some earlier levels that didn't fully exploit the dual nature of the game. More recent playtesting with a more aggressive mechanic introduction seems to work better in terms of keeping players interested.Now back to work... Logged Semispheres - single-player puzzler







Greenlight | @VividHelix | http://semispher.es

vividhelix









Level 0 Re: Semispheres [Unite Boston #madewithunity showcase] « Reply #34 on: September 28, 2015, 08:19:50 AM » Boston Unite #madewithunity showcase post-mortem





Last week I had the opportunity to be part of the #madewithunity showcase at the Unite Boston conference. Here's how that went.





Day 0



I travelled to Boston with two friends and members of the local game dev scene. We took a red-eye from Calgary to Toronto, not before taking some time in the airport, keeping with the orange/blue theme, to play some Portal 2 co-op.

We arrived in Boston early on Sunday, one day before the actual conference. Boston is a beautiful city, we took the time to take in the sights, visit the MIT campus, then the Harvard one. After badge pick-up, we ended up at a pre-conference mixer organized by BUG - the Boston Unity Group. The venue was a bit noisy but the event was really well organized and met a bunch of really great people from all over the place. There was some game playtesting going on, talks about inter-city game jams, drinks, food and all around a good time.





Day 1



The first conference day was very interesting. During the opening presentation, the last bit of it was unveiling of the new Made With Unity (link to games section) initiative which at some point had my game up there on the big screen:







Can't really explain how that made me feel, it all seemed very surreal.



After that, I attended some of the talks which were pretty good and took some time to chat with the other #madewithunity showcase exhibitors.



More of keeping with the orange/blue theme by playing Rocket League in the hotel room after the reception was over. I won't go into how awesome Rocket League is.





Day 2



This was showcase day for Semispheres. Got there early to set up, everything went according to plan. I was very happy that I took the time to print out a sign with the game's name as the conference only provided a sign with the company name:







People visited the showcase room in waves, getting very busy between sessions and with a bit of breathing room during talks. Hard to estimate how many people played my game, maybe 50 or a bit more. The feedback was great and reassuring and a stark contrast to the last two events where I showed Semispheres. Really comforting considering this is what I consider to be my target audience.



I took a different approach this time. Normally my playtesting approach is more of the "creeping" kind, where I don't interact at all with the player during playing, rather just "creep" from somewhere behind them, while taking notes. This time though I was more engaged, trying to help people clear through the levels faster. I did this by addressing the two things that are not (yet) made clear while playing the game. The first issue is the limited range of the ping power-up, also where to use it on the first level it's introduced. The second one is the "cosmetic"/projection nature of the portals where being inside a portal doesn't actually take you to the other side, rather it just "projects" you to the other side. This is something that most people don't have a hard time understanding, but it takes a bit of time and playing a puzzle game in a public setting is already stressful for most players.



In terms of level selection, I chose about 15 minutes of gameplay (4 minutes when I speedrun it) which seemed about right, had quite a few people finish all of them. Keeping it short while showing all the different mechanics and types of gameplay was a bit of a challenge. I think the level progression was a bit abrupt, resulting in having to solve moderately difficult puzzles a few minutes into it. I'm still ok with this choice and would probably do it again.



A significant subset of the people playing the game asked if it was out already - I think this means the time taken to polish paid off. Not sure if everyone noticed the mailing list and I didn't want to push it very hard, but most people who finished the game signed up. Once again, kudos to the Ultimate Chicken Horse team for coming up with the paper mailing list sign-up sheet design.



I've had 10-15 people recognize the graphic style from my previous shader articles which was very suprising. Two of them in particular were very thankful of me writing said articles and that was really humbling. I'm still working on finding ways to better own these kinds of compliments - because I'm not a shader expert it still feels a bit weird to get recognition for shader work.



I'm conflicted about the conclusions to be drawn from this experience. On one hand, no new problems were discovered - that's good, right? On the other hand, I'd like to discover problems now rather than later - I'm sure there are still hidden problems.



My only real regret for showcase day was that it was very hectic and I didn't get a chance to check out all the other games on showcase and meet the people behind them. I also wish I had some photos of me while showcasing, but I forgot to ask my friends to take one.



Once again, I went all out with the orange/blue. I had my half orange, half blue tie-dye tshirt, pens for the mailing list subscription sheet were orange and blue, double sided business cards, even the keyboard lighting on my laptop.



Oh, did I mention I got a #madewithunity plaque? Really awesome to have my first award!









Day 3



Last day was spent in recovery mode after the last night's party. Attended a few more talks and started coming to terms with the end of the conference. The full day of showcasing, standing and talking to people was so draining I felt I had little energy to talk during the last day.





Food



Since I'm a foodie, there's a few places I want to mention. We found a froyo place at Harvard which was delicious (also my first time ever having froyo). The Japanese restaurant inside the Verb hotel was amazing. Their ramen was insanely good, we had it multiple times. I also greatly enjoyed their calf brains, breaded and crunchy on the outside. Their "Dogzilla" bacon wrapped hotdog was also really good. Next time I end up in Boston I'll definitely go there for at least one more ramen. We ended the trip with a local clam chowder, which I enjoyed despite me not being really into some types of seafood.



Overall, I don't think I've had a single bad dish while being there which says a lot.





Conclusion



Having attended Unite Vancouver in 2013, I knew Unite Boston was going to be good, but it turned out even better than expected. A bit of everything combined together to make it an amazing experience. 10/10 would Boston again! Last week I had the opportunity to be part of the #madewithunity showcase at the Unite Boston conference. Here's how that went.I travelled to Boston with two friends and members of the local game dev scene. We took a red-eye from Calgary to Toronto, not before taking some time in the airport, keeping with the orange/blue theme, to play some Portal 2 co-op.We arrived in Boston early on Sunday, one day before the actual conference. Boston is a beautiful city, we took the time to take in the sights, visit the MIT campus, then the Harvard one. After badge pick-up, we ended up at a pre-conference mixer organized by BUG - the Boston Unity Group. The venue was a bit noisy but the event was really well organized and met a bunch of really great people from all over the place. There was some game playtesting going on, talks about inter-city game jams, drinks, food and all around a good time.The first conference day was very interesting. During the opening presentation, the last bit of it was unveiling of the new Made With Unity (link to games section) initiative which at some point had my game up there on the big screen:Can't really explain how that made me feel, it all seemed very surreal.After that, I attended some of the talks which were pretty good and took some time to chat with the other #madewithunity showcase exhibitors.More of keeping with the orange/blue theme by playing Rocket League in the hotel room after the reception was over. I won't go into how awesome Rocket League is.This was showcase day for Semispheres. Got there early to set up, everything went according to plan. I was very happy that I took the time to print out a sign with the game's name as the conference only provided a sign with the company name:People visited the showcase room in waves, getting very busy between sessions and with a bit of breathing room during talks. Hard to estimate how many people played my game, maybe 50 or a bit more. The feedback was great and reassuring and a stark contrast to the last two events where I showed Semispheres. Really comforting considering this is what I consider to be my target audience.I took a different approach this time. Normally my playtesting approach is more of the "creeping" kind, where I don't interact at all with the player during playing, rather just "creep" from somewhere behind them, while taking notes. This time though I was more engaged, trying to help people clear through the levels faster. I did this by addressing the two things that are not (yet) made clear while playing the game. The first issue is the limited range of the ping power-up, also where to use it on the first level it's introduced. The second one is the "cosmetic"/projection nature of the portals where being inside a portal doesn't actually take you to the other side, rather it just "projects" you to the other side. This is something that most people don't have a hard time understanding, but it takes a bit of time and playing a puzzle game in a public setting is already stressful for most players.In terms of level selection, I chose about 15 minutes of gameplay (4 minutes when I speedrun it) which seemed about right, had quite a few people finish all of them. Keeping it short while showing all the different mechanics and types of gameplay was a bit of a challenge. I think the level progression was a bit abrupt, resulting in having to solve moderately difficult puzzles a few minutes into it. I'm still ok with this choice and would probably do it again.A significant subset of the people playing the game asked if it was out already - I think this means the time taken to polish paid off. Not sure if everyone noticed the mailing list and I didn't want to push it very hard, but most people who finished the game signed up. Once again, kudos to the Ultimate Chicken Horse team for coming up with the paper mailing list sign-up sheet design.I've had 10-15 people recognize the graphic style from my previous shader articles which was very suprising. Two of them in particular were very thankful of me writing said articles and that was really humbling. I'm still working on finding ways to better own these kinds of compliments - because I'm not a shader expert it still feels a bit weird to get recognition for shader work.I'm conflicted about the conclusions to be drawn from this experience. On one hand, no new problems were discovered - that's good, right? On the other hand, I'd like to discover problems now rather than later - I'm sure there are still hidden problems.My only real regret for showcase day was that it was very hectic and I didn't get a chance to check out all the other games on showcase and meet the people behind them. I also wish I had some photos of me while showcasing, but I forgot to ask my friends to take one.Once again, I went all out with the orange/blue. I had my half orange, half blue tie-dye tshirt, pens for the mailing list subscription sheet were orange and blue, double sided business cards, even the keyboard lighting on my laptop.Oh, did I mention I got a #madewithunity plaque? Really awesome to have my first award!Last day was spent in recovery mode after the last night's party. Attended a few more talks and started coming to terms with the end of the conference. The full day of showcasing, standing and talking to people was so draining I felt I had little energy to talk during the last day.Since I'm a foodie, there's a few places I want to mention. We found a froyo place at Harvard which was delicious (also my first time ever having froyo). The Japanese restaurant inside the Verb hotel was amazing. Their ramen was insanely good, we had it multiple times. I also greatly enjoyed their calf brains, breaded and crunchy on the outside. Their "Dogzilla" bacon wrapped hotdog was also really good. Next time I end up in Boston I'll definitely go there for at least one more ramen. We ended the trip with a local clam chowder, which I enjoyed despite me not being really into some types of seafood.Overall, I don't think I've had a single bad dish while being there which says a lot.Having attended Unite Vancouver in 2013, I knew Unite Boston was going to be good, but it turned out even better than expected. A bit of everything combined together to make it an amazing experience. 10/10 would Boston again! Logged Semispheres - single-player puzzler







Greenlight | @VividHelix | http://semispher.es

Dinosaursssssss









Level 0 Re: Semispheres [Unite Boston #madewithunity showcase post-mortem] « Reply #35 on: September 28, 2015, 09:32:15 AM » Nice, I was at Unite too and though I don't think we actually spoke, I did watch someone play for a bit while I was walking through the showcase. The game looks great, and congrats on being featured in the keynote!



You mention that the Unite crowd was your target audience, and I'm curious what you mean by that. Game developers? Something I've been thinking about a lot recently is whether I find different projects interesting, or latch onto different aspects of projects, than the majority of players; I know personally, when I'm at a show I tend to try and find out how a developer solved an interesting problem, rather than being in the mindset of 'Is this fun, and should I buy it.' So I'm curious, how was your experience demoing for a bunch of pros? How does the feedback you got compare to other what you've heard at other events? Logged @DINOSAURSSSSSSS

Ghost Lord of Ghost Lord of www.FunGhost.com

vividhelix









Level 0 Re: Semispheres [Unite Boston #madewithunity showcase post-mortem] « Reply #36 on: September 28, 2015, 02:42:05 PM » Quote from: Dinosaursssssss on September 28, 2015, 09:32:15 AM Nice, I was at Unite too and though I don't think we actually spoke, I did watch someone play for a bit while I was walking through the showcase. The game looks great, and congrats on being featured in the keynote!



You mention that the Unite crowd was your target audience, and I'm curious what you mean by that. Game developers? Something I've been thinking about a lot recently is whether I find different projects interesting, or latch onto different aspects of projects, than the majority of players; I know personally, when I'm at a show I tend to try and find out how a developer solved an interesting problem, rather than being in the mindset of 'Is this fun, and should I buy it.' So I'm curious, how was your experience demoing for a bunch of pros? How does the feedback you got compare to other what you've heard at other events?



Thanks!



I meant my target audience in a broader sense, as in "people who actually play games". My previous two showcases were in events for the general public and non-game focused audience. That made for some interesting feedback, to put it mildly



A few people were interested in the technical bits which was weird for me, I found myself blabbing away about shaders, shadows and stuff. I'll admit I greatly enjoyed that!



However, somehow I feel most people were wearing their gamer hats more than their gamedev ones, at least while playing the game.



Overall, really good event! Thanks!I meant my target audience in a broader sense, as in "people who actually play games". My previous two showcases were in events for the general public and non-game focused audience. That made for some interesting feedback, to put it mildlyA few people were interested in the technical bits which was weird for me, I found myself blabbing away about shaders, shadows and stuff. I'll admit I greatly enjoyed that!However, somehow I feel most people were wearing their gamer hats more than their gamedev ones, at least while playing the game.Overall, really good event! Logged Semispheres - single-player puzzler







Greenlight | @VividHelix | http://semispher.es