David Liu

E.C.H.O.

About the Game

E.C.H.O. is a 3D puzzle exploration game where the player must navigate by using echolocation. After waking up from cryosleep and being experimented on, you have somehow gone blind. But fortunately, you have been given an emitter that shoots sound. You somehow are now able to see sound waves bouncing off of walls, and must use this new power to find your way around the facility and escape.

Developed in Music Game Jam 2017

Play the game here!

Role in Development

  • Manager: Nathan Glick
  • Designer: David Liu, Nathan Glick
  • Programmers: David Liu, Nathan Glick
  • Music Composer: Max De George

E.C.H.O. was my first intensive game jam. This project was where I learned about the importance of scope and management the hard way. I was in charge of the core gameplay programming as well as designing about half the levels. I modified a shader for the emitter effect in order to produce the outward-growing visual effect we desired, then attached it to the collision of the projectile from the emitter.

Script Examples

BulletScript.csBulletCollision.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class bulletScript : MonoBehaviour {

    //attributes
    public GameObject bullet;
    public GameObject bullet2;
    public GameObject fpc1;
    public GameObject fpc2;
    public GameObject fpc3;
    public GameObject fpc4;
    public int bulletSpeed;
    public AudioClip fired;
    public bool EL1 = false;
    public bool EL2 = false;
    public bool ELA = false;

    // Update is called once per frame
    void Update () {
        Shoot (); //calls shoot method once per frame
    }

    /// Method for shooting bullets, checks if left mouse button is clicked, if it is, a bullet instance is created, and the bullet is propelled in the direction the player is facing
    void Shoot(){
        if (Input.GetButtonDown("Fire1") && EL1) {
            Debug.Log ("Shot");
            GameObject projectile = Instantiate (bullet, new Vector3(fpc1.transform.position.x, fpc1.transform.position.y, fpc1.transform.position.z), fpc1.transform.rotation) as GameObject;
            projectile.transform.rotation = new Quaternion (fpc1.transform.rotation.x, 90, fpc1.transform.rotation.z, fpc1.transform.rotation.w);

            projectile.GetComponent ().AddForce (fpc1.transform.forward * bulletSpeed);
        }
        if (EL2) {
            GameObject player = GameObject.Find ("Player");
            ScannerEffectDemo script = player.GetComponentInChildren ();
            script.maxDistance = 10;
            EL2 = false;
        }
        if(Input.GetButtonDown("Fire2") && ELA)
        {
            GameObject projectile2 = Instantiate(bullet2, new Vector3(fpc2.transform.position.x, fpc2.transform.position.y, fpc2.transform.position.z), fpc2.transform.rotation) as GameObject;
            projectile2.transform.rotation = new Quaternion(fpc2.transform.rotation.x, 90, fpc2.transform.rotation.z, fpc2.transform.rotation.w);

            projectile2.GetComponent().AddForce(fpc2.transform.forward * bulletSpeed);
        }
    }
}