diff --git a/README.md b/README.md index 5f15d6d..057bc8e 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,22 @@ # ICS4U Personal Coding Project ## Objective -State the objective of the project +The objective of this project is to learn how to use C# to a high degree of understanding and to implement these learned concepts into a Unity project. ## Technical Requirements +Mouse, keyboard, internet connection in order to download the project, monitor and speaker for both audio and visual elements of the game. + ### Knowledge +An understanding of the C# language and the Unity engine, particularly the NavMeshAgent, GUI functions and the other useful built in unity functions. + ### Hardware +A PC or mac + ### Required Software +Executable project file, IDE capable of opening up C# documents. Microsoft's Visual Studio is recommended. ## Install and Set Up -Outline the steps required to install and run your project +Download everything from the dropbox link provided and run test.exe + -## Usage -Outline anything the user needs to know to use your application diff --git a/Scripts/BarScript.cs b/Scripts/BarScript.cs new file mode 100644 index 0000000..133d097 --- /dev/null +++ b/Scripts/BarScript.cs @@ -0,0 +1,37 @@ +using UnityEngine; +using System.Collections; +using UnityEngine.UI; + +public class BarScript : MonoBehaviour { + + public WepScript wpScript; + public WepShotgun wpShotgun; + public WepMelee wpMelee; + public WepMarker wpMarker; + + [SerializeField] + private float fillAmount = 1; + + [SerializeField] + private Image content; + + + + // Use this for initialization + void Start () { + + } + + // Update is called once per frame + void Update () { + HandleBar (); + } + + private void HandleBar(){ + if (wpScript.currentWeapon == 2){ + content.fillAmount = (wpShotgun.currRounds / (float)wpShotgun.magazineSize); + } else if (wpScript.currentWeapon == 3){ + content.fillAmount = (wpMarker.currRounds / (float)wpMarker.totalAmmo); + } + } +} diff --git a/Scripts/BarScript.cs.meta b/Scripts/BarScript.cs.meta new file mode 100644 index 0000000..f55a174 --- /dev/null +++ b/Scripts/BarScript.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 10b87888d16a9ef4aa713ceeed1748c5 +timeCreated: 1462749984 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Crosshair.cs b/Scripts/Crosshair.cs new file mode 100644 index 0000000..2365279 --- /dev/null +++ b/Scripts/Crosshair.cs @@ -0,0 +1,9 @@ +using UnityEngine; +using System.Collections; + +public class Crosshair : MonoBehaviour { + + void OnGUI(){ + GUI.Box(new Rect((Screen.width/2) - 5,(Screen.height/2) - 5, 10, 10), ""); + } +} diff --git a/Scripts/Crosshair.cs.meta b/Scripts/Crosshair.cs.meta new file mode 100644 index 0000000..9c85f7d --- /dev/null +++ b/Scripts/Crosshair.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 17949abae4f5d73499147744d6c688dd +timeCreated: 1461028644 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/DestroyCubes.cs b/Scripts/DestroyCubes.cs new file mode 100644 index 0000000..4b54ef5 --- /dev/null +++ b/Scripts/DestroyCubes.cs @@ -0,0 +1,34 @@ +using UnityEngine; +using System.Collections; + +public class DestroyCubes : MonoBehaviour +{ + public GameObject enemySphere; + void Start(){ + + } + + void OnCollisionEnter (Collision col) + { + if (col.gameObject.tag == "Enemy") { + EnemyHealthScript ehs = col.gameObject.GetComponent (); + ehs.health -= 1; + GameObject bhole = Instantiate (enemySphere, this.gameObject.transform.position, this.gameObject.transform.rotation) as GameObject; + bhole.transform.parent = col.gameObject.transform; + + Destroy (this.gameObject); + + } else if (col.gameObject.tag == "Terrain" || col.gameObject.tag == "Untagged") { + + Destroy (this.gameObject); + + } + else if (col.gameObject.tag == "Wall") { + + Destroy (this.gameObject); + + } + + + } +} \ No newline at end of file diff --git a/Scripts/DestroyCubes.cs.meta b/Scripts/DestroyCubes.cs.meta new file mode 100644 index 0000000..b8c8da5 --- /dev/null +++ b/Scripts/DestroyCubes.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 749c26872246172408697bc758933ca4 +timeCreated: 1460687321 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/EnemyHealthScript.cs b/Scripts/EnemyHealthScript.cs new file mode 100644 index 0000000..56df103 --- /dev/null +++ b/Scripts/EnemyHealthScript.cs @@ -0,0 +1,27 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +public class EnemyHealthScript : MonoBehaviour { + public int health; + + // Use this for initialization + void Start () { + } + + // Update is called once per frame + void Update () { + if (health < 1) { + foreach (Transform child in this.transform) { + Destroy (child.gameObject); + } + Destroy (this.gameObject); + } + + + + } + + + +} diff --git a/Scripts/EnemyHealthScript.cs.meta b/Scripts/EnemyHealthScript.cs.meta new file mode 100644 index 0000000..39f7640 --- /dev/null +++ b/Scripts/EnemyHealthScript.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f6902b04818fa5f43bac193a3dd2fb33 +timeCreated: 1462916283 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/GlowOn.cs b/Scripts/GlowOn.cs new file mode 100644 index 0000000..9081ac3 --- /dev/null +++ b/Scripts/GlowOn.cs @@ -0,0 +1,41 @@ +using UnityEngine; +using System.Collections; + +public class GlowOn : MonoBehaviour { + public int lightOn = -1; + public Material matWhite; + public Material matBlack; + public float targetTimeDuration = 2.0f; + public float timeCounter = 0.0f; + + // Use this for initialization + void Start () { + + } + + void Update() { + + if (lightOn == -1) { + GetComponent ().material = matBlack; + } else if (lightOn == 1) { + GetComponent ().material = matWhite; + } + if (timeCounter > targetTimeDuration) { + lightOn = -1; + timeCounter = 0; + + } + timeCounter += Time.deltaTime; + } + + void OnCollisionEnter (Collision col){ + if (col.gameObject.tag == "Projectile") { + lightOn *= -1; + timeCounter = 0; + } else if (col.gameObject.tag == "Player") { + lightOn = 1; + timeCounter = 0; + + } + } +} diff --git a/Scripts/GlowOn.cs.meta b/Scripts/GlowOn.cs.meta new file mode 100644 index 0000000..b3dfafc --- /dev/null +++ b/Scripts/GlowOn.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 699264f69f3b97646913b598619fd251 +timeCreated: 1462490918 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/RigidbodyFPSWalker.cs b/Scripts/RigidbodyFPSWalker.cs new file mode 100644 index 0000000..f87a947 --- /dev/null +++ b/Scripts/RigidbodyFPSWalker.cs @@ -0,0 +1,148 @@ +using UnityEngine; +using System.Collections; + +[RequireComponent (typeof (Rigidbody))] +[RequireComponent (typeof (CapsuleCollider))] + +public class RigidbodyFPSWalker : MonoBehaviour{ + + public float speed = 10.0f; + public float gravity = 10.0f; + public float maxVelocityChange = 10.0f; + public bool canJump = true; + public float jumpHeight = 2.0f; + public float thrust = 4; + public float limit = 1.0f; + public float chaseLimit; + public Rigidbody jetpackUser; + public bool isJumping = false; + public float regenFactor = 4f; + public float deprecFactor = 2f; + private bool grounded = false; + private bool isFlying = false; + private bool inAir = false; + private bool gotFuel = true; + private float chaseThrust; + + public float air_accelerate = 5f; + public float ground_accelerate = 10f; + public float max_velocity_air = 20f; + public float max_velocity_ground = 5f; + public float friction = 0.5f; + + + void Awake () { + GetComponent().freezeRotation = true; + GetComponent().useGravity = false; + } + + void Start(){ + chaseLimit = limit; + chaseThrust = thrust; + } + + void FixedUpdate () { + EnemyAI.targetPosition = transform.position; + if (isJumping || inAir) { + inAir = true; + grounded = false; + } else { + inAir = false; + grounded = true; + } + JetpackFuel (); + Jetpack (); + + + if (grounded || inAir || isJumping) { + // Calculate how fast we should be moving + Vector3 targetVelocity = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); + targetVelocity = transform.TransformDirection(targetVelocity); + targetVelocity *= speed; + + // Apply a force that attempts to reach our target velocity + Vector3 velocity = GetComponent().velocity; + Vector3 velocityChange = (targetVelocity - velocity); + velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange); + velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange); + velocityChange.y = 0; + GetComponent().AddForce(velocityChange, ForceMode.VelocityChange); + + + if (canJump && Input.GetButtonDown ("Jump") && grounded) { + GetComponent ().velocity = new Vector3 (velocity.x, CalculateJumpVerticalSpeed (), velocity.z); + isJumping = true; + } + else if (inAir && Input.GetButton("Jump")) { + isJumping = true; + } + else { + isJumping = false; + } + + } + + + // We apply gravity manually for more tuning control + GetComponent().AddForce(new Vector3 (0, -gravity * GetComponent().mass, 0)); + grounded = false; + } + + + void OnCollisionStay (Collision col) { + if (col.gameObject.tag == "Terrain" || col.gameObject.tag == "Wood") { + grounded = true; + inAir = false; + } + } + + void JetpackFuel() { + bool fullTank = false; + + if (chaseLimit < 0) { + gotFuel = false; + fullTank = false; + chaseLimit = 0; + } else if (chaseLimit == limit) { + fullTank = true; + gotFuel = true; + } else { + gotFuel = true; + fullTank = false; + } + + if (isFlying) { + chaseLimit -= Time.deltaTime / (deprecFactor / 2f); + } else if (!fullTank && (grounded || Input.GetButtonDown("Jump"))) { + + if (limit - chaseLimit <= 0.01f) { + chaseLimit = limit; + } else { + chaseLimit += Time.deltaTime / regenFactor; + } + + } + + } + + void Jetpack() { + Vector3 velocity = GetComponent().velocity; + float jumpSpeed = 1f; + if (Input.GetButton ("Fire2") && gotFuel && chaseLimit > 0) { + jumpSpeed = thrust * chaseLimit; + jetpackUser.velocity = new Vector3 (velocity.x, jumpSpeed, velocity.z); + inAir = true; + isFlying = true; + } else { + + isFlying = false; + } + + } + + float CalculateJumpVerticalSpeed () { + // From the jump height and gravity we deduce the upwards speed + // for the character to reach at the apex. + return Mathf.Sqrt(2 * jumpHeight * gravity); + } +} \ No newline at end of file diff --git a/Scripts/RigidbodyFPSWalker.cs.meta b/Scripts/RigidbodyFPSWalker.cs.meta new file mode 100644 index 0000000..72850d1 --- /dev/null +++ b/Scripts/RigidbodyFPSWalker.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 91ae6f52095ccd3458f638a286f5f982 +timeCreated: 1460666867 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/SimpleSmoothMouseLook.cs b/Scripts/SimpleSmoothMouseLook.cs new file mode 100644 index 0000000..7c0deb0 --- /dev/null +++ b/Scripts/SimpleSmoothMouseLook.cs @@ -0,0 +1,80 @@ +using UnityEngine; + +// Very simple smooth mouselook modifier for the MainCamera in Unity +// by Francis R. Griffiths-Keam - www.runningdimensions.com + +[AddComponentMenu("Camera/Simple Smooth Mouse Look ")] +public class SimpleSmoothMouseLook : MonoBehaviour +{ + Vector2 _mouseAbsolute; + Vector2 _smoothMouse; + + public Vector2 clampInDegrees = new Vector2(360, 180); + public bool lockCursor; + public Vector2 sensitivity = new Vector2(2, 2); + public Vector2 smoothing = new Vector2(3, 3); + public Vector2 targetDirection; + public Vector2 targetCharacterDirection; + + // Assign this if there's a parent object controlling motion, such as a Character Controller. + // Yaw rotation will affect this object instead of the camera if set. + public GameObject characterBody; + + void Start() + { + // Set target direction to the camera's initial orientation. + targetDirection = transform.localRotation.eulerAngles; + + // Set target direction for the character body to its inital state. + if (characterBody) targetCharacterDirection = characterBody.transform.localRotation.eulerAngles; + } + + void Update() + { + // Ensure the cursor is always locked when set + Screen.lockCursor = lockCursor; + + // Allow the script to clamp based on a desired target value. + var targetOrientation = Quaternion.Euler(targetDirection); + var targetCharacterOrientation = Quaternion.Euler(targetCharacterDirection); + + // Get raw mouse input for a cleaner reading on more sensitive mice. + var mouseDelta = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y")); + + // Scale input against the sensitivity setting and multiply that against the smoothing value. + mouseDelta = Vector2.Scale(mouseDelta, new Vector2(sensitivity.x * smoothing.x, sensitivity.y * smoothing.y)); + + // Interpolate mouse movement over time to apply smoothing delta. + _smoothMouse.x = Mathf.Lerp(_smoothMouse.x, mouseDelta.x, 1f / smoothing.x); + _smoothMouse.y = Mathf.Lerp(_smoothMouse.y, mouseDelta.y, 1f / smoothing.y); + + // Find the absolute mouse movement value from point zero. + _mouseAbsolute += _smoothMouse; + + // Clamp and apply the local x value first, so as not to be affected by world transforms. + if (clampInDegrees.x < 360) + _mouseAbsolute.x = Mathf.Clamp(_mouseAbsolute.x, -clampInDegrees.x * 0.5f, clampInDegrees.x * 0.5f); + + var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right); + transform.localRotation = xRotation; + + // Then clamp and apply the global y value. + if (clampInDegrees.y < 360) + _mouseAbsolute.y = Mathf.Clamp(_mouseAbsolute.y, -clampInDegrees.y * 0.5f, clampInDegrees.y * 0.5f); + + transform.localRotation *= targetOrientation; + + // If there's a character body that acts as a parent to the camera + if (characterBody) + { + var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, characterBody.transform.up); + characterBody.transform.localRotation = yRotation; + characterBody.transform.localRotation *= targetCharacterOrientation; + } + else + { + var yRotation = Quaternion.AngleAxis(_mouseAbsolute.x, transform.InverseTransformDirection(Vector3.up)); + transform.localRotation *= yRotation; + } + } +} diff --git a/Scripts/SimpleSmoothMouseLook.cs.meta b/Scripts/SimpleSmoothMouseLook.cs.meta new file mode 100644 index 0000000..8a01e1f --- /dev/null +++ b/Scripts/SimpleSmoothMouseLook.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4abee239d759e954cad91dca3f68c34d +timeCreated: 1460667588 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Teleporter.cs b/Scripts/Teleporter.cs new file mode 100644 index 0000000..a725181 --- /dev/null +++ b/Scripts/Teleporter.cs @@ -0,0 +1,15 @@ +using UnityEngine; +using System.Collections; + +public class Teleporter : MonoBehaviour { + public Transform target; + public float x; + public float y; + public float z; + + void OnCollisionEnter (Collision col) { + if (col.gameObject.tag == "Player") { + col.gameObject.transform.position = target.position + new Vector3(x, y, z); + } + } +} diff --git a/Scripts/Teleporter.cs.meta b/Scripts/Teleporter.cs.meta new file mode 100644 index 0000000..edb40fb --- /dev/null +++ b/Scripts/Teleporter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6b126f0fc7ce5fa489fc7269b8674815 +timeCreated: 1465939474 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/WepMarker.cs b/Scripts/WepMarker.cs new file mode 100644 index 0000000..68a792b --- /dev/null +++ b/Scripts/WepMarker.cs @@ -0,0 +1,51 @@ +using UnityEngine; +using System.Collections; + +public class WepMarker : MonoBehaviour { + + public GameObject enemy; + public Rigidbody projectile; + public float speed = 40f; + public float shootDelay = 0.5f; + public int currRounds = 90; + public int totalAmmo = 90; + public float timeAlive = 2f; + public float gunSpread = 20f; + public float tilt = 1f; + public float reloadTime = 1f; + public CrosshairControl ccobject; + private float counter = 0.0f; + private bool reloading = false; + private int currentWeapon = 1; + + + // Update is called once per frame + public void FixedUpdate () + { + + if (!reloading && Input.GetButton ("Fire1") && counter > shootDelay && currRounds > 0) { + + Bullet (); + //ccobject.PlayAnim (); + currRounds -= 1; + counter = 0; + } + Debug.Log (currRounds); + counter += Time.deltaTime; + } + + + + void Bullet () + { + + Vector3 toZero = transform.TransformPoint (0, 0, 1f); + + //var diagonalSpeed = Mathf.Pow(((speed * speed)/ 2), (0.5f)); + + Rigidbody instantiatedProjectile = Instantiate (projectile, toZero, transform.rotation)as Rigidbody; + instantiatedProjectile.velocity = transform.TransformDirection (new Vector3 (0, tilt, speed)); + + Destroy (instantiatedProjectile.gameObject, timeAlive); + } +} diff --git a/Scripts/WepMarker.cs.meta b/Scripts/WepMarker.cs.meta new file mode 100644 index 0000000..ba69579 --- /dev/null +++ b/Scripts/WepMarker.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fd1c6eb5305fb0c4a81c30d3d95f2dcb +timeCreated: 1465865309 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/WepMelee.cs b/Scripts/WepMelee.cs new file mode 100644 index 0000000..dcb0930 --- /dev/null +++ b/Scripts/WepMelee.cs @@ -0,0 +1,26 @@ +using UnityEngine; +using System.Collections; + +public class WepMelee : MonoBehaviour { + //public GameObject enemy; + public GameObject cylinder; + + void Start(){ + + } + + // Update is called once per frame + public void Update () { + if (Input.GetButton ("Fire1")) { + Attack (); + } + } + + + void Attack(){ + GameObject cyl = Instantiate (cylinder, transform.position, transform.rotation) as GameObject; + cyl.transform.parent = transform; + cyl.GetComponent ().Stab (); + + } +} diff --git a/Scripts/WepMelee.cs.meta b/Scripts/WepMelee.cs.meta new file mode 100644 index 0000000..362e70d --- /dev/null +++ b/Scripts/WepMelee.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f8042e0b9277da342bacffe72d95d5b2 +timeCreated: 1465866043 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/WepScript.cs b/Scripts/WepScript.cs new file mode 100644 index 0000000..70cbf7e --- /dev/null +++ b/Scripts/WepScript.cs @@ -0,0 +1,34 @@ +using UnityEngine; +using System.Collections; + +public class WepScript : MonoBehaviour +{ + public GameObject enemy; + public Rigidbody projectile; + public WepShotgun shotgun; + public WepMarker marker; + public WepMelee melee; + public int currentWeapon = 2; + + + // Update is called once per frame + void Update () + { + if (Input.GetKeyDown (KeyCode.Alpha1)) { + currentWeapon = 1; + } else if (Input.GetKeyDown (KeyCode.Alpha2)) { + currentWeapon = 2; + } else if (Input.GetKeyDown (KeyCode.Alpha3)) { + currentWeapon = 3; + } + + if (currentWeapon == 1) { + melee.Update (); + } else if (currentWeapon == 2) { + shotgun.FixedUpdate (); + } else if (currentWeapon == 3) { + marker.FixedUpdate (); + } + } + +} \ No newline at end of file diff --git a/Scripts/WepScript.cs.meta b/Scripts/WepScript.cs.meta new file mode 100644 index 0000000..4d8d309 --- /dev/null +++ b/Scripts/WepScript.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 27f52469ad18753488a34ea992e96b20 +timeCreated: 1460669825 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/WepShotgun.cs b/Scripts/WepShotgun.cs new file mode 100644 index 0000000..4e8199d --- /dev/null +++ b/Scripts/WepShotgun.cs @@ -0,0 +1,84 @@ +using UnityEngine; +using System.Collections; + +public class WepShotgun : MonoBehaviour { + + public GameObject enemy; + public Rigidbody projectile; + public float speed = 40f; + public float shootDelay = 0.5f; + public int magazineSize = 3; + public int currRounds = 3; + public int totalAmmo = 90; + public float timeAlive = 2f; + public float gunSpread = 20f; + public float tilt = 1f; + public float reloadTime = 1f; + private float counter = 0.0f; + private bool reloading = false; + private int currentWeapon = 1; + public CrosshairControl ccobject; + + // Update is called once per frame + public void FixedUpdate () + { + + if (!reloading && Input.GetButton ("Fire1") && counter > shootDelay && currRounds > 0) { + ShottyBullet (); + //ccobject.PlayAnim (); + currRounds -= 1; + counter = 0; + } else if (Input.GetButtonDown ("Reload")) + { + reloading = true; + Invoke("Reload", reloadTime); + } + Debug.Log (currRounds); + counter += Time.deltaTime; + } + + void Reload () + { + int difference = magazineSize - currRounds; + if (totalAmmo - difference >= 0) { + currRounds += difference; + totalAmmo -= difference; + } else if (totalAmmo - difference < 0) { + currRounds = totalAmmo; + totalAmmo = 0; + } + Debug.Log ("Total: " + totalAmmo); + reloading = false; + } + + + void ShottyBullet () + { + Debug.Log (transform.position + " " + transform.rotation); + + Vector3 toZero = transform.TransformPoint (0, -0.3f, 1f); + Vector3 toRight = transform.TransformPoint (0.1f, -0.3f, 1f); + Vector3 toLeft = transform.TransformPoint (-0.1f, -0.3f, 1f); + + float zRightBullet = speed * Mathf.Cos(gunSpread * (Mathf.PI/180)); + float xRightBullet = speed * Mathf.Sin(gunSpread * (Mathf.PI/180)); + + + //var diagonalSpeed = Mathf.Pow(((speed * speed)/ 2), (0.5f)); + + Rigidbody instantiatedProjectile = Instantiate (projectile, toZero, transform.rotation)as Rigidbody; + instantiatedProjectile.velocity = transform.TransformDirection (new Vector3 (0, tilt, speed)); + + Rigidbody instantiatedProjectileRight = Instantiate (projectile, toRight, transform.rotation)as Rigidbody; + instantiatedProjectileRight.velocity = transform.TransformDirection (new Vector3 (xRightBullet, tilt, zRightBullet)); + + Rigidbody instantiatedProjectileLeft = Instantiate (projectile, toLeft, transform.rotation)as Rigidbody; + instantiatedProjectileLeft.velocity = transform.TransformDirection (new Vector3 (-xRightBullet, tilt, zRightBullet)); + + Destroy (instantiatedProjectile.gameObject, timeAlive); + Destroy (instantiatedProjectileRight.gameObject, timeAlive); + Destroy (instantiatedProjectileLeft.gameObject, timeAlive); + + + } +} diff --git a/Scripts/WepShotgun.cs.meta b/Scripts/WepShotgun.cs.meta new file mode 100644 index 0000000..6daf8a1 --- /dev/null +++ b/Scripts/WepShotgun.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 496edd1e190b9314a89a1d4cc9319f8d +timeCreated: 1465865289 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VScripts/BulletHole.cs b/VScripts/BulletHole.cs new file mode 100644 index 0000000..8c36574 --- /dev/null +++ b/VScripts/BulletHole.cs @@ -0,0 +1,28 @@ +using UnityEngine; +using System.Collections; + +public class BulletHole : MonoBehaviour { + public static int numOfHoles = 0; + private float counter = 0; + private float timeToDestroy = 5; + + // Use this for initialization + void Start () + { + + } + + // Update is called once per frame + void Update () + { + counter += Time.deltaTime; + if (counter >= timeToDestroy) + { + Destroy(this.gameObject); + } + if (WoodDestruction.woodDestroy == true) + { + Destroy(this.gameObject); + } + } +} diff --git a/VScripts/BulletHole.cs.meta b/VScripts/BulletHole.cs.meta new file mode 100644 index 0000000..16d16c3 --- /dev/null +++ b/VScripts/BulletHole.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c8e6962465f9882499ee4d76ea37b4a0 +timeCreated: 1461328556 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VScripts/Bulletz.cs b/VScripts/Bulletz.cs new file mode 100644 index 0000000..61b530e --- /dev/null +++ b/VScripts/Bulletz.cs @@ -0,0 +1,99 @@ +using UnityEngine; +using System.Collections; + +public class Bulletz : MonoBehaviour +{ + + public Rigidbody rb; + public float secondsToDestroy = 5; + public float speed = 2f; + public GameObject bullethole; + private float counter = 0; + + + + // Use this for initialization + void Start() + { + rb = gameObject.GetComponent (); + } + + // Update is called once per frame + void FixedUpdate() + { + counter += Time.deltaTime; + transform.Translate(0, 0, speed); + RaycastHit hit; + Ray ray = new Ray(transform.position, transform.forward); + if (Physics.Raycast(ray, out hit, 3f)) + { + if (hit.collider.tag == "Enemy") + { + rb.isKinematic = true; + // sets trigger in EnemyAI.cs + if (speed == 2) + { + EnemyAI.initialHit = true; + } + } + else if (hit.collider.tag == "Wood" || hit.collider.tag == "WoodBelow") + { + if (speed == 2) + { + // sets trigger in WoodDestruction to ensure bullet does not increase destruction stage of two walls at the same time + + WoodDestruction.initialHit = true; + WoodDestruction.hitWoodAbove = false; + } + if (speed >= 0) + { + GameObject bhole = Instantiate(bullethole, hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)) as GameObject; + bhole.transform.parent = hit.collider.gameObject.transform; + speed -= 0.25f; + } + } + else if (hit.collider.tag == "WoodAbove") + { + + if (speed == 2) + { + // sets trigger in WoodDestruction to ensure bullet does not increase destruction stage of two walls at the same time + WoodDestruction.initialHit = true; + WoodDestruction.hitWoodAbove = true; + + } + if (speed >= 0) + { + GameObject bhole = Instantiate(bullethole, hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)) as GameObject; + speed -= 0.25f; + } + } + + else if (hit.collider.tag == "Debris") + { + if (woodDebris.settled == true) + { + Destroy(this.gameObject); + GameObject bhole = Instantiate(bullethole, hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)) as GameObject; + } + } + else + { + GameObject bhole = Instantiate(bullethole, hit.point, Quaternion.FromToRotation(Vector3.up, hit.normal)) as GameObject; + Destroy(this.gameObject); + // trigger to set woodDestroy false so that bulletholes can be made again + WoodDestruction.woodDestroy = false; + } + } + // ensures that too many bullets do not clog up memory + if (counter > secondsToDestroy) + { + Destroy(this.gameObject); + } + // ensure no bullet bounceback behaviour + if (speed < 0) + { + Destroy(this.gameObject); + } + } +} diff --git a/VScripts/Bulletz.cs.meta b/VScripts/Bulletz.cs.meta new file mode 100644 index 0000000..737b194 --- /dev/null +++ b/VScripts/Bulletz.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 99301cd233fa5e441b0a8387fedb847e +timeCreated: 1460684160 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VScripts/CeilingDestruction.cs b/VScripts/CeilingDestruction.cs new file mode 100644 index 0000000..b05f38d --- /dev/null +++ b/VScripts/CeilingDestruction.cs @@ -0,0 +1,15 @@ +using UnityEngine; +using System.Collections; + +public class CeilingDestruction : MonoBehaviour { + + // Use this for initialization + void Start () { + + } + + // Update is called once per frame + void Update () { + + } +} diff --git a/VScripts/CeilingDestruction.cs.meta b/VScripts/CeilingDestruction.cs.meta new file mode 100644 index 0000000..8914844 --- /dev/null +++ b/VScripts/CeilingDestruction.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6098069fb1347e94c9c9fd8b6a519854 +timeCreated: 1465913806 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VScripts/EnemyAI.cs b/VScripts/EnemyAI.cs new file mode 100644 index 0000000..c2db1b6 --- /dev/null +++ b/VScripts/EnemyAI.cs @@ -0,0 +1,199 @@ +using UnityEngine; +using System.Collections; + + +public class EnemyAI : MonoBehaviour +{ + NavMeshAgent agent; + public Transform target; + public static Vector3 targetPosition; + // AI movespeed on beeline mode, regular movespeed = 3.5 (nav mesh agent speed) + public float moveSpeed = 1.5f; + public static bool initialHit = false; + public static bool enemyHit = false; + [SerializeField]private float wanderDist = 100; + //--- AI states ---// + [SerializeField]private bool wander = true; // default state + [SerializeField]private bool chase = false; // underlying state, if all other states are false will chase, as the nav mesh agent takes over + [SerializeField]private bool scared = false; // hurt state + [SerializeField]private bool manualMovement = false; // dumb, beeline state + //-----------------// + public float health = 100; + [SerializeField]private float stamina = 100; + private bool sight = false; + private float rotationSpeed = 1.5f; + private float hitCooldown = 0; + private float hitCountdown = 1.5f; + private float runBoredomCounter = 7; + private float currentRunBoredom = 0; + private float sightTimer = 0; + private float sightMinimum = 2; + + // Use this for initialization + void Start() + { + // setting up handle to refer to nav mesh agent, or smart AI component + agent = GetComponent(); + } + + // Update is called once per frame + void Update() + { + hitCooldown += Time.deltaTime; + agent.SetDestination(targetPosition); + + // raycast to detect for player to hit + RaycastHit hit; + Ray ray = new Ray(transform.position, transform.forward); + Ray ray2 = new Ray(transform.position / 1.5f, transform.forward); + Ray ray3 = new Ray(transform.position / 2.5f, transform.forward); + if (Physics.Raycast(ray, out hit, 1f)) + { + if (hit.collider.tag == "Player") + { + if (hitCooldown > hitCountdown) + { + PlayerHealth.health -= 20; + hitCooldown = 0; + } + } + } + + // new raycast to simulate line of sight + if (Physics.Raycast(ray, out hit, 30) || Physics.Raycast(ray2, out hit, 30) || Physics.Raycast(ray3, out hit, 30)) + { + Debug.Log(sightTimer); + Debug.DrawLine(transform.position, hit.point, Color.green); + if (hit.collider.tag == "Player") + { + sight = true; + } + + } + + if (sight == true) + { + chase = true; + wander = false; + } + else + { + chase = false; + wander = true; + } + + if (stamina <= 0) + { + chase = false; + wander = true; + } + + // default state is wander, only changes if raycast detects player + if (wander == true) + { + Vector3 newPos = RandomNavSphere(transform.position, wanderDist, -1)/ 6; + agent.SetDestination(newPos); + agent.speed = 3; + if (stamina <= 100) + { + stamina += Time.deltaTime * 6; + } + } + + // second state, chase, disabling wander and taking on regular AI patterns + if (chase == true) { + stamina -= Time.deltaTime * 5; + if (stamina <= 10) { + chase = false; + wander = true; + } + } else { + stamina += Time.deltaTime * 2; + } + + if (wander == false && scared == false) + { + chase = true; + } + + // third state, scared, runs away from player + if (scared == true) + { + Vector3 moveDirection = transform.position - target.transform.position; + agent.SetDestination (moveDirection); + currentRunBoredom += Time.deltaTime; + agent.speed = 4; + chase = false; + + if (currentRunBoredom >= runBoredomCounter) + { + scared = false; + wander = true; + } + } + + // fourth state, moves straight to player position, ignoring obstacles + if (manualMovement == true && target != null) + { + // turns off smart ai and begins a process to slowly crawl over debris, switches off once off debris + transform.position += (target.position - transform.position).normalized * moveSpeed * Time.deltaTime; + transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(target.position - transform.position), rotationSpeed * Time.deltaTime); + } + + // switches to scared state when hurt badly + if (health <= 40 && currentRunBoredom <= runBoredomCounter) + { + scared = true; + } + + // dead + if (health <= 0) + { + Destroy(this.gameObject); + } + + } + + // wandering calculations + public static Vector3 RandomNavSphere(Vector3 origin, float dist, int layermask) + { + Vector3 randDirection = Random.insideUnitSphere * dist; + randDirection += origin; + NavMeshHit navHit; + NavMesh.SamplePosition(randDirection, out navHit, dist, layermask); + return navHit.position; + } + + void OnCollisionEnter(Collision col) + { + // put enemy hit in collision function to maintain individual health variable in each enemy + if (initialHit == true) + { + // damages first target + health -= 20; + initialHit = false; + chase = true; + wander = false; + scared = false; + } + + if (col.gameObject.tag == "Debris" && woodDebris.settled == true && scared == false) + { + // turns off smart AI and turns on dumb beeline enemies that can get through the rubble + wander = false; + manualMovement = true; + gameObject.GetComponent().enabled = false; + } + // prevents flying debris right after destruction from glitching the AI + else if (col.gameObject.tag == "Debris" && woodDebris.settled == false) + { + gameObject.GetComponent().enabled = false; + } + else + { + // once off debris, turns smart AI back on to find path of least resistance + manualMovement = false; + gameObject.GetComponent().enabled = true; + } + } +} diff --git a/VScripts/EnemyAI.cs.meta b/VScripts/EnemyAI.cs.meta new file mode 100644 index 0000000..4aca233 --- /dev/null +++ b/VScripts/EnemyAI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bb5dc377f7c35aa419c82e078925e4b0 +timeCreated: 1460726501 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VScripts/Headshot.cs b/VScripts/Headshot.cs new file mode 100644 index 0000000..8e5bf8a --- /dev/null +++ b/VScripts/Headshot.cs @@ -0,0 +1,19 @@ +using UnityEngine; +using System.Collections; + +public class Headshot : MonoBehaviour { + + // Use this for initialization + void Start () { + + } + + // Update is called once per frame + void Update () { + + } + void OnCollisionEnter(Collision col) + { + + } +} diff --git a/VScripts/Headshot.cs.meta b/VScripts/Headshot.cs.meta new file mode 100644 index 0000000..d872357 --- /dev/null +++ b/VScripts/Headshot.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f7e7d2c615a77d84f8cea07061743899 +timeCreated: 1463576789 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VScripts/Player.cs b/VScripts/Player.cs new file mode 100644 index 0000000..267c3f3 --- /dev/null +++ b/VScripts/Player.cs @@ -0,0 +1,14 @@ +using UnityEngine; +using System.Collections; + +public class Player : MonoBehaviour { + public static Vector3 pos; + // Use this for initialization + void Start () { + + } + + // Update is called once per frame + void Update () { + } +} diff --git a/VScripts/Player.cs.meta b/VScripts/Player.cs.meta new file mode 100644 index 0000000..045f177 --- /dev/null +++ b/VScripts/Player.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3b915f5dbdc4bdb409a9af4924353f93 +timeCreated: 1464303463 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VScripts/PlayerHealth.cs b/VScripts/PlayerHealth.cs new file mode 100644 index 0000000..a8a9708 --- /dev/null +++ b/VScripts/PlayerHealth.cs @@ -0,0 +1,24 @@ +using UnityEngine; +using System.Collections; + +public class PlayerHealth : MonoBehaviour +{ + public static int health = 100; + + // Use this for initialization + void Start() + { + SpawnController.isPlayerDead = false; + + } + + // Update is called once per frame + void Update() + { + if (health <= 0) + { + SpawnController.isPlayerDead = true; + Destroy(this.gameObject); + } + } +} \ No newline at end of file diff --git a/VScripts/PlayerHealth.cs.meta b/VScripts/PlayerHealth.cs.meta new file mode 100644 index 0000000..3ce10cc --- /dev/null +++ b/VScripts/PlayerHealth.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 10b8ac6e7d980de45bf4ce51c3ae7dff +timeCreated: 1462924704 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VScripts/StackedWood.cs b/VScripts/StackedWood.cs new file mode 100644 index 0000000..1bd12dd --- /dev/null +++ b/VScripts/StackedWood.cs @@ -0,0 +1,45 @@ +using UnityEngine; +using System.Collections; + +public class StackedWood : MonoBehaviour { + public static bool stackedHit = false; + public GameObject debrisPrefab; + public Rigidbody rb; + private float timer = 0; + private float counter = 0.53f; + + // Use this for initialization + void Start () { + rb = gameObject.GetComponent(); + rb.isKinematic = true; + + } + + // Update is called once per frame + void Update () + { + RaycastHit hit; + Ray ray = new Ray(transform.position, -transform.up); + if (Physics.Raycast(ray, out hit, 2.5f)) + { + Debug.DrawLine(transform.position, hit.point, Color.green); + if (rb.velocity.magnitude > 1f || rb.angularVelocity.magnitude > 1f) { + rb.AddForce(Physics.gravity * rb.mass * 2.75f); + rb.isKinematic = false; + Destroy(this.gameObject); + Instantiate(debrisPrefab, transform.position, transform.rotation); + } + else if (hit.collider.tag != "WoodBelow" && hit.collider.tag != "Player") + { + rb.AddForce(Physics.gravity * rb.mass * 2.75f); + rb.isKinematic = false; + timer += Time.deltaTime; + + if (timer > counter) { + Destroy(this.gameObject); + Instantiate(debrisPrefab, transform.position, transform.rotation); + } + } + } + } +} diff --git a/VScripts/StackedWood.cs.meta b/VScripts/StackedWood.cs.meta new file mode 100644 index 0000000..1a087ba --- /dev/null +++ b/VScripts/StackedWood.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0fccc1784c4107a43b8f240a099ca384 +timeCreated: 1465824731 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VScripts/WoodDestruction.cs b/VScripts/WoodDestruction.cs new file mode 100644 index 0000000..d2f5af4 --- /dev/null +++ b/VScripts/WoodDestruction.cs @@ -0,0 +1,57 @@ +using UnityEngine; +using System.Collections; + +public class WoodDestruction : MonoBehaviour +{ + public static bool initialHit = false; + public static bool woodDestroy = false; + public static bool hitWoodAbove = false; + public GameObject debrisPrefab; + [SerializeField]private int destructionStage = 0; + + + // Use this for initialization + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } + + void OnCollisionEnter(Collision col) + { + + if (initialHit == true) + { + destructionStage += 1; + Debug.Log(destructionStage); + initialHit = false; + } + + if (destructionStage == 3 && hitWoodAbove == false) + { + // setting up position of debris such that it doesnt spawn in the air, rather on the ground + transform.position = new Vector3(transform.position.x, transform.position.y - 0.9f, transform.position.z); + Transform parentDebris = Instantiate (debrisPrefab, transform.position, transform.rotation) as Transform; + + + // switching woodDestroy true which effects BulletHole script, destroying bulletholes on the wall at the same time the wall breaks + woodDestroy = true; + Destroy(this.gameObject); + } + if (destructionStage == 3 && hitWoodAbove == true) + { + Instantiate(debrisPrefab, transform.position, transform.rotation); + woodDestroy = true; + Destroy(this.gameObject); + } + else + { + woodDestroy = false; + } + } +} diff --git a/VScripts/WoodDestruction.cs.meta b/VScripts/WoodDestruction.cs.meta new file mode 100644 index 0000000..8a06832 --- /dev/null +++ b/VScripts/WoodDestruction.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f0c149e171dff6747b9c52e0db93491b +timeCreated: 1461239829 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/VScripts/woodDebris.cs b/VScripts/woodDebris.cs new file mode 100644 index 0000000..6477da5 --- /dev/null +++ b/VScripts/woodDebris.cs @@ -0,0 +1,41 @@ +using UnityEngine; +using System.Collections; + +public class woodDebris : MonoBehaviour +{ + public static bool settled = false; + private float settleLimit = 0.65f; + private float settleCounter = 0; + private bool inMotion = false; + // Use this for initialization + void Start() + { + + } + + // Update is called once per frame + void Update() + { + settleCounter += Time.deltaTime; + foreach (Transform child in transform) { + if (child.GetComponent ().velocity.magnitude > 0) { + inMotion = true; + } + } + + while ((settleCounter > settleLimit) && inMotion == false) + { + settled = true; + settleCounter = 0; + } + + if (settled) { + + foreach (Transform child in this.transform) { + Destroy (child.GetComponent()); + } + + } + inMotion = false; + } +} diff --git a/VScripts/woodDebris.cs.meta b/VScripts/woodDebris.cs.meta new file mode 100644 index 0000000..bf9a3c2 --- /dev/null +++ b/VScripts/woodDebris.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 558f9953930333a4295e0d1e938d1f51 +timeCreated: 1461632175 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Vincent Dion PCP.gantter b/Vincent Dion PCP.gantter new file mode 100644 index 0000000..f4aad16 --- /dev/null +++ b/Vincent Dion PCP.gantter @@ -0,0 +1 @@ +12project.xmlUser2016-04-13T21:59:352016-06-16T21:25:4912016-03-15T08:00:002016-06-01T17:00:001012$USD0108:00:0017:00:004802400200300720010111001000000012016-06-16T21:23:31110001984-01-01T00:00:00100001Standard1-1102108:00:0012:00:0013:00:0017:00:003108:00:0012:00:0013:00:0017:00:004108:00:0012:00:0013:00:0017:00:005108:00:0012:00:0013:00:0017:00:006108:00:0012:00:0013:00:0017:00:0070224-Hours1-11100:00:0000:00:002100:00:0000:00:003100:00:0000:00:004100:00:0000:00:005100:00:0000:00:006100:00:0000:00:007100:00:0000:00:003Night Shift1-1102123:00:0000:00:003100:00:0003:00:0004:00:0008:00:0023:00:0000:00:004100:00:0003:00:0004:00:0008:00:0023:00:0000:00:005100:00:0003:00:0004:00:0008:00:0023:00:0000:00:006100:00:0003:00:0004:00:0008:00:0023:00:0000:00:007100:00:0003:00:0004:00:0008:00:0000Vincent Dion PCP002016-04-14T01:59:350005002016-03-15T08:00:002016-06-01T17:00:00PT456H0M0S39PT0H0M0S0000101110002016-03-15T08:00:002016-06-01T17:00:002016-03-15T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-03-15T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT456H0M0S0PT0H0M0S0PT0H0M0S000-100000001000null2016-04-13T22:49:3931Personal Coding Project002016-04-14T02:06:231115002016-03-15T08:00:002016-06-01T17:00:00PT456H0M0S7PT0H0M0S010000010002016-03-15T08:00:002016-06-01T17:00:002016-03-15T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-03-15T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT456H0M0S0PT0H0M0S0PT0H0M0S006-12016-06-01T17:00:00000000010ffff0000null42Initial Project Statement002016-04-14T02:06:552215002016-03-15T08:00:002016-03-18T17:00:00PT32H0M0S7PT0H0M0S000000100002016-03-15T08:00:002016-03-18T17:00:002016-05-30T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-03-15T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT32H0M0S0PT0H0M0S0PT0H0M0S000-1000000010ccffff10null13Unity Setup002016-04-14T02:01:542.12.125002016-03-15T08:00:002016-03-15T08:00:00PT0H0M0S7PT0H0M0S010001000002016-03-15T08:00:002016-03-15T08:00:002016-05-30T08:00:002016-05-30T08:00:0000000030000PT0H0M0S2016-03-15T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT0H0M0S0PT0H0M0S0PT0H0M0S004-12016-03-15T08:00:0000000001000null24Game Brainstorm002016-04-14T02:02:542.22.225002016-03-16T08:00:002016-03-18T17:00:00PT24H0M0S7PT0H0M0S010000000002016-03-16T08:00:002016-03-18T17:00:002016-05-30T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-03-16T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT24H0M0S0PT0H0M0S0PT0H0M0S004-12016-03-16T08:00:0000000001100710ccffff00null65Research and Learning002016-04-14T02:08:203315002016-03-22T08:00:002016-04-22T17:00:00PT192H0M0S7PT0H0M0S000000100002016-03-22T08:00:002016-04-22T17:00:002016-04-29T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-03-22T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT192H0M0S0PT0H0M0S0PT0H0M0S000-1000000010ff000010null76Unity Beginner Scripting Tutorial002016-04-14T02:08:413.13.125002016-03-22T08:00:002016-03-23T17:00:00PT16H0M0S7PT0H0M0S010000000002016-03-22T08:00:002016-03-23T17:00:002016-05-02T08:00:002016-05-03T17:00:0000000030000PT0H0M0S2016-03-22T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT16H0M0S0PT0H0M0S0PT0H0M0S006-12016-03-23T17:00:00000000010ff000000null87C# Basics Microsoft Documentation002016-04-14T02:09:533.23.225002016-03-22T08:00:002016-03-23T17:00:00PT16H0M0S7PT0H0M0S010000000002016-03-22T08:00:002016-03-23T17:00:002016-04-29T08:00:002016-05-02T17:00:0000000030000PT0H0M0S2016-03-22T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT16H0M0S0PT0H0M0S0PT0H0M0S004-12016-03-22T08:00:00000000010ff000000null188Unity Modelling Basics Tutorials002016-04-14T02:13:073.33.325002016-03-23T08:00:002016-03-25T17:00:00PT24H0M0S7PT0H0M0S010000000002016-03-23T08:00:002016-03-25T17:00:002016-05-20T08:00:002016-05-24T17:00:0000000030000PT0H0M0S2016-03-23T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT24H0M0S0PT0H0M0S0PT0H0M0S004-12016-03-23T08:00:00000000010ff000000null239Unity Terrain Editing Tutorials002016-04-14T02:20:553.43.425002016-03-23T08:00:002016-03-24T17:00:00PT16H0M0S7PT0H0M0S010000000002016-03-23T08:00:002016-03-24T17:00:002016-05-31T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-03-23T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT16H0M0S0PT0H0M0S0PT0H0M0S006-12016-03-24T17:00:00000000010ff000000null2110Multiplayer Networking Basics Tutorials002016-04-14T02:16:593.53.525002016-03-24T08:00:002016-03-31T17:00:00PT48H0M0S7PT0H0M0S010000000002016-03-24T08:00:002016-03-31T17:00:002016-05-17T08:00:002016-05-24T17:00:0000000030000PT0H0M0S2016-03-24T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT48H0M0S0PT0H0M0S0PT0H0M0S004-12016-03-23T08:00:000000000710078100710ff000000null2011Blender 3D Modelling Tutorial002016-04-14T02:16:483.63.625002016-03-28T08:00:002016-03-31T17:00:00PT32H0M0S7PT0H0M0S010000000002016-03-28T08:00:002016-03-31T17:00:002016-05-27T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-03-28T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT32H0M0S0PT0H0M0S0PT0H0M0S006-12016-03-28T17:00:00000000018100710ff000000null2612Experimenting With the Unity Engine002016-04-14T02:25:003.73.725002016-03-24T08:00:002016-03-28T17:00:00PT24H0M0S7PT0H0M0S010000000002016-03-24T08:00:002016-03-28T17:00:002016-05-30T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-03-24T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT24H0M0S0PT0H0M0S0PT0H0M0S004-12016-03-24T08:00:000000000710078100710ff000000null2213Unity Advanced Scripting Tutorials002016-04-14T02:18:223.83.825002016-03-24T08:00:002016-04-18T17:00:00PT144H0M0S7PT0H0M0S010000000002016-03-24T08:00:002016-04-18T17:00:002016-05-04T08:00:002016-05-27T17:00:0000000030000PT0H0M0S2016-03-24T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT144H0M0S0PT0H0M0S0PT0H0M0S004-12016-03-24T08:00:000000000710078100710ff000000null3014C# Advanced Features002016-04-14T02:30:493.93.925002016-03-24T08:00:002016-04-19T17:00:00PT152H0M0S7PT0H0M0S010000000002016-03-24T08:00:002016-04-19T17:00:002016-05-03T08:00:002016-05-27T17:00:0000000030000PT0H0M0S2016-03-24T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT152H0M0S0PT0H0M0S0PT0H0M0S006-12016-04-19T17:00:0000000008100710ff000000null2415Inventory System Tutorial002016-04-14T02:21:373.103.1025002016-04-20T08:00:002016-04-22T17:00:00PT24H0M0S7PT0H0M0S010000000002016-04-20T08:00:002016-04-22T17:00:002016-05-30T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-04-20T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT24H0M0S0PT0H0M0S0PT0H0M0S006-12016-03-28T17:00:00000000022100730100710ff000000null2516Graphical User Interface Tutorials002016-04-14T02:21:383.113.1125002016-04-20T08:00:002016-04-21T17:00:00PT16H0M0S7PT0H0M0S010000000002016-04-20T08:00:002016-04-21T17:00:002016-05-31T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-04-20T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT16H0M0S0PT0H0M0S0PT0H0M0S006-12016-03-28T17:00:00000000022100730100710ff000000null2717First Person Shooter Element Tutorials002016-04-14T02:28:093.123.1225002016-04-01T08:00:002016-04-08T17:00:00PT48H0M0S7PT0H0M0S010000000002016-04-01T08:00:002016-04-08T17:00:002016-05-25T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-04-01T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT48H0M0S0PT0H0M0S0PT0H0M0S006-12016-04-06T17:00:0000000007100718100721100710ff000000null2818Start Menu Tutorial002016-04-14T02:29:333.133.1325002016-04-20T08:00:002016-04-22T17:00:00PT24H0M0S7PT0H0M0S010000000002016-04-20T08:00:002016-04-22T17:00:002016-05-30T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-04-20T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT24H0M0S0PT0H0M0S0PT0H0M0S006-12016-03-30T17:00:00000000022100730100710ff000000null919Development002016-04-14T02:09:534415002016-04-11T08:00:002016-05-25T17:00:00PT264H0M0S7PT0H0M0S000000100002016-04-11T08:00:002016-05-25T17:00:002016-04-18T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-04-11T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT264H0M0S0PT0H0M0S0PT0H0M0S000-100000001000null3320Import Assets and Controllers002016-04-14T02:32:534.14.125002016-04-11T08:00:002016-04-12T17:00:00PT16H0M0S7PT0H0M0S010000000002016-04-11T08:00:002016-04-12T17:00:002016-04-18T08:00:002016-04-19T17:00:0000000030000PT0H0M0S2016-04-11T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT16H0M0S0PT0H0M0S0PT0H0M0S006-12016-04-12T17:00:0000000001000ffff00null1021Create Different Functionalities002016-04-14T02:10:074.24.225002016-04-13T08:00:002016-05-10T17:00:00PT160H0M0S7PT0H0M0S010000000002016-04-13T08:00:002016-05-10T17:00:002016-04-20T08:00:002016-05-17T17:00:0000000030000PT0H0M0S2016-04-13T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT160H0M0S0PT0H0M0S0PT0H0M0S004-12016-04-12T08:00:0000000003310071000ffff00null3422Level Design002016-04-14T02:33:094.34.325002016-05-11T08:00:002016-05-19T17:00:00PT56H0M0S7PT0H0M0S010000000002016-05-11T08:00:002016-05-19T17:00:002016-05-18T08:00:002016-05-26T17:00:0000000030000PT0H0M0S2016-05-11T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT56H0M0S0PT0H0M0S0PT0H0M0S004-12016-05-10T08:00:0000000001010071000ffff00null3223Merge Code002016-04-14T02:32:334.44.425002016-05-20T08:00:002016-05-25T17:00:00PT32H0M0S7PT0H0M0S010000000002016-05-20T08:00:002016-05-25T17:00:002016-05-27T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-05-20T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT32H0M0S0PT0H0M0S0PT0H0M0S000-100000003410071000ffff00null1124Testing002016-04-14T02:10:115515002016-05-25T08:00:002016-05-27T17:00:00PT24H0M0S7PT0H0M0S000000100002016-05-25T08:00:002016-05-27T17:00:002016-05-30T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-05-25T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT24H0M0S0PT0H0M0S0PT0H0M0S000-100000001000null1225Finding Bugs and Errors002016-04-14T02:10:135.15.125002016-05-25T08:00:002016-05-27T17:00:00PT24H0M0S7PT0H0M0S010000000002016-05-25T08:00:002016-05-27T17:00:002016-05-30T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-05-25T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT24H0M0S0PT0H0M0S0PT0H0M0S004-12016-05-25T08:00:00000000010ffff9900null3526Fixing Bugs and Errors002016-04-14T02:43:495.25.225002016-05-25T08:00:002016-05-27T17:00:00PT24H0M0S7PT0H0M0S010000000002016-05-25T08:00:002016-05-27T17:00:002016-05-30T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-05-25T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT24H0M0S0PT0H0M0S0PT0H0M0S004-12016-05-25T08:00:00000000010ffff9900null1327Documentation002016-04-14T02:10:146615002016-05-27T08:00:002016-05-30T17:00:00PT16H0M0S39PT0H0M0S000010100002016-05-27T08:00:002016-05-30T17:00:002016-05-31T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-05-27T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT16H0M0S0PT0H0M0S0PT0H0M0S000-100000001000null1428Github Readme File002016-04-14T02:11:036.16.125002016-05-27T08:00:002016-05-30T17:00:00PT16H0M0S7PT0H0M0S010000000002016-05-27T08:00:002016-05-30T17:00:002016-05-31T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-05-27T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT16H0M0S0PT0H0M0S0PT0H0M0S004-12016-05-27T08:00:0000000001066669900null3729Code Walkthrough Video002016-04-14T02:44:146.26.225002016-05-27T08:00:002016-05-30T17:00:00PT16H0M0S7PT0H0M0S010000000002016-05-27T08:00:002016-05-30T17:00:002016-05-31T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-05-27T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT16H0M0S0PT0H0M0S0PT0H0M0S006-12016-05-30T17:00:0000000001066669900null3830Product Walkthrough Video002016-04-14T02:44:236.36.325002016-05-27T08:00:002016-05-30T17:00:00PT16H0M0S39PT0H0M0S010010000002016-05-27T08:00:002016-05-30T17:00:002016-05-31T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-05-27T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT16H0M0S0PT0H0M0S0PT0H0M0S006-12016-05-30T17:00:0000000001066669900null1531Project Close002016-04-14T02:11:087715002016-06-01T08:00:002016-06-01T17:00:00PT8H0M0S7PT0H0M0S000000110002016-06-01T08:00:002016-06-01T17:00:002016-06-01T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-06-01T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT8H0M0S0PT0H0M0S0PT0H0M0S000-100000001000null1632Reflection & Self-Assessment002016-04-14T02:11:267.17.125002016-06-01T08:00:002016-06-01T17:00:00PT8H0M0S7PT0H0M0S010000010002016-06-01T08:00:002016-06-01T17:00:002016-06-01T08:00:002016-06-01T17:00:0000000030000PT0H0M0S2016-06-01T08:00:00PT0H0M0S00PT0H0M0SPT0H0M0SPT0H0M0SPT8H0M0S0PT0H0M0S0PT0H0M0S004-12016-06-01T08:00:00000000010ff660000null \ No newline at end of file