From 9261b9f00ff2a58b91a6a1d0269029d4cba6205d Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 11 Jul 2025 21:58:19 +0200 Subject: [PATCH] Add WeaponStats class and update damage calculations for ranged and melee attacks --- Assets/Prefabs/Projectile.prefab | 4 +- Assets/Scenes/main.unity | 238 +++++++++++++++++- Assets/Scripts/Data/WeaponStats.cs | 10 + Assets/Scripts/Data/WeaponStats.cs.meta | 3 + .../Interfaces/IDamageInflectorSetup.cs | 3 +- Assets/Scripts/Weapons/AutoWeapon.cs | 2 +- Assets/Scripts/Weapons/MeleeAttack.cs | 2 +- Assets/Scripts/Weapons/Projectile.cs | 12 +- Assets/Scripts/Weapons/Weapon.cs | 3 + ProjectSettings/TagManager.asset | 11 +- 10 files changed, 276 insertions(+), 12 deletions(-) create mode 100644 Assets/Scripts/Data/WeaponStats.cs create mode 100644 Assets/Scripts/Data/WeaponStats.cs.meta diff --git a/Assets/Prefabs/Projectile.prefab b/Assets/Prefabs/Projectile.prefab index 872fec4..5fccfd8 100644 --- a/Assets/Prefabs/Projectile.prefab +++ b/Assets/Prefabs/Projectile.prefab @@ -130,7 +130,7 @@ Rigidbody2D: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4455660151786346708} - m_BodyType: 0 + m_BodyType: 1 m_Simulated: 1 m_UseFullKinematicContacts: 0 m_UseAutoMass: 0 @@ -179,7 +179,7 @@ CircleCollider2D: m_CallbackLayers: serializedVersion: 2 m_Bits: 4294967295 - m_IsTrigger: 0 + m_IsTrigger: 1 m_UsedByEffector: 0 m_CompositeOperation: 0 m_CompositeOrder: 0 diff --git a/Assets/Scenes/main.unity b/Assets/Scenes/main.unity index 1ecf6b3..9ae8fa8 100644 --- a/Assets/Scenes/main.unity +++ b/Assets/Scenes/main.unity @@ -119,6 +119,93 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &401545662 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 401545663} + - component: {fileID: 401545664} + m_Layer: 0 + m_Name: Square + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &401545663 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 401545662} + 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: 2062887720} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &401545664 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 401545662} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + 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: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3} + m_Color: {r: 0.8018868, g: 0.23829654, b: 0.23829654, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 --- !u!1 &519420028 GameObject: m_ObjectHideFlags: 0 @@ -561,7 +648,7 @@ GameObject: - component: {fileID: 1261447605} m_Layer: 0 m_Name: Player - m_TagString: Untagged + m_TagString: Player m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 @@ -831,8 +918,156 @@ MonoBehaviour: m_EditorClassIdentifier: cooldown: 1 character: {fileID: 1261447603} + weaponStats: + Damage: 10 projectilePrefab: {fileID: 4455660151786346708, guid: 5c8ef2a68bd248674af5c1f68f7fc012, type: 3} firePoint: {fileID: 523621673} +--- !u!1 &2062887715 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2062887720} + - component: {fileID: 2062887719} + - component: {fileID: 2062887718} + - component: {fileID: 2062887717} + - component: {fileID: 2062887716} + m_Layer: 0 + m_Name: Test Enemy + m_TagString: Enemy + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2062887716 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2062887715} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9139aea24fd54a5eb0f5fc1556478cb6, type: 3} + m_Name: + m_EditorClassIdentifier: + character: {fileID: 2062887717} + initialHealth: 100 +--- !u!114 &2062887717 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2062887715} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 44b572240c4243c9954bd19967bfeb64, type: 3} + m_Name: + m_EditorClassIdentifier: + attributes: + health: 100 + maxHealth: 100 + moveSpeed: 5 + luck: 0 + armor: 0 + damage: 1 + rangedDamage: 1 + meleeDamage: 1 + attackRange: 16 + attackSpeed: 1 +--- !u!50 &2062887718 +Rigidbody2D: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2062887715} + m_BodyType: 0 + m_Simulated: 1 + m_UseFullKinematicContacts: 0 + m_UseAutoMass: 0 + m_Mass: 1 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_GravityScale: 0 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_Interpolate: 0 + m_SleepingMode: 1 + m_CollisionDetection: 0 + m_Constraints: 4 +--- !u!61 &2062887719 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2062887715} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0} + m_SpriteTilingProperty: + border: {x: 0, y: 0, z: 0, w: 0} + pivot: {x: 0, y: 0} + oldSize: {x: 0, y: 0} + newSize: {x: 0, y: 0} + adaptiveTilingThreshold: 0 + drawMode: 0 + adaptiveTiling: 0 + m_AutoTiling: 0 + m_Size: {x: 1, y: 1} + m_EdgeRadius: 0 +--- !u!4 &2062887720 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2062887715} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 6.56, y: 3.81, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 401545663} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -841,3 +1076,4 @@ SceneRoots: - {fileID: 619394802} - {fileID: 1261447604} - {fileID: 541374775} + - {fileID: 2062887720} diff --git a/Assets/Scripts/Data/WeaponStats.cs b/Assets/Scripts/Data/WeaponStats.cs new file mode 100644 index 0000000..2e22f61 --- /dev/null +++ b/Assets/Scripts/Data/WeaponStats.cs @@ -0,0 +1,10 @@ +using System; + +namespace Data +{ + [Serializable] + public class WeaponStats + { + public float Damage; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Data/WeaponStats.cs.meta b/Assets/Scripts/Data/WeaponStats.cs.meta new file mode 100644 index 0000000..3640721 --- /dev/null +++ b/Assets/Scripts/Data/WeaponStats.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e2700a792f804e87b78c0889a7f6c2e4 +timeCreated: 1752263631 \ No newline at end of file diff --git a/Assets/Scripts/Interfaces/IDamageInflectorSetup.cs b/Assets/Scripts/Interfaces/IDamageInflectorSetup.cs index 4e5bdf5..7b40f82 100644 --- a/Assets/Scripts/Interfaces/IDamageInflectorSetup.cs +++ b/Assets/Scripts/Interfaces/IDamageInflectorSetup.cs @@ -1,9 +1,10 @@ using Data; +using JetBrains.Annotations; namespace Interfaces { public interface IDamageInflectorSetup { - void Setup(Character attacker); + void Setup(Character attacker, [CanBeNull] WeaponStats weaponStats = null); } } \ No newline at end of file diff --git a/Assets/Scripts/Weapons/AutoWeapon.cs b/Assets/Scripts/Weapons/AutoWeapon.cs index 0e7b131..7716d88 100644 --- a/Assets/Scripts/Weapons/AutoWeapon.cs +++ b/Assets/Scripts/Weapons/AutoWeapon.cs @@ -13,7 +13,7 @@ namespace Weapons var projectile = Instantiate(projectilePrefab, firePoint.position, firePoint.rotation); projectile.TryGetComponent(out var inflector); - inflector?.Setup(character); + inflector?.Setup(character, weaponStats); } } } \ No newline at end of file diff --git a/Assets/Scripts/Weapons/MeleeAttack.cs b/Assets/Scripts/Weapons/MeleeAttack.cs index fd1306e..3004932 100644 --- a/Assets/Scripts/Weapons/MeleeAttack.cs +++ b/Assets/Scripts/Weapons/MeleeAttack.cs @@ -19,7 +19,7 @@ namespace Weapons hit.TryGetComponent(out var health); if (hit.gameObject == character.gameObject) continue; - var damage = character.attributes.Damage * character.attributes.MeleeDamage; + var damage = weaponStats.Damage + character.attributes.Damage * character.attributes.MeleeDamage; health.TakeDamage(damage); } } diff --git a/Assets/Scripts/Weapons/Projectile.cs b/Assets/Scripts/Weapons/Projectile.cs index e121ca0..005122f 100644 --- a/Assets/Scripts/Weapons/Projectile.cs +++ b/Assets/Scripts/Weapons/Projectile.cs @@ -17,9 +17,17 @@ namespace Weapons public GameObject Owner { get; private set; } public DamageType Type => DamageType.Ranged; - public void Setup(Character attacker) + public void Setup(Character attacker, WeaponStats weaponStats = null) { - Damage = attacker.attributes.Damage * attacker.attributes.RangedDamage; + if (weaponStats != null) + { + Damage = weaponStats.Damage + attacker.attributes.Damage * attacker.attributes.RangedDamage; + } + else + { + Damage = attacker.attributes.Damage * attacker.attributes.RangedDamage; + } + Owner = attacker.gameObject; } diff --git a/Assets/Scripts/Weapons/Weapon.cs b/Assets/Scripts/Weapons/Weapon.cs index 3d08ede..c4752ba 100644 --- a/Assets/Scripts/Weapons/Weapon.cs +++ b/Assets/Scripts/Weapons/Weapon.cs @@ -1,6 +1,8 @@ using System; using Data; using Interfaces; +using Sirenix.OdinInspector; +using Sirenix.Serialization; using UnityEngine; namespace Weapons @@ -11,6 +13,7 @@ namespace Weapons [SerializeField] private float cooldown = 1f; [SerializeField] protected Character character; + [OdinSerialize, InlineProperty] public WeaponStats weaponStats = new(); private void Update() { diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index 1c92a78..8ddcff7 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -2,8 +2,9 @@ %TAG !u! tag:unity3d.com,2011: --- !u!78 &1 TagManager: - serializedVersion: 2 - tags: [] + serializedVersion: 3 + tags: + - Enemy layers: - Default - TransparentFX @@ -11,8 +12,8 @@ TagManager: - - Water - UI - - - - + - Player + - Enemy - - - @@ -41,3 +42,5 @@ TagManager: - name: Default uniqueID: 0 locked: 0 + m_RenderingLayers: + - Default