From 5f3094564ee9dcb0f270782df2258a124d38a4ed Mon Sep 17 00:00:00 2001 From: MuhamadAjiW <16521119@mahasiswa.itb.ac.id> Date: Sat, 20 Apr 2024 15:05:37 +0700 Subject: [PATCH] fix: knockback calculation --- Assets/Scenes/SampleScene.unity | 203 +++++++++++++++++- .../BaseClasses/EntityObject/AttackEntity.cs | 38 ---- .../EntityObject/AttackEntity.cs.meta | 11 - .../BaseClasses/EntityObject/AttackObject.cs | 2 +- .../EntityObject/DamageableObject.cs | 42 ---- .../EntityObject/DamageableObject.cs.meta | 11 - Assets/Scripts/Library/Util/MathUtil.cs | 4 +- ProjectSettings/TagManager.asset | 4 +- 8 files changed, 207 insertions(+), 108 deletions(-) delete mode 100644 Assets/Scripts/Library/BaseClasses/EntityObject/AttackEntity.cs delete mode 100644 Assets/Scripts/Library/BaseClasses/EntityObject/AttackEntity.cs.meta delete mode 100644 Assets/Scripts/Library/BaseClasses/EntityObject/DamageableObject.cs delete mode 100644 Assets/Scripts/Library/BaseClasses/EntityObject/DamageableObject.cs.meta diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 904f3548..6f5bf0d1 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -154,6 +154,7 @@ MonoBehaviour: m_EditorClassIdentifier: backButton: 27 attackButton: 122 + interactButton: 120 --- !u!4 &6125823 Transform: m_ObjectHideFlags: 0 @@ -183,7 +184,7 @@ GameObject: - component: {fileID: 117855958} m_Layer: 6 m_Name: Player - m_TagString: Untagged + m_TagString: Player m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 @@ -265,6 +266,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bbd12f0cc12b22743998413b3f14b197, type: 3} m_Name: m_EditorClassIdentifier: + Id: knockbackResistance: 1 baseSpeed: 10 maxHealth: 100 @@ -317,6 +319,7 @@ Transform: - {fileID: 963194228} - {fileID: 484130345} - {fileID: 1098815287} + - {fileID: 2127634081} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &484130344 @@ -505,6 +508,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 36e5aa8cb18425941b8dede35c491e0e, type: 3} m_Name: m_EditorClassIdentifier: + Id: knockbackResistance: 1 baseSpeed: 0 maxHealth: 100000 @@ -814,6 +818,75 @@ Animator: m_AllowConstantClipSamplingOptimization: 1 m_KeepAnimatorStateOnDisable: 0 m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &766737619 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 766737620} + - component: {fileID: 766737622} + - component: {fileID: 766737621} + m_Layer: 0 + m_Name: TestCollectible + m_TagString: Collectible + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &766737620 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 766737619} + 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: 1792976464} + m_Father: {fileID: 2127634081} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &766737621 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 766737619} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6a318ebd05eb15c4fabf9cbe7355eb41, type: 3} + m_Name: + m_EditorClassIdentifier: + Id: + TimeToLive: 5 +--- !u!135 &766737622 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 766737619} + 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!1 &770593019 GameObject: m_ObjectHideFlags: 0 @@ -1184,6 +1257,134 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1374546118} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1792976463 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1792976464} + - component: {fileID: 1792976466} + - component: {fileID: 1792976465} + m_Layer: 0 + m_Name: Model + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1792976464 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792976463} + 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: 766737620} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1792976465 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792976463} + 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!33 &1792976466 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792976463} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2127634080 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2127634081} + - component: {fileID: 2127634082} + m_Layer: 0 + m_Name: ObjectManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2127634081 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2127634080} + 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: + - {fileID: 766737620} + m_Father: {fileID: 239523007} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2127634082 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2127634080} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c051aae39aef0264ba144bc30cbe301e, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1001 &4718921866596059802 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Library/BaseClasses/EntityObject/AttackEntity.cs b/Assets/Scripts/Library/BaseClasses/EntityObject/AttackEntity.cs deleted file mode 100644 index 82afa323..00000000 --- a/Assets/Scripts/Library/BaseClasses/EntityObject/AttackEntity.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using UnityEngine; - -public class AttackEntity : WorldEntity, IAttack{ - // Attributes - [SerializeField] private float damage; - [SerializeField] private float knockbackPower; - public float Damage { - get => damage; - set => damage = value; - } - public float KnockbackPower { - get => KnockbackPower; - set => KnockbackPower = value; - } - public Vector3 KnockbackOrigin{get; set;} - public event Action OnDamageEvent; - - // Functions - public void Knockback(IRigid rigidObject){ - var knockbackModifier = (-1) * knockbackPower / rigidObject.KnockbackResistance; - Vector3 knockbackVector = MathUtils.GetDirectionVector(KnockbackOrigin, rigidObject.Position) * knockbackModifier; - rigidObject.Rigidbody.AddForce(knockbackVector, ForceMode.Impulse); - } - - protected void Hit(Collider otherCollider){ - otherCollider.transform.TryGetComponent<IDamageable>(out var damageableObject); - if(damageableObject == null) return; - - if(damageableObject.Damageable){ - damageableObject.InflictDamage(Damage); - OnDamageEvent?.Invoke(); - - otherCollider.TryGetComponent<IRigid>(out var rigidObject); - if(rigidObject != null) Knockback(rigidObject); - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/Library/BaseClasses/EntityObject/AttackEntity.cs.meta b/Assets/Scripts/Library/BaseClasses/EntityObject/AttackEntity.cs.meta deleted file mode 100644 index c92870b2..00000000 --- a/Assets/Scripts/Library/BaseClasses/EntityObject/AttackEntity.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 54e836638d4a3a241aa694416c794985 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Library/BaseClasses/EntityObject/AttackObject.cs b/Assets/Scripts/Library/BaseClasses/EntityObject/AttackObject.cs index 8c23b46a..e6f1bafe 100644 --- a/Assets/Scripts/Library/BaseClasses/EntityObject/AttackObject.cs +++ b/Assets/Scripts/Library/BaseClasses/EntityObject/AttackObject.cs @@ -20,7 +20,7 @@ public class AttackObject : MonoBehaviour, IAttack{ // Functions public void Knockback(IRigid rigidObject){ var knockbackModifier = (-1) * knockbackPower / rigidObject.KnockbackResistance; - Vector3 knockbackVector = MathUtils.GetDirectionVector(KnockbackOrigin, rigidObject.Position) * knockbackModifier; + Vector3 knockbackVector = MathUtils.GetDirectionVectorFlat(KnockbackOrigin, rigidObject.Position) * knockbackModifier; rigidObject.Rigidbody.AddForce(knockbackVector, ForceMode.Impulse); Debug.Log(knockbackVector); } diff --git a/Assets/Scripts/Library/BaseClasses/EntityObject/DamageableObject.cs b/Assets/Scripts/Library/BaseClasses/EntityObject/DamageableObject.cs deleted file mode 100644 index 927c4e8c..00000000 --- a/Assets/Scripts/Library/BaseClasses/EntityObject/DamageableObject.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using UnityEngine; - -public class DamageableObject : WorldObject, IDamageable{ - // Attributes - private bool damageable = true; - [SerializeField] private float maxHealth; - [SerializeField] private float health; - - public float MaxHealth { - get => maxHealth; - set => maxHealth = value > 0? value : 0; - } - public float Health { - get => health; - set => health = value > 0? (value > MaxHealth? MaxHealth : value) : 0; - } - public bool Damageable { - get => damageable; - 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){ - Health -= damage; - OnDamagedEvent?.Invoke(); - if(Dead) OnDeathEvent?.Invoke(); - - return Health; - } - - public float InflictHeal(float heal){ - Health += heal; - OnHealEvent?.Invoke(); - - return Health; - } -} diff --git a/Assets/Scripts/Library/BaseClasses/EntityObject/DamageableObject.cs.meta b/Assets/Scripts/Library/BaseClasses/EntityObject/DamageableObject.cs.meta deleted file mode 100644 index f4624cd6..00000000 --- a/Assets/Scripts/Library/BaseClasses/EntityObject/DamageableObject.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dd6098adc98e03648b9f5ee6bd1efb8f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Library/Util/MathUtil.cs b/Assets/Scripts/Library/Util/MathUtil.cs index ac69919f..7188bcf2 100644 --- a/Assets/Scripts/Library/Util/MathUtil.cs +++ b/Assets/Scripts/Library/Util/MathUtil.cs @@ -1,8 +1,8 @@ using UnityEngine; public static class MathUtils{ - public static Vector3 GetDirectionVector(Vector3 origin, Vector3 target){ - Vector3 direction = origin - target; + public static Vector3 GetDirectionVectorFlat(Vector3 origin, Vector3 target){ + Vector3 direction = new(origin.x - target.x, 0, origin.z - target.z); return direction.normalized; } diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index c7e81253..2ad472a7 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -6,7 +6,7 @@ TagManager: tags: - Ground - Enemy - - Collectibles + - Collectible layers: - Default - TransparentFX @@ -18,7 +18,7 @@ TagManager: - Enemy - PlayerAttack - EnemyAttack - - + - Collectible - - - -- GitLab