Better Together
Better Together features 2 unique characters trapped in a series of puzzles each with complimentary abilities: Explosion + Implosion. This game emphasizes that only through cooperation can you solve some of your most pressing challenges.
Better Together is a Solo Project made in Unity with C# and controls for Xbox360 Controllers in 3 weeks with 3 levels of escalating difficulty.
Development Experience

Gameplay Mechanics

Level Design

Tutorial Design

Data Saving

*Custom Editor Scripting

SFX Design

UI
*Code Sample

With different "TriggerType" enumerators selected, different parameters appear/disappear to customize the script functionality and maintain a clean workspace.

When the IMPLOsive character enters the region of space defined by this gameobject, the Xbox360 "X" button appears for tutorial purposes.

While the EXPLOsive character is standing in this gameobject region and the "Action" button is pressed, the Wall1 gameobject will deactivate.

With different "TriggerType" enumerators selected, different parameters appear/disappear to customize the script functionality and maintain a clean workspace.
+ Improved Workflow
+ Reusable
+ Extensible
using UnityEditor;
using UnityEngine;
using System.Collections;
[CustomEditor(typeof(Activator))]
[CanEditMultipleObjects]
public abstract class Activator_Editor: Editor{
public SerializedProperty
TriggerType_Prop,
DependsOnPlayerType_Prop,
PlayerType_Prop,
InputButton_Prop,
ActivateOnTrigger_Prop,
OneOff_Prop,
Noise_Prop;
#region property names
private string triggerType = "triggerType";
private string dependsOnPlayerType = "dependsOnPlayerType";
private string playerType = "playerType";
private string inputButton = "inputButton";
private string activateOnTrigger = "activateOnTrigger";
private string oneOff = "oneOff";
private string noise = "noise";
#endregion
protected abstract void OnEnable(){
TriggerType_Prop = serializedObject.FindProperty(triggerType);
DependsOnPlayerType_Prop =
serializedObject.FindProperty(dependsOnPlayerType);
PlayerType_Prop = serializedObject.FindProperty(playerType);
InputButton_Prop = serializedObject.FindProperty(inputButton);
ActivateOnTrigger_Prop = serializedObject.FindProperty(activateOnTrigger);
OneOff_Prop = serializedObject.FindProperty(oneOff);
Noise_Prop = serializedObject.FindProperty(noise);
}
public override void OnInspectorGUI(){
serializedObject.Update();
EditorGUILayout.PropertyField(TriggerType_Prop);
#region If Player Type Matters
bool showPlayerChoice = DependsOnPlayerType_Prop.boolValue;
if (showPlayerChoice){
EditorGUILayout.PropertyField(PlayerType_Prop);
}
#endregion
EditorGUILayout.PropertyField(DependsOnPlayerType_Prop);
#region If Input Required
int triggerTypeCount = (int)TriggerType_Prop.enumValueIndex;
if (triggerTypeCount == (int)TriggerType.Input ||
triggerTypeCount == (int)TriggerType.InputAndOnTriggerStay){
EditorGUILayout.PropertyField(InputButton_Prop);
}
#endregion
EditorGUILayout.PropertyField(ActivateOnTrigger_Prop);
EditorGUILayout.PropertyField(OneOff_Prop);
EditorGUILayout.PropertyField(Noise_Prop);
serializedObject.ApplyModifiedProperties();
}
}
using UnityEditor;
using UnityEngine;
using System.Collections;
[CustomEditor(typeof(ScriptActivator))]
public class ScriptActivator_Editor : Activator_Editor {
public SerializedProperty ScriptsToActivate_Prop;
private string scriptsToActivate = "scriptsToActivate";
protected override void OnEnable(){
base.OnEnable();
ScriptsToActivate_Prop =
serializedObject.FindProperty(scriptsToActivate);
}
public override void OnInspectorGUI(){
base.OnInspectorGUI();
EditorGUILayout.PropertyField(ScriptsToActivate_Prop, true);
serializedObject.ApplyModifiedProperties();
}
}
using UnityEditor;
using UnityEngine;
using System.Collections;
[CustomEditor(typeof(ButtonActivator))]
public class ButtonActivator_Editor : Activator_Editor {
public SerializedProperty ButtonType_Prop;
private string buttonType = "buttonType";
protected override void OnEnable(){
base.OnEnable();
ButtonType_Prop =
serializedObject.FindProperty(buttonType);
}
public override void OnInspectorGUI(){
base.OnInspectorGUI();
EditorGUILayout.PropertyField(ButtonType_Prop, true);
serializedObject.ApplyModifiedProperties();
}
}
using UnityEditor;
using UnityEngine;
using System.Collections;
[CustomEditor(typeof(GameObjectActivator))]
public class GameObjectActivator_Editor : Activator_Editor {
public SerializedProperty GameObjectsToActivate_Prop;
private string gameObjectsToActivate =
"gameObjectsToActivate";
protected override void OnEnable(){
base.OnEnable();
GameObjectsToActivate_Prop =
serializedObject.FindProperty(gameObjectsToActivate);
}
public override void OnInspectorGUI(){
base.OnInspectorGUI();
EditorGUILayout.PropertyField(GameObjectsToActivate_Pro p, true);
serializedObject.ApplyModifiedProperties();
}
}
Development Experience Icons sourced from thenounproject.com and created by:
-
"Jack"
-
Jacob Eckert
-
Stephen JB Thomas
-
Michal Beno
-
useiconic.com
-
Marek Polakovic
-
Stan Diers