Skip to content

Instantly share code, notes, and snippets.

@valryon
Created April 1, 2014 09:06
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save valryon/9910583 to your computer and use it in GitHub Desktop.
Save valryon/9910583 to your computer and use it in GitHub Desktop.
Unity cheat code handler
// Copyright © 2014 Pixelnest Studio
// This file is subject to the terms and conditions defined in
// file 'LICENSE.md', which is part of this source code package.
using UnityEngine;
namespace Pixelnest
{
/// <summary>
/// Trigger an event is a cheat code is recognized
/// </summary>
/// <remarks>Based on http://blog.remibodin.fr/unity3d-konami-code/ </remarks>
public class CheatCode : MonoBehaviour
{
/// <summary>
/// Game object contacted if the code is recognized
/// </summary>
public GameObject receiver;
public string message;
/// <summary>
/// Time allowed between two valid key code press
/// </summary>
public float timeBetweenKeyPress = 1f;
/// <summary>
/// Time allowed to input the whole code
/// </summary>
public float timeForCode = 5f;
public string codeName = "Konami Code";
public KeyCode[] code = new KeyCode[]
{
KeyCode.UpArrow,
KeyCode.UpArrow,
KeyCode.DownArrow,
KeyCode.DownArrow,
KeyCode.LeftArrow,
KeyCode.RightArrow,
KeyCode.LeftArrow,
KeyCode.RightArrow,
KeyCode.B,
KeyCode.A
};
private float timeSinceStartCode = 0f, timeSinceLastKey = 0f;
private int index = 0;
private Vector2 previousPadInput;
void Update()
{
this.timeSinceLastKey += Time.deltaTime;
this.timeSinceStartCode += Time.deltaTime;
// Reset
if (this.timeSinceStartCode >= this.timeForCode || this.timeSinceLastKey >= this.timeBetweenKeyPress)
{
this.index = 0;
}
KeyCode? currentKey = null;
// The joystick support
if (Input.GetJoystickNames().Length > 0)
{
currentKey = HandleJoystick();
}
else
{
// Keyboard, only if no joystick
currentKey = HandleKeyboard();
}
TestNextKey(currentKey);
}
/// <summary>
/// Look for joystick inputs and translate into a keyboard key
/// </summary>
/// <returns></returns>
private KeyCode? HandleJoystick()
{
const float deadZone = 0.15f; // A joystick is never fully rested
KeyCode? currentKey = null;
// If this is a joystick input, translate it to a keyboard key
// Gamepad A or B
//---------------------------------------------------------------------------
bool a = false;
bool b = false;
#if UNITY_WEBPLAYER || UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX
a = Input.GetKeyDown(KeyCode.Joystick1Button0);
b = Input.GetKeyDown(KeyCode.Joystick1Button1);
#elif UNITY_STANDALONE_OSX
a = Input.GetKeyDown(KeyCode.Joystick1Button16);
b = Input.GetKeyDown(KeyCode.Joystick1Button17);
#endif
if (a)
{
return KeyCode.A;
}
if (b)
{
return KeyCode.B;
}
// Axis
//---------------------------------------------------------------------------
float x = Input.GetAxis("Horizontal");
float y = Input.GetAxis("Vertical");
// Rest?
if (Mathf.Abs(x) < deadZone && Mathf.Abs(y) < deadZone)
{
x = 0;
y = 0;
}
// Horizontal only
if (Mathf.Abs(x) > deadZone && Mathf.Abs(y) < deadZone)
{
if (previousPadInput.x == 0)
{
currentKey = x > 0 ? KeyCode.RightArrow : KeyCode.LeftArrow;
}
}
// Vertical only
else if (Mathf.Abs(y) > deadZone && Mathf.Abs(x) < deadZone)
{
if (previousPadInput.y == 0)
{
currentKey = y > 0 ? KeyCode.UpArrow : KeyCode.DownArrow;
}
}
previousPadInput.x = x;
previousPadInput.y = y;
return currentKey;
}
/// <summary>
/// Keyboard input
/// </summary>
/// <returns></returns>
private KeyCode? HandleKeyboard()
{
if (Input.anyKeyDown)
{
if (Input.GetKeyDown(this.code[index]))
{
return this.code[index];
}
}
return null;
}
/// <summary>
/// Look at the current keyboard input and the given key and see if it matchs the code
/// </summary>
/// <param name="currentKey"></param>
private void TestNextKey(KeyCode? currentKey)
{
// Valid key?
if (currentKey != null && currentKey.Value == this.code[index])
{
// Reset timer is this is the first key
if (this.index == 0)
{
this.timeSinceStartCode = 0f;
}
this.timeSinceLastKey = 0f;
this.index++;
// Complete?
if (this.index >= this.code.Length)
{
Debug.Log(codeName);
if (this.receiver != null)
{
this.receiver.SendMessage(this.message, SendMessageOptions.DontRequireReceiver);
}
this.index = 0;
}
}
// Wrong input (no input is valid)
else if (currentKey != null)
{
// Reset
this.index = 0;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment