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){