diff --git a/.vs/Shoot'em up/v14/.suo b/.vs/Shoot'em up/v14/.suo
new file mode 100644
index 0000000000000000000000000000000000000000..edcdda0a807d2e4a6717919b68a5ab505c4c5a4e
Binary files /dev/null and b/.vs/Shoot'em up/v14/.suo differ
diff --git a/Assets/Scripts/Game/EnemyDeathManager.cs b/Assets/Scripts/Game/EnemyDeathManager.cs
new file mode 100644
index 0000000000000000000000000000000000000000..1ff8e6644dee475046dbb60702668a3d6bee17e8
--- /dev/null
+++ b/Assets/Scripts/Game/EnemyDeathManager.cs
@@ -0,0 +1,18 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class EnemyDeathManager : DeathManager
+{
+    public EnemyFactory enemyFactory;
+
+    [SerializeField]
+    int enemyDeathScore;
+
+    public override void Die()
+    {
+        base.Die();
+        ScoreManager.Instance.IncreaseScore(enemyDeathScore);
+        enemyFactory.Release(this.gameObject);
+    }
+}
diff --git a/Assets/Scripts/Game/EnemyDeathManager.cs.meta b/Assets/Scripts/Game/EnemyDeathManager.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..2770f4f7539b26ca6d5f02c68ed8b8ca3787ba42
--- /dev/null
+++ b/Assets/Scripts/Game/EnemyDeathManager.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 7913e1dd17c5cfc4bad3f69ca7ef9303
+timeCreated: 1506697926
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Game/EnemyFactory.cs b/Assets/Scripts/Game/EnemyFactory.cs
new file mode 100644
index 0000000000000000000000000000000000000000..fa285f2f062a886257df4560ae788472c6d910a5
--- /dev/null
+++ b/Assets/Scripts/Game/EnemyFactory.cs
@@ -0,0 +1,65 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class EnemyFactory : MonoBehaviour
+{
+    public enum EnemyType
+    {
+        normalEnemy = 0,
+        zigzagEnemy = 1
+    }
+
+    [SerializeField]
+    GameObject[] enemyPrefabs = new GameObject[2];
+
+    List<GameObject>[] enemyStock = new List<GameObject>[2];
+
+    private void Start()
+    {
+        enemyStock[0] = new List<GameObject>();
+        enemyStock[1] = new List<GameObject>();
+    }
+
+    public GameObject GetEnemy(EnemyType enemyType)
+    {
+        GameObject newEnemy;
+        if (enemyStock[(int)enemyType].Count == 0)
+        {
+            newEnemy = Instantiate(enemyPrefabs[(int)enemyType]);
+            BaseEnemyManager enemyManager = newEnemy.GetComponent<BaseEnemyManager>();
+            if(enemyManager)
+            {
+                enemyManager.enemyType = enemyType;
+                enemyManager.enemyFactory = this;
+            }
+            EnemyDeathManager enemyDeathManager = newEnemy.GetComponent<EnemyDeathManager>();
+            if(enemyDeathManager)
+            {
+                enemyDeathManager.enemyFactory = this;
+            }
+        }
+        else
+        {
+            newEnemy = enemyStock[(int)enemyType][0];
+            enemyStock[(int)enemyType].RemoveAt(0);
+            newEnemy.SetActive(true);
+        }
+        return newEnemy;
+    }
+
+    public void Release(GameObject enemy)
+    {
+        enemy.SetActive(false);
+        HealthManager healthManager = enemy.GetComponent<HealthManager>();
+        if (healthManager)
+        {
+            healthManager.currentHealth = healthManager.maxHealth;
+        }
+        BaseEnemyManager enemyManager = enemy.GetComponent<BaseEnemyManager>();
+        if (enemyManager)
+        {
+            enemyStock[(int)enemyManager.enemyType].Add(enemy);
+        }
+    }
+}
diff --git a/Assets/Scripts/Game/EnemyFactory.cs.meta b/Assets/Scripts/Game/EnemyFactory.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..0e13c522b119635f90e5465b5db915534b16af7f
--- /dev/null
+++ b/Assets/Scripts/Game/EnemyFactory.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 14909d483ee1e8d429bfb870b7febd68
+timeCreated: 1506695515
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Game/ImmunityManager.cs b/Assets/Scripts/Game/ImmunityManager.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0ccf9ce89c7029e08d9413ac813508d08edae19c
--- /dev/null
+++ b/Assets/Scripts/Game/ImmunityManager.cs
@@ -0,0 +1,59 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ImmunityManager : MonoBehaviour
+{
+    static public ImmunityManager Instance { get; private set; }
+
+    public bool isImmune { get; private set; }
+
+    [SerializeField]
+    SpriteRenderer spriteRenderer;
+
+    [SerializeField]
+    float immunityTime = 0.5f;
+
+    Color standardColor;
+
+    [SerializeField]
+    Color immunityColor;
+
+    float immunityStart = float.NegativeInfinity;
+
+	// Use this for initialization
+	void Start ()
+    {
+        Instance = this;
+        if(spriteRenderer)
+        {
+            standardColor = spriteRenderer.color;
+        }
+    }
+
+    public void BecomeImmune()
+    {
+        if(!isImmune)
+        {
+            isImmune = true;
+            immunityStart = Time.time;
+            if(spriteRenderer)
+            {
+                spriteRenderer.color = immunityColor;
+            }
+        }
+    }
+	
+	// Update is called once per frame
+	void Update ()
+    {
+		if(isImmune && Time.time - immunityStart > immunityTime)
+        {
+            isImmune = false;
+            if(spriteRenderer)
+            {
+                spriteRenderer.color = standardColor;
+            }
+        }
+	}
+}
diff --git a/Assets/Scripts/Game/ImmunityManager.cs.meta b/Assets/Scripts/Game/ImmunityManager.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..61539a5017fb96825abeb0c3b938d3850e49ed92
--- /dev/null
+++ b/Assets/Scripts/Game/ImmunityManager.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e44532f6e72b5cf44bb0679c315aecdc
+timeCreated: 1506849147
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Game/ScoreManager.cs b/Assets/Scripts/Game/ScoreManager.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e1194014740e7415f09e7995c25cd72b5696f9cf
--- /dev/null
+++ b/Assets/Scripts/Game/ScoreManager.cs
@@ -0,0 +1,31 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ScoreManager : MonoBehaviour
+{
+    static public ScoreManager Instance { get; private set; }
+
+    int score = 0;
+
+    public int GetScore()
+    {
+        return score;
+    }
+	
+	void Start ()
+    {
+        Instance = this;
+        score = 0;
+	}
+	
+	public void IncreaseScore(int i)
+    {
+        score += i;
+    }
+
+    public override string ToString()
+    {
+        return score.ToString();
+    }
+}
diff --git a/Assets/Scripts/Game/ScoreManager.cs.meta b/Assets/Scripts/Game/ScoreManager.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..ea0a9552193f76ade726d71eddf5297a693a2e2e
--- /dev/null
+++ b/Assets/Scripts/Game/ScoreManager.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b91979c541b86ac4eb4449822adb4066
+timeCreated: 1506699747
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Game/ScoreMemory.cs b/Assets/Scripts/Game/ScoreMemory.cs
new file mode 100644
index 0000000000000000000000000000000000000000..4c6076881dd82d93ca9a481208dbf09464f6eb2e
--- /dev/null
+++ b/Assets/Scripts/Game/ScoreMemory.cs
@@ -0,0 +1,22 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ScoreMemory : MonoBehaviour
+{
+    public static ScoreMemory Instance { get; private set; }
+
+    public int savedScore = 0;
+
+	// Use this for initialization
+	void Start ()
+    {
+		if(Instance)
+        {
+            Destroy(this.gameObject);
+            return;
+        }
+        Instance = this;
+        DontDestroyOnLoad(this.gameObject);
+	}
+}
diff --git a/Assets/Scripts/Game/ScoreMemory.cs.meta b/Assets/Scripts/Game/ScoreMemory.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..3e0faf7afc3d2be889458e32c1390680f5b90e52
--- /dev/null
+++ b/Assets/Scripts/Game/ScoreMemory.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5f705cd2e636cd74fa6ec347d53f9c03
+timeCreated: 1506853422
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Game/ScorePrinter.cs b/Assets/Scripts/Game/ScorePrinter.cs
new file mode 100644
index 0000000000000000000000000000000000000000..aec933070b2fa8a71fd1418b58a872ddb347610b
--- /dev/null
+++ b/Assets/Scripts/Game/ScorePrinter.cs
@@ -0,0 +1,15 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ScorePrinter : MonoBehaviour
+{
+    [SerializeField]
+    UnityEngine.UI.Text scoreText;
+	
+	// Update is called once per frame
+	void Update ()
+    {
+        scoreText.text = "Score : " + ScoreManager.Instance;
+	}
+}
diff --git a/Assets/Scripts/Game/ScorePrinter.cs.meta b/Assets/Scripts/Game/ScorePrinter.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..5d6b968a488d774d2b7a35da29ff0eabcbc41b96
--- /dev/null
+++ b/Assets/Scripts/Game/ScorePrinter.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6de4dc28e17febb48a153a50eb97b18a
+timeCreated: 1506848776
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Menus/GameOverScorePrinter.cs b/Assets/Scripts/Menus/GameOverScorePrinter.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c354f7419df0ea28c70f2286b44c4bb67258339d
--- /dev/null
+++ b/Assets/Scripts/Menus/GameOverScorePrinter.cs
@@ -0,0 +1,18 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class GameOverScorePrinter : MonoBehaviour
+{
+    [SerializeField]
+    UnityEngine.UI.Text scoreText;
+
+	// Use this for initialization
+	void Start ()
+    {
+        if(ScoreMemory.Instance)
+        {
+            scoreText.text = "Score : " + ScoreMemory.Instance.savedScore;
+        }
+	}
+}
diff --git a/Assets/Scripts/Menus/GameOverScorePrinter.cs.meta b/Assets/Scripts/Menus/GameOverScorePrinter.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..6f7f2b74b452ee11a8cd2ada0573105e65549d04
--- /dev/null
+++ b/Assets/Scripts/Menus/GameOverScorePrinter.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: cab4c7344649eee47925c411aa5a56b9
+timeCreated: 1506854568
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: