diff --git a/Assets/Scripts/Core/Objects/Projectiles.meta b/Assets/Resources/Prefabs/Collectibles.meta
similarity index 77%
rename from Assets/Scripts/Core/Objects/Projectiles.meta
rename to Assets/Resources/Prefabs/Collectibles.meta
index 6a4444d604f19f13c34c861c612299a111802f0e..54ea43c2c5babee140591c3d9d13b1520a90a935 100644
--- a/Assets/Scripts/Core/Objects/Projectiles.meta
+++ b/Assets/Resources/Prefabs/Collectibles.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 517bdd92b7ac7ae45ae12452764d1236
+guid: f1e943732d7f3404dae8b841db6eb907
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Assets/Resources/Prefabs/Collectibles/TestCollectible.prefab b/Assets/Resources/Prefabs/Collectibles/TestCollectible.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..72671f0142b74f63d45bb8aa55f3c1967484f10f
--- /dev/null
+++ b/Assets/Resources/Prefabs/Collectibles/TestCollectible.prefab
@@ -0,0 +1,154 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &1946870712216142017
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 4380898715013208265}
+  - component: {fileID: 2814133072688698486}
+  - component: {fileID: 8716965123864587230}
+  m_Layer: 0
+  m_Name: TestCollectible
+  m_TagString: Collectible
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &4380898715013208265
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1946870712216142017}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: -1.597, y: 0.843, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 7178149540657224527}
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!135 &2814133072688698486
+SphereCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1946870712216142017}
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_IsTrigger: 1
+  m_ProvidesContacts: 0
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Radius: 0.5
+  m_Center: {x: 0, y: 0, z: 0}
+--- !u!114 &8716965123864587230
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1946870712216142017}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 6a318ebd05eb15c4fabf9cbe7355eb41, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  Id: 
+  TimeToLive: 5
+--- !u!1 &3951537116954375898
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 7178149540657224527}
+  - component: {fileID: 5198378908175156523}
+  - component: {fileID: 2990173857700234884}
+  m_Layer: 0
+  m_Name: Model
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &7178149540657224527
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3951537116954375898}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 4380898715013208265}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!33 &5198378908175156523
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3951537116954375898}
+  m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &2990173857700234884
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3951537116954375898}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
diff --git a/Assets/Scripts/Core/Objects/Projectiles/TestProjectile.meta b/Assets/Resources/Prefabs/Collectibles/TestCollectible.prefab.meta
similarity index 57%
rename from Assets/Scripts/Core/Objects/Projectiles/TestProjectile.meta
rename to Assets/Resources/Prefabs/Collectibles/TestCollectible.prefab.meta
index 47ac0ae6555db0fdb921994e2b1876e758e6a130..f447c417cc02fc530004fe1521b2884bfbe26d6a 100644
--- a/Assets/Scripts/Core/Objects/Projectiles/TestProjectile.meta
+++ b/Assets/Resources/Prefabs/Collectibles/TestCollectible.prefab.meta
@@ -1,7 +1,6 @@
 fileFormatVersion: 2
-guid: e0692a4893eed1143a9ffbe66c0d6767
-folderAsset: yes
-DefaultImporter:
+guid: c21e0108f08f0d74b92e3576ec7a7ecc
+PrefabImporter:
   externalObjects: {}
   userData: 
   assetBundleName: 
diff --git a/Assets/Resources/Prefabs/Weapons/TestWeapon/TestProjectile.prefab b/Assets/Resources/Prefabs/Weapons/TestWeapon/TestProjectile.prefab
new file mode 100644
index 0000000000000000000000000000000000000000..32ef57f3a03f6dfc5f1c05c19a4eadebe7767bab
--- /dev/null
+++ b/Assets/Resources/Prefabs/Weapons/TestWeapon/TestProjectile.prefab
@@ -0,0 +1,158 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!1 &3635903520720366118
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 3917471409857181565}
+  - component: {fileID: 4806322091654909456}
+  - component: {fileID: 7928905474033320423}
+  m_Layer: 8
+  m_Name: Model
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &3917471409857181565
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3635903520720366118}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0.5, y: 0.5, z: 0.5, w: 0.5}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2755710452689614233}
+  m_LocalEulerAnglesHint: {x: 0, y: 90, z: 90}
+--- !u!33 &4806322091654909456
+MeshFilter:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3635903520720366118}
+  m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
+--- !u!23 &7928905474033320423
+MeshRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3635903520720366118}
+  m_Enabled: 1
+  m_CastShadows: 1
+  m_ReceiveShadows: 1
+  m_DynamicOccludee: 1
+  m_StaticShadowCaster: 0
+  m_MotionVectors: 1
+  m_LightProbeUsage: 1
+  m_ReflectionProbeUsage: 1
+  m_RayTracingMode: 2
+  m_RayTraceProcedural: 0
+  m_RenderingLayerMask: 1
+  m_RendererPriority: 0
+  m_Materials:
+  - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
+  m_StaticBatchInfo:
+    firstSubMesh: 0
+    subMeshCount: 0
+  m_StaticBatchRoot: {fileID: 0}
+  m_ProbeAnchor: {fileID: 0}
+  m_LightProbeVolumeOverride: {fileID: 0}
+  m_ScaleInLightmap: 1
+  m_ReceiveGI: 1
+  m_PreserveUVs: 0
+  m_IgnoreNormalsForChartDetection: 0
+  m_ImportantGI: 0
+  m_StitchLightmapSeams: 1
+  m_SelectedEditorRenderState: 3
+  m_MinimumChartSize: 4
+  m_AutoUVMaxDistance: 0.5
+  m_AutoUVMaxAngle: 89
+  m_LightmapParameters: {fileID: 0}
+  m_SortingLayerID: 0
+  m_SortingLayer: 0
+  m_SortingOrder: 0
+  m_AdditionalVertexStreams: {fileID: 0}
+--- !u!1 &4422916666859880328
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 2755710452689614233}
+  - component: {fileID: 6587051258147727074}
+  - component: {fileID: 7153244774890821173}
+  m_Layer: 0
+  m_Name: TestProjectile
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!4 &2755710452689614233
+Transform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4422916666859880328}
+  serializedVersion: 2
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: -1.7690699, y: 0.8700185, z: -0.9192847}
+  m_LocalScale: {x: 0.1, y: 0.1, z: 0.1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 3917471409857181565}
+  m_Father: {fileID: 0}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &6587051258147727074
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4422916666859880328}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 42130989abf222142803c893c15fda1d, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  damage: 5
+  knockbackPower: 10
+  direction: {x: 0, y: 0, z: 0}
+  speed: 1
+  travelDistance: 10
+  through: 0
+--- !u!65 &7153244774890821173
+BoxCollider:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 4422916666859880328}
+  m_Material: {fileID: 0}
+  m_IncludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_ExcludeLayers:
+    serializedVersion: 2
+    m_Bits: 0
+  m_LayerOverridePriority: 0
+  m_IsTrigger: 1
+  m_ProvidesContacts: 0
+  m_Enabled: 1
+  serializedVersion: 3
+  m_Size: {x: 1, y: 1, z: 2}
+  m_Center: {x: 0, y: 0, z: 0}
diff --git a/Assets/Resources/Prefabs/Weapons/TestWeapon/TestProjectile.prefab.meta b/Assets/Resources/Prefabs/Weapons/TestWeapon/TestProjectile.prefab.meta
new file mode 100644
index 0000000000000000000000000000000000000000..fdcf4faf3543690ef12d186b06494026120e8792
--- /dev/null
+++ b/Assets/Resources/Prefabs/Weapons/TestWeapon/TestProjectile.prefab.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 70a197083e3d99246b1d381922eb03bf
+PrefabImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Core/Entities/Mobs/BossEntity.cs b/Assets/Scripts/Core/Entities/Mobs/BossEntity.cs
index aef07d6ce0d770ec19c8d5477e0f7f4bd4aecac4..21133940324fa79bcc982c4187d1a89928e36c2b 100644
--- a/Assets/Scripts/Core/Entities/Mobs/BossEntity.cs
+++ b/Assets/Scripts/Core/Entities/Mobs/BossEntity.cs
@@ -3,5 +3,7 @@ using System.Collections.Generic;
 public abstract class BossEntity : EnemyEntity, IAccompaniable{
     // Attributes
     private readonly List<Companions> companionList = new();    
+
+    // Set-Getters
     public List<Companions> Companions => companionList;
 }
diff --git a/Assets/Scripts/Core/Entities/Mobs/EnemyEntity.cs b/Assets/Scripts/Core/Entities/Mobs/EnemyEntity.cs
index 9cdbbde96029f90f5d2d37685fa99d6c11cd8061..7570021eca691f94171112f09ffa3db7758f40a7 100644
--- a/Assets/Scripts/Core/Entities/Mobs/EnemyEntity.cs
+++ b/Assets/Scripts/Core/Entities/Mobs/EnemyEntity.cs
@@ -1,4 +1,4 @@
-public abstract class EnemyEntity : Combatant {
+public abstract class EnemyEntity : CombatantEntity {
     // Functions
     new protected void Start(){
         base.Start();
diff --git a/Assets/Scripts/Library/BaseClasses/Companions.cs b/Assets/Scripts/Core/Entities/Pets/Companions.cs
similarity index 100%
rename from Assets/Scripts/Library/BaseClasses/Companions.cs
rename to Assets/Scripts/Core/Entities/Pets/Companions.cs
diff --git a/Assets/Scripts/Library/BaseClasses/Companions.cs.meta b/Assets/Scripts/Core/Entities/Pets/Companions.cs.meta
similarity index 100%
rename from Assets/Scripts/Library/BaseClasses/Companions.cs.meta
rename to Assets/Scripts/Core/Entities/Pets/Companions.cs.meta
diff --git a/Assets/Scripts/Core/Game/Data/GameControls.cs b/Assets/Scripts/Core/Game/Data/GameControls.cs
index 3dd7e06a089786fcc3a1f24769b00447a1d6dcd6..4e7976ef6ba36294ae307cf791ea424dbda06200 100644
--- a/Assets/Scripts/Core/Game/Data/GameControls.cs
+++ b/Assets/Scripts/Core/Game/Data/GameControls.cs
@@ -7,7 +7,8 @@ public class GameControls : MonoBehaviour {
     // Attributes
     public KeyCode backButton = KeyCode.Escape;
     public KeyCode attackButton = KeyCode.Z;
-    public KeyCode interactButton = KeyCode.X;
+    public KeyCode attackAlternateButton = KeyCode.X;
+    public KeyCode interactButton = KeyCode.C;
 
     // Constructor
     protected void Awake(){
diff --git a/Assets/Scripts/Core/Game/GameController.cs b/Assets/Scripts/Core/Game/GameController.cs
index 065a15251c89ec64f32d58b159e70b499c0b9205..b65d354e8b71abbae002fa7679286c60b4c97912 100644
--- a/Assets/Scripts/Core/Game/GameController.cs
+++ b/Assets/Scripts/Core/Game/GameController.cs
@@ -8,6 +8,8 @@ public class GameController : MonoBehaviour {
     public GameCameraController mainCamera;
     public GameStateController stateController;
     public GameSaveData data;
+
+    // Set-getters
     public bool IsPaused => Time.timeScale == 0;
 
     // Constructor
diff --git a/Assets/Scripts/Core/Objects/Projectiles/Projectile.cs b/Assets/Scripts/Core/Objects/Projectiles/Projectile.cs
deleted file mode 100644
index 712465eff00825ac9c5e807e34e58fea7c037c03..0000000000000000000000000000000000000000
--- a/Assets/Scripts/Core/Objects/Projectiles/Projectile.cs
+++ /dev/null
@@ -1,3 +0,0 @@
-public class Projectile : AttackObject{
-    
-}
\ No newline at end of file
diff --git a/Assets/Scripts/Core/Objects/Projectiles/TestProjectile/TestProjectile.cs b/Assets/Scripts/Core/Objects/Projectiles/TestProjectile/TestProjectile.cs
deleted file mode 100644
index 590825f761503cac58a46cd3594d981be159e4e7..0000000000000000000000000000000000000000
--- a/Assets/Scripts/Core/Objects/Projectiles/TestProjectile/TestProjectile.cs
+++ /dev/null
@@ -1,3 +0,0 @@
-public class TestProjectile : Projectile{
-
-}
\ No newline at end of file
diff --git a/Assets/Scripts/Core/Objects/Weapons/ProjectileObject.cs b/Assets/Scripts/Core/Objects/Weapons/ProjectileObject.cs
new file mode 100644
index 0000000000000000000000000000000000000000..61959b6ffce02257287584f611d318276a8e355c
--- /dev/null
+++ b/Assets/Scripts/Core/Objects/Weapons/ProjectileObject.cs
@@ -0,0 +1,34 @@
+using UnityEngine;
+
+public abstract class ProjectileObject : AttackObject{
+    // Attributes
+    protected float distanceTravelled = 0;
+    protected Vector3 position;
+    public Vector3 direction;
+    public float speed;
+    public float travelDistance;
+    public bool through;
+
+    // Constructor
+    protected new void Start(){
+        base.Start();
+        position = transform.position;
+    }
+
+    // Functions
+    protected void OnTriggerEnter(Collider otherCollider){
+        if(Hit(otherCollider) && !through) Destroy(gameObject);
+    }
+
+    protected virtual void Move(){
+        transform.position += direction.normalized * speed / 100;
+    }
+
+    protected void FixedUpdate(){
+        Move();
+        distanceTravelled += Vector3.Distance(transform.position, position);
+        position = transform.position;
+
+        if(distanceTravelled >= travelDistance) Destroy(gameObject);
+    }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Core/Objects/Projectiles/Projectile.cs.meta b/Assets/Scripts/Core/Objects/Weapons/ProjectileObject.cs.meta
similarity index 100%
rename from Assets/Scripts/Core/Objects/Projectiles/Projectile.cs.meta
rename to Assets/Scripts/Core/Objects/Weapons/ProjectileObject.cs.meta
diff --git a/Assets/Scripts/Core/Objects/Weapons/TestWeapon/TestProjectile.cs b/Assets/Scripts/Core/Objects/Weapons/TestWeapon/TestProjectile.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8782c7f6d1da4ff63cf4293b829343b8a18f36d7
--- /dev/null
+++ b/Assets/Scripts/Core/Objects/Weapons/TestWeapon/TestProjectile.cs
@@ -0,0 +1 @@
+public class TestProjectile : ProjectileObject{}
\ No newline at end of file
diff --git a/Assets/Scripts/Core/Objects/Projectiles/TestProjectile/TestProjectile.cs.meta b/Assets/Scripts/Core/Objects/Weapons/TestWeapon/TestProjectile.cs.meta
similarity index 100%
rename from Assets/Scripts/Core/Objects/Projectiles/TestProjectile/TestProjectile.cs.meta
rename to Assets/Scripts/Core/Objects/Weapons/TestWeapon/TestProjectile.cs.meta
diff --git a/Assets/Scripts/Core/Objects/Weapons/TestWeapon/TestWeapon.cs b/Assets/Scripts/Core/Objects/Weapons/TestWeapon/TestWeapon.cs
index 5fa42701c2695dc48e26125b130b6fe3ba96cd92..97c829e20bd014e7bf6c8f49e6aca5effbd9114f 100644
--- a/Assets/Scripts/Core/Objects/Weapons/TestWeapon/TestWeapon.cs
+++ b/Assets/Scripts/Core/Objects/Weapons/TestWeapon/TestWeapon.cs
@@ -3,10 +3,15 @@ using UnityEngine;
 public class TestWeapon : WeaponObject{
     // Constants
     private static readonly string hitboxPrefab = "Prefabs/Weapons/TestWeapon/WeaponHitbox";
+    private static readonly string projectilePrefab = "Prefabs/Weapons/TestWeapon/TestProjectile";
+    
+    // Attribute
+    [SerializeField] private float fireRange = 100;
+    [SerializeField] private float projectileSpeed = 100; 
 
     // Function
     public override void Attack(){
-        GameObject attackHitbox = ObjectFactory.CreateAttackObject(
+        AttackObject attackHitbox = ObjectFactory.CreateAttackObject(
             prefabPath: hitboxPrefab,
             damage: MathUtils.CalculateDamage(bearer.BaseDamage, BaseDamage),
             knockbackPower: KnockbackPower,
@@ -16,6 +21,24 @@ public class TestWeapon : WeaponObject{
             objectName: "TestWeapon Hitbox"
         );
 
-        ObjectFactory.Destroy(attackHitbox, 1f);
+        ObjectFactory.DestroyObject(attackHitbox, 1f);
+    }
+
+    public override void AttackAlternate(){
+        ProjectileObject attackProjectile = ObjectFactory.CreateAttackObject<ProjectileObject>(
+            prefabPath: projectilePrefab,
+            damage: MathUtils.CalculateDamage(bearer.BaseDamage, BaseDamage),
+            knockbackPower: KnockbackPower / 4,
+            type: bearerType,
+            position: transform.position,
+            rotation: bearer.Rotation,
+            knockbackOrigin: transform.position - (bearer.Front * projectileSpeed),
+            objectName: "TestWeapon Projectile"
+        );
+        attackProjectile.travelDistance = fireRange;
+        attackProjectile.speed = projectileSpeed;
+        attackProjectile.direction = bearer.Front;
+
+        ObjectFactory.DestroyObject(attackProjectile, 1f);
     }
 }
\ No newline at end of file
diff --git a/Assets/Scripts/Core/Objects/Weapons/WeaponObject.cs b/Assets/Scripts/Core/Objects/Weapons/WeaponObject.cs
index 26c4ecc20e3deb69e95558e0ad3f17900c981171..a9182287caa7c47cd967fceb5876e0286704f6bf 100644
--- a/Assets/Scripts/Core/Objects/Weapons/WeaponObject.cs
+++ b/Assets/Scripts/Core/Objects/Weapons/WeaponObject.cs
@@ -17,4 +17,5 @@ public abstract class WeaponObject : MonoBehaviour {
 
     // Functions
     public abstract void Attack();
+    public abstract void AttackAlternate();
 }
diff --git a/Assets/Scripts/Core/Player/Player.cs b/Assets/Scripts/Core/Player/Player.cs
index 24b9f6944163576cc9e221dedf26ec3a55973f08..76f4106ed1c18e28ee7748e4e1da7f79266ff2ae 100644
--- a/Assets/Scripts/Core/Player/Player.cs
+++ b/Assets/Scripts/Core/Player/Player.cs
@@ -3,7 +3,7 @@ using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
-public class Player : AccompaniableCombatant {
+public class Player : PlayerEntity {
     // Static attributes
     public static string ObjectIdPrefix = "Player"; 
 
@@ -19,10 +19,6 @@ public class Player : AccompaniableCombatant {
         base.Start();
         SetIdPrefix(ObjectIdPrefix);
         Health *= GameConfig.DIFFICULTY_MODIFIERS[GameSaveData.instance.difficulty].PlayerHealthMultiplier;
-        
-        // TODO: Review, base damage is currently done in the ObjectFactory. Might need to decide which is best
-        // BaseDamage *= GameConfig.DIFFICULTY_MODIFIERS[GameSaveData.instance.difficulty].PlayerDamageMultiplier;
-
         Weapon = GetComponentInChildren<WeaponObject>();
         stateController = new PlayerStateController(this);
         movementController = new PlayerMovementController(this);
diff --git a/Assets/Scripts/Core/Player/PlayerInputController.cs b/Assets/Scripts/Core/Player/PlayerInputController.cs
index 09084365b1c35f9a3587e4e1652141dbdfefd1a7..95ed043a66c86373f48c764703ea178b71b5af12 100644
--- a/Assets/Scripts/Core/Player/PlayerInputController.cs
+++ b/Assets/Scripts/Core/Player/PlayerInputController.cs
@@ -1,15 +1,17 @@
 using UnityEngine;
 
 public class PlayerInputController{
+    // Attributes
     private readonly Player player;
-
     public float movementInputX;
     public float movementInputZ;
     
+    // Constructor
     public PlayerInputController(Player player){
         this.player = player;
     }
 
+    // Functions
     public void HandleInputs(){
         movementInputX = Input.GetAxisRaw("Horizontal");
         movementInputZ = Input.GetAxisRaw("Vertical");
@@ -21,6 +23,13 @@ public class PlayerInputController{
 
             player.Weapon.Attack();
         }
+        else if(Input.GetKeyDown(GameControls.instance.attackAlternateButton)){
+            Debug.Log("Player is attacking (alternate)");
+
+            if(player.Weapon == null) return;
+
+            player.Weapon.AttackAlternate();
+        }
         else if(Input.GetKeyDown(GameControls.instance.interactButton)){
             Debug.Log("Player is interacting");
         
diff --git a/Assets/Scripts/Core/Player/PlayerStats.cs b/Assets/Scripts/Core/Player/PlayerStats.cs
index 1c5305ba28308610a8f914f9b008bdb875f345d6..b2a23fb4796821331e31b998e46a073ab9f35f2f 100644
--- a/Assets/Scripts/Core/Player/PlayerStats.cs
+++ b/Assets/Scripts/Core/Player/PlayerStats.cs
@@ -4,6 +4,8 @@ public class PlayerStats {
     // Attributes
     private readonly Player player;
     public float sprintModifier = 1.5f;
+
+    // Set-Getters
     public float Health {
         get => player.Health;
         set => player.Health = value;
diff --git a/Assets/Scripts/Library/BaseClasses/BaseObjectManager.cs b/Assets/Scripts/Library/BaseClasses/BaseObjectManager.cs
index b495b2ea417a20fe4224d11e7fd976de9194f0ae..18fcc3b802ca034e6685a92714e0a7d700b6dadc 100644
--- a/Assets/Scripts/Library/BaseClasses/BaseObjectManager.cs
+++ b/Assets/Scripts/Library/BaseClasses/BaseObjectManager.cs
@@ -2,7 +2,9 @@ using System.Collections.Generic;
 using UnityEngine;
 
 public class BaseObjectManager : MonoBehaviour{
+    // Attributes
     protected string ManagerName = "Manager";
+    
     // Functions
     public virtual void LogObjects(){
         WorldObject[] worldObjects = GetComponentsInChildren<WorldObject>();
diff --git a/Assets/Scripts/Library/BaseClasses/Controller/DamageableEntityStateController.cs b/Assets/Scripts/Library/BaseClasses/Controller/DamageableEntityStateController.cs
index aef8ae9518cfabf4e01483eaadd0c5b2617f84dd..4a5a18d5e6a29458906f080b3da7d6f3be8de7bf 100644
--- a/Assets/Scripts/Library/BaseClasses/Controller/DamageableEntityStateController.cs
+++ b/Assets/Scripts/Library/BaseClasses/Controller/DamageableEntityStateController.cs
@@ -6,11 +6,13 @@ public abstract class DamageableEntityStateController : EntityStateController {
     // Attributes
     private readonly DamageableEntity Entity;
     private float damagedDelay;
+    public event Action OnDamageDelayOverEvent;
+    
+    // Set-Getters
     public float DamagedDelay {
         get => damagedDelay;
         set => damagedDelay = value <= 0? GameConfig.DAMAGED_DELAY_DURATION : value;
     }
-    public event Action OnDamageDelayOverEvent;
 
     // Constructor
     public DamageableEntityStateController(DamageableEntity entity, float delay = 0){
diff --git a/Assets/Scripts/Library/BaseClasses/EntityObject/AttackObject.cs b/Assets/Scripts/Library/BaseClasses/EntityObject/AttackObject.cs
index e6f1bafefa8b473ad59b263d0d5f7c326fbf161f..cbf16f3451fda326ed5be4f21ee50797b8289ef6 100644
--- a/Assets/Scripts/Library/BaseClasses/EntityObject/AttackObject.cs
+++ b/Assets/Scripts/Library/BaseClasses/EntityObject/AttackObject.cs
@@ -4,8 +4,12 @@ using UnityEngine;
 // TODO: Review whether attack object should be classified as a world object
 public class AttackObject : MonoBehaviour, IAttack{
     // Attributes
+    private Vector3 knockbackOffset;
     [SerializeField] private float damage;
     [SerializeField] private float knockbackPower;
+    public event Action OnDamageEvent;
+    
+    // Set-Getters
     public float Damage { 
         get => damage; 
         set => damage = value; 
@@ -14,21 +18,28 @@ public class AttackObject : MonoBehaviour, IAttack{
         get => knockbackPower; 
         set => knockbackPower = value; 
     }
-    public Vector3 KnockbackOrigin{get; set;}
-    public event Action OnDamageEvent;
+    public Vector3 KnockbackOrigin{
+        get => transform.position + knockbackOffset;
+        set => knockbackOffset = KnockbackOrigin - transform.position;
+    }
+
+    
+    // Constructor
+    protected void Start(){
+        if(KnockbackOrigin == null) KnockbackOrigin = Vector3.zero;
+    }
 
     // Functions
     public void Knockback(IRigid rigidObject){
         var knockbackModifier = (-1) * knockbackPower / rigidObject.KnockbackResistance;
         Vector3 knockbackVector = MathUtils.GetDirectionVectorFlat(KnockbackOrigin, rigidObject.Position) * knockbackModifier;
         rigidObject.Rigidbody.AddForce(knockbackVector, ForceMode.Impulse);
-        Debug.Log(knockbackVector);
     }
 
-    protected void Hit(Collider otherCollider){
+    protected bool Hit(Collider otherCollider){
 
         otherCollider.transform.TryGetComponent<IDamageable>(out var damageableObject);
-        if(damageableObject == null) return;
+        if(damageableObject == null) return false;
         
         if(damageableObject.Damageable){
             Debug.Log(string.Format("Hit in hitbox of {0} by {1} with damage of {2}", transform.name, otherCollider.transform.name, Damage));
@@ -38,6 +49,10 @@ public class AttackObject : MonoBehaviour, IAttack{
 
             otherCollider.TryGetComponent<IRigid>(out var rigidObject);
             if(rigidObject != null) Knockback(rigidObject);
+
+            return true;
         }
+        
+        return false;
     }
 }
diff --git a/Assets/Scripts/Library/BaseClasses/Combatant.cs b/Assets/Scripts/Library/BaseClasses/EntityObject/CombatantEntity.cs
similarity index 73%
rename from Assets/Scripts/Library/BaseClasses/Combatant.cs
rename to Assets/Scripts/Library/BaseClasses/EntityObject/CombatantEntity.cs
index 2e6e17854f5af6415d3770b701923794c117e397..c67ac244786f762a3703f3719bc8ec2f1a241281 100644
--- a/Assets/Scripts/Library/BaseClasses/Combatant.cs
+++ b/Assets/Scripts/Library/BaseClasses/EntityObject/CombatantEntity.cs
@@ -1,10 +1,12 @@
 using System;
 using UnityEngine;
 
-public class Combatant : DamageableEntity, IArmed{
+public class CombatantEntity : DamageableEntity, IArmed{
     // Attributes
     [SerializeField] private float baseDamage;
     private WeaponObject weapon;
+    
+    // Set-Getters
     public float BaseDamage { 
         get => baseDamage;
         set => baseDamage = value;
@@ -13,8 +15,13 @@ public class Combatant : DamageableEntity, IArmed{
         get => weapon; 
         set => weapon = value;
     }
+    Vector3 IArmed.Front => Front;
+    Quaternion IArmed.Rotation => transform.rotation;
+
 
     // TODO: Test then decide whether to destroy/disable previous weapon
+
+
     public void SwapWeapon(WeaponObject newWeapon){
         Weapon = newWeapon;
     }
diff --git a/Assets/Scripts/Library/BaseClasses/Combatant.cs.meta b/Assets/Scripts/Library/BaseClasses/EntityObject/CombatantEntity.cs.meta
similarity index 100%
rename from Assets/Scripts/Library/BaseClasses/Combatant.cs.meta
rename to Assets/Scripts/Library/BaseClasses/EntityObject/CombatantEntity.cs.meta
diff --git a/Assets/Scripts/Library/BaseClasses/EntityObject/DamageableEntity.cs b/Assets/Scripts/Library/BaseClasses/EntityObject/DamageableEntity.cs
index 544e3516a4dda39019471785a79394c946aed6cc..a5aacf5121cd32190bb276cb73ca56a83fee9c9c 100644
--- a/Assets/Scripts/Library/BaseClasses/EntityObject/DamageableEntity.cs
+++ b/Assets/Scripts/Library/BaseClasses/EntityObject/DamageableEntity.cs
@@ -6,7 +6,11 @@ public class DamageableEntity : WorldEntity, IDamageable{
     private bool damageable = true;
     [SerializeField] private float maxHealth;
     [SerializeField] private float health;
+    public event Action OnDeathEvent;
+    public event Action OnDamagedEvent;
+    public event Action OnHealEvent;
 
+    // Set-Getters
     public float MaxHealth {
         get => maxHealth;
         set => maxHealth = value > 0? value : 0;
@@ -20,9 +24,6 @@ public class DamageableEntity : WorldEntity, IDamageable{
         set => damageable = value; 
     }
     public bool Dead => health <= 0;
-    public event Action OnDeathEvent;
-    public event Action OnDamagedEvent;
-    public event Action OnHealEvent;
 
     // Functions
     public float InflictDamage(float damage){
diff --git a/Assets/Scripts/Library/BaseClasses/AccompaniableCombatant.cs b/Assets/Scripts/Library/BaseClasses/EntityObject/PlayerEntity.cs
similarity index 73%
rename from Assets/Scripts/Library/BaseClasses/AccompaniableCombatant.cs
rename to Assets/Scripts/Library/BaseClasses/EntityObject/PlayerEntity.cs
index 17aed23a8fa329849101a2f24dbffe2ebd74c4c5..3d34d7f37d18f353276bef1d32690639e6ceeab7 100644
--- a/Assets/Scripts/Library/BaseClasses/AccompaniableCombatant.cs
+++ b/Assets/Scripts/Library/BaseClasses/EntityObject/PlayerEntity.cs
@@ -1,6 +1,6 @@
 using System.Collections.Generic;
 
-public class AccompaniableCombatant : Combatant, IAccompaniable{
+public class PlayerEntity : CombatantEntity, IAccompaniable{
     // Attributes
     private readonly List<Companions> companionList = new();    
     public List<Companions> Companions => companionList;
diff --git a/Assets/Scripts/Library/BaseClasses/AccompaniableCombatant.cs.meta b/Assets/Scripts/Library/BaseClasses/EntityObject/PlayerEntity.cs.meta
similarity index 100%
rename from Assets/Scripts/Library/BaseClasses/AccompaniableCombatant.cs.meta
rename to Assets/Scripts/Library/BaseClasses/EntityObject/PlayerEntity.cs.meta
diff --git a/Assets/Scripts/Library/BaseClasses/EntityObject/WorldEntity.cs b/Assets/Scripts/Library/BaseClasses/EntityObject/WorldEntity.cs
index 9e5369b455347701d80a9e3a6dee22f7553fe62d..be0e40ef715a6ecc0aa6bfe4627af1407c808b1f 100644
--- a/Assets/Scripts/Library/BaseClasses/EntityObject/WorldEntity.cs
+++ b/Assets/Scripts/Library/BaseClasses/EntityObject/WorldEntity.cs
@@ -7,6 +7,7 @@ public class WorldEntity : WorldObject, IRigid {
     private new Rigidbody rigidbody;
     private new Collider collider;
     
+    // Set-Getters
     public Rigidbody Rigidbody => rigidbody;
     public Collider Collider => collider;
     public Vector3 Position => transform.position;
diff --git a/Assets/Scripts/Library/BaseClasses/EntityObject/WorldObject.cs b/Assets/Scripts/Library/BaseClasses/EntityObject/WorldObject.cs
index 7495451c1faa7ed390ebdc3320267b77e2587e8d..222cc81df20319a5e7ba4a5b246916b2be52eee3 100644
--- a/Assets/Scripts/Library/BaseClasses/EntityObject/WorldObject.cs
+++ b/Assets/Scripts/Library/BaseClasses/EntityObject/WorldObject.cs
@@ -6,6 +6,8 @@ public class WorldObject : MonoBehaviour{
     private int NumberId; 
     private string Prefix;
     public string Id;
+    public Vector3 Front => transform.rotation * Vector3.forward;
+    public Quaternion Rotation => transform.rotation;
 
     // Constructor
     protected void Awake(){
diff --git a/Assets/Scripts/Library/Interfaces/IArmed.cs b/Assets/Scripts/Library/Interfaces/IArmed.cs
index da5d4b8a7a53a0458e72b42d4afe4b157c8bcaee..35c5e8ee2cdf469c9e03bf0c67099d0b893185ff 100644
--- a/Assets/Scripts/Library/Interfaces/IArmed.cs
+++ b/Assets/Scripts/Library/Interfaces/IArmed.cs
@@ -1,4 +1,8 @@
+using UnityEngine;
+
 public interface IArmed{
     public float BaseDamage { get; set; }
     public WeaponObject Weapon { get; set; }
+    public Vector3 Front { get; }
+    public Quaternion Rotation { get; }
 }
diff --git a/Assets/Scripts/Library/Util/ObjectFactory.cs b/Assets/Scripts/Library/Util/ObjectFactory.cs
index 3f5a7d748123a0a1e750b155825792fbf049fef2..a776c4afe627823dddf18b3e2c683d93414aef1f 100644
--- a/Assets/Scripts/Library/Util/ObjectFactory.cs
+++ b/Assets/Scripts/Library/Util/ObjectFactory.cs
@@ -3,7 +3,8 @@ using UnityEditor.Experimental.GraphView;
 using UnityEngine;
 
 public static class ObjectFactory{
-    public static GameObject CreateObject(
+    // Internal functions
+    private static GameObject CreateObject(
         GameObject gameObject,
         Transform parent = null,
         Vector3? position = null,
@@ -14,7 +15,7 @@ public static class ObjectFactory{
     ){
         GameObject returnObject = parent == null? GameObject.Instantiate(gameObject, ObjectManager.instance.transform) : GameObject.Instantiate(gameObject, parent);
         if(position != null) returnObject.transform.position = position.Value;
-        if(rotation != null) returnObject.transform.rotation = rotation.Value;
+        if(rotation != null) returnObject.transform.rotation *= rotation.Value;
         if(scale != null) returnObject.transform.localScale = Vector3.Scale(returnObject.transform.localScale, scale.Value);
         if(returnObject.TryGetComponent<Renderer>(out var renderer)) renderer.sortingOrder = renderingOrder;
         returnObject.name = objectName;
@@ -22,6 +23,7 @@ public static class ObjectFactory{
         return returnObject;
     }
 
+    // External functions
     public static GameObject CreateObject(
         string prefabPath,
         Transform parent = null,
@@ -36,7 +38,21 @@ public static class ObjectFactory{
         return CreateObject(prefabObject, parent, position, scale, rotation, renderingOrder, objectName);
     }
 
-    public static GameObject CreateAttackObject(
+    public static T CreateObject<T>(
+        string prefabPath,
+        Transform parent = null,
+        Vector3? position = null,
+        Vector3? scale = null,
+        Quaternion? rotation = null,
+        int renderingOrder = 0,
+        string objectName = "Unnamed Object"
+    ) where T : MonoBehaviour {
+        GameObject prefabObject = CreateObject(prefabPath, parent == null? ObjectManager.instance.transform : parent, position, scale, rotation, renderingOrder, objectName);
+        if(!prefabObject.TryGetComponent<T>(out var UnityObject)) Debug.LogError("Loaded prefab is not a a valid type: " + prefabPath);
+        return UnityObject;
+    }
+
+    public static AttackObject CreateAttackObject(
         string prefabPath,
         float damage,
         float knockbackPower,
@@ -49,8 +65,7 @@ public static class ObjectFactory{
         int renderingOrder = 0,
         string objectName = "Unnamed Object"
     ){
-        GameObject prefabObject = CreateObject(prefabPath, parent == null? ObjectManager.instance.transform : parent, position, scale, rotation, renderingOrder, objectName);
-        if(!prefabObject.TryGetComponent<IAttack>(out var attackObject)) Debug.LogError("Loaded prefab is not an IAttack: " + prefabPath);
+        AttackObject attackObject = CreateObject<AttackObject>(prefabPath, parent == null? ObjectManager.instance.transform : parent, position, scale, rotation, renderingOrder, objectName);
 
         attackObject.Damage = damage;
         attackObject.KnockbackPower = knockbackPower;
@@ -58,11 +73,11 @@ public static class ObjectFactory{
 
         switch (type){
             case AttackObjectType.PLAYER:
-                prefabObject.layer = LayerMask.NameToLayer(GameEnvironmentConfig.LAYER_PLAYER_ATTACK);
+                attackObject.gameObject.layer = LayerMask.NameToLayer(GameEnvironmentConfig.LAYER_PLAYER_ATTACK);
                 attackObject.Damage *= GameConfig.DIFFICULTY_MODIFIERS[GameSaveData.instance.difficulty].PlayerDamageMultiplier;
                 break;
             case AttackObjectType.ENEMY:
-                prefabObject.layer = LayerMask.NameToLayer(GameEnvironmentConfig.LAYER_ENEMY_ATTACK);
+                attackObject.gameObject.layer = LayerMask.NameToLayer(GameEnvironmentConfig.LAYER_ENEMY_ATTACK);
                 attackObject.Damage *= GameConfig.DIFFICULTY_MODIFIERS[GameSaveData.instance.difficulty].EnemyDamageMultiplier;
                 break;
             default:
@@ -70,9 +85,28 @@ public static class ObjectFactory{
                 break;
         }
 
-        return prefabObject;
+        return attackObject;
     }
 
+    public static T CreateAttackObject<T>(
+        string prefabPath,
+        float damage,
+        float knockbackPower,
+        Vector3 knockbackOrigin,
+        AttackObjectType type,
+        Transform parent = null,
+        Vector3? position = null,
+        Vector3? scale = null,
+        Quaternion? rotation = null,
+        int renderingOrder = 0,
+        string objectName = "Unnamed Object"
+    ) where T : AttackObject {
+        AttackObject attackObject = CreateAttackObject(prefabPath, damage, knockbackPower, knockbackOrigin, type, parent, position, scale, rotation, renderingOrder, objectName);
+        if(!attackObject.TryGetComponent<T>(out var UnityObject)) Debug.LogError("Loaded prefab is not a a valid type: " + prefabPath);
+        return UnityObject;
+    }
+
+
     public static Collectible CreateCollectibleObject(
         string prefabPath,
         Vector3? position = null,
@@ -81,10 +115,8 @@ public static class ObjectFactory{
         int renderingOrder = 0,
         string objectName = "Unnamed Object"
     ){
-        GameObject prefabObject = CreateObject(prefabPath, ObjectManager.instance.transform, position, scale, rotation, renderingOrder, objectName);
-        if(!prefabObject.TryGetComponent<Collectible>(out var collectible)) Debug.LogError("Loaded prefab is not a Collectible: " + prefabPath);
-        prefabObject.layer = LayerMask.NameToLayer(GameEnvironmentConfig.LAYER_COLLECTIBLE);
-
+        Collectible collectible = CreateObject<Collectible>(prefabPath, ObjectManager.instance.transform, position, scale, rotation, renderingOrder, objectName);
+        collectible.gameObject.layer = LayerMask.NameToLayer(GameEnvironmentConfig.LAYER_COLLECTIBLE);
         return collectible;
     }
 
@@ -96,14 +128,13 @@ public static class ObjectFactory{
         int renderingOrder = 0,
         string objectName = "Unnamed Object"
     ){
-        GameObject prefabObject = CreateObject(prefabPath, EntityManager.instance.transform, position, scale, rotation, renderingOrder, objectName);
-        if(!prefabObject.TryGetComponent<WorldEntity>(out var entity)) Debug.LogError("Loaded prefab is not an entity: " + prefabPath);
-        return entity;
+        WorldEntity prefabObject = CreateObject<WorldEntity>(prefabPath, EntityManager.instance.transform, position, scale, rotation, renderingOrder, objectName);
+        return prefabObject;
     }
 
-    public static void Destroy(GameObject gameObject, float delay = 0){
+    public static void DestroyObject(MonoBehaviour gameObject, float delay = 0){
         if(gameObject == null) return;
-        GameController.instance.StartCoroutine(DestroyWithDelay(gameObject, delay));
+        GameController.instance.StartCoroutine(DestroyWithDelay(gameObject.gameObject, delay));
     }
 
     private static IEnumerator DestroyWithDelay(GameObject gameObject, float delay){