From b46d8b66e872d237ba9cb00f151863c08092d9cc Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 28 May 2025 13:38:52 -0400 Subject: [PATCH 1/4] created Rider prefab and assets + added test spawn button --- .../UI/cards/icons/icon_card_rider.png | Bin 0 -> 7990 bytes .../UI/cards/icons/icon_card_rider.png.meta | 135 ++ Assets/Design/UnitCards/Rider.asset | 18 + Assets/Design/UnitCards/Rider.asset.meta | 8 + .../Design/UnitUpgrades/Upgrade_Rider.asset | 17 + .../UnitUpgrades/Upgrade_Rider.asset.meta | 8 + Assets/Prefabs/Sticks/riderStick.prefab | 1691 +++++++++++++++++ Assets/Prefabs/Sticks/riderStick.prefab.meta | 7 + .../UnitPlacementButtons.prefab | 301 ++- Assets/Scripts/Ally/Rider.cs | 76 + Assets/Scripts/Ally/Rider.cs.meta | 11 + 11 files changed, 2223 insertions(+), 49 deletions(-) create mode 100644 Assets/Art/Sprites/UI/cards/icons/icon_card_rider.png create mode 100644 Assets/Art/Sprites/UI/cards/icons/icon_card_rider.png.meta create mode 100644 Assets/Design/UnitCards/Rider.asset create mode 100644 Assets/Design/UnitCards/Rider.asset.meta create mode 100644 Assets/Design/UnitUpgrades/Upgrade_Rider.asset create mode 100644 Assets/Design/UnitUpgrades/Upgrade_Rider.asset.meta create mode 100644 Assets/Prefabs/Sticks/riderStick.prefab create mode 100644 Assets/Prefabs/Sticks/riderStick.prefab.meta create mode 100644 Assets/Scripts/Ally/Rider.cs create mode 100644 Assets/Scripts/Ally/Rider.cs.meta diff --git a/Assets/Art/Sprites/UI/cards/icons/icon_card_rider.png b/Assets/Art/Sprites/UI/cards/icons/icon_card_rider.png new file mode 100644 index 0000000000000000000000000000000000000000..796a72be06b1fba8d68266063fafdfacc212ea76 GIT binary patch literal 7990 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 AttackInterval) + { + + Animation.PlayAttackAnim(); + + AttackSpeedWait = 0f; + } + + AttackSpeedWait += Time.deltaTime; + } + + void AttackEnemy() + { + //Attack Cooldown + if (AttackSpeedWait > AttackInterval) + { + + Animation.PlayAttackAnim(); + + AttackSpeedWait = 0f; + } + + AttackSpeedWait += Time.deltaTime; + } +} diff --git a/Assets/Scripts/Ally/Rider.cs.meta b/Assets/Scripts/Ally/Rider.cs.meta new file mode 100644 index 0000000..695e1f5 --- /dev/null +++ b/Assets/Scripts/Ally/Rider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a0092e8a906da7a4fa0aca6e274a8c5e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 23ecdd6ab4c93636169a37aa50ff24139ad0afce Mon Sep 17 00:00:00 2001 From: Adam Hamid Salah Salah Date: Wed, 28 May 2025 19:16:04 -0400 Subject: [PATCH 2/4] Added a OnTriggerExit2D to stop attack when entity not detected --- Assets/Scripts/Detection.cs | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/Assets/Scripts/Detection.cs b/Assets/Scripts/Detection.cs index 0dc117c..0225fb3 100644 --- a/Assets/Scripts/Detection.cs +++ b/Assets/Scripts/Detection.cs @@ -24,7 +24,7 @@ public class Detection : MonoBehaviour } // Looped detection every 'delay' amount - private IEnumerator C_DetectCoroutine() + private IEnumerator C_DetectCoroutine() { // Can happen if unit dies if (_entityLinked == null) yield break; @@ -66,12 +66,12 @@ public class Detection : MonoBehaviour } } - private void OnTriggerStay2D(Collider2D other) + private void OnTriggerStay2D(Collider2D other) { - if(_entityLinked != null && _projectileDamage == 0) + if (_entityLinked != null && _projectileDamage == 0) { GameObject detected = other.gameObject; - string tagToCheck = + string tagToCheck = (_entityLinked.gameObject.tag == "Ally") ? "Opponent" : "Ally"; if (detected.tag == tagToCheck) @@ -82,7 +82,25 @@ public class Detection : MonoBehaviour detectedEntities.Add(entity); } } - } + } + } + + private void OnTriggerExit2D(Collider2D other) + { + if (_entityLinked != null) + { + GameObject detected = other.gameObject; + string tagToCheck = + (_entityLinked.gameObject.tag == "Ally") ? "Opponent" : "Ally"; + if (detected.tag == tagToCheck) + { + Entity entity = other.GetComponent(); + if (detectedEntities.Contains(entity)) + { + detectedEntities.Remove(entity); + } + } + } } public Entity GetClosest() From f28e57eeb718e54e6d05bf7c0c2f1299490c3224 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 23 Jun 2025 21:13:36 -0400 Subject: [PATCH 3/4] charging implemented --- Assets/Prefabs/Sticks/riderStick.prefab | 88 +++++++++++++++++++++++-- Assets/Scripts/Ally/Rider.cs | 62 +++++++++++------ Assets/Scripts/Detection.cs | 15 +++++ 3 files changed, 138 insertions(+), 27 deletions(-) diff --git a/Assets/Prefabs/Sticks/riderStick.prefab b/Assets/Prefabs/Sticks/riderStick.prefab index d1ff0bf..51b03d7 100644 --- a/Assets/Prefabs/Sticks/riderStick.prefab +++ b/Assets/Prefabs/Sticks/riderStick.prefab @@ -939,7 +939,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c0fbd934c179894458914437255781c4, type: 3} m_Name: m_EditorClassIdentifier: - _entity: {fileID: 0} + _entity: {fileID: 6519347188559722835} _projectile: {fileID: 0} _projectileSpawn: {fileID: 0} --- !u!1 &2230360378224361585 @@ -1095,6 +1095,7 @@ Transform: - {fileID: 2230360378000122420} - {fileID: 2230360378127571587} - {fileID: 9128510391006626171} + - {fileID: 4282222811149129398} - {fileID: 7758425403302365699} m_Father: {fileID: 0} m_RootOrder: 0 @@ -1113,12 +1114,15 @@ MonoBehaviour: m_EditorClassIdentifier: _lifeBar: {fileID: 5807970101048976302} _hp: 30 - _speed: 1 + _speed: 2 _attack_damage: 3 _attack_interval: 2 _enemy: {fileID: 0} - _maxChargeHitCount: 2 - _maxChargeDistance: 5 + _detection: {fileID: 9048754633958631738} + _chargeDetection: {fileID: 4280547952316628076} + _root: {fileID: 2230360378127571586} + _maxChargeHitCount: 3 + _maxChargeDistance: 10 --- !u!1839735485 &3032268583489863936 Tilemap: m_ObjectHideFlags: 0 @@ -1314,6 +1318,78 @@ AudioSource: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 +--- !u!1 &4280547952316628076 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4282222811149129398} + - component: {fileID: 7206814474656499620} + - component: {fileID: 262912998092095710} + m_Layer: 6 + m_Name: detection_charge + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4282222811149129398 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4280547952316628076} + 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: 2230360378425099703} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!61 &7206814474656499620 +BoxCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4280547952316628076} + m_Enabled: 1 + m_Density: 1 + m_Material: {fileID: 0} + m_IsTrigger: 1 + m_UsedByEffector: 0 + m_UsedByComposite: 0 + m_Offset: {x: 1.7450686, 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 + serializedVersion: 2 + m_Size: {x: 0.509863, y: 0.5} + m_EdgeRadius: 0 +--- !u!114 &262912998092095710 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4280547952316628076} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 531d7966d86bd0c4d83baf58bcb56cd5, type: 3} + m_Name: + m_EditorClassIdentifier: + _entityLinked: {fileID: 6519347188559722835} --- !u!1 &4877457871086946352 GameObject: m_ObjectHideFlags: 0 @@ -1430,7 +1506,7 @@ Transform: m_Children: - {fileID: 430301385815424918} m_Father: {fileID: 2230360378425099703} - m_RootOrder: 3 + m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &5807970101048976302 MonoBehaviour: @@ -1520,7 +1596,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 531d7966d86bd0c4d83baf58bcb56cd5, type: 3} m_Name: m_EditorClassIdentifier: - _entityLinked: {fileID: 0} + _entityLinked: {fileID: 6519347188559722835} --- !u!1 &9102431410695186542 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Ally/Rider.cs b/Assets/Scripts/Ally/Rider.cs index 4c998ad..3145c5b 100644 --- a/Assets/Scripts/Ally/Rider.cs +++ b/Assets/Scripts/Ally/Rider.cs @@ -4,37 +4,65 @@ using UnityEngine; public class Rider : Ally { + [SerializeField] + private GameObject _detection; + [SerializeField] + private GameObject _chargeDetection; + private Detection _chargeDetectionScript; + [SerializeField] + private GameObject _root; + private Root _rootScript; + private Vector2 _movementVector = Vector2.zero; + private bool _isCharging; [SerializeField] private int _maxChargeHitCount; + private List _opponentsHit = new List(); [SerializeField] private int _maxChargeDistance; - private int _opponentsHit; - private float _originalPosX; - private float _originalPosY; - private bool _isCharging; - + private Vector3 _originalPos; public override void Start() { base.Start(); - _originalPosX = transform.position.x; - _originalPosY = transform.position.y; + _chargeDetectionScript = _chargeDetection.GetComponent(); + _rootScript = _root.GetComponent(); + + _originalPos = transform.position; _isCharging = true; } public override void Update() { - base.Update(); - if (_isCharging) { + _detection.SetActive(false); + _chargeDetection.SetActive(true); + + // movement _movementVector.x = Time.deltaTime * Speed; transform.position += (Vector3)_movementVector; - if (true) - { + // attack + if (IsEnemyDetected && !_opponentsHit.Contains(Enemy)) + { + AttackEnemyRiding(); + } + + // reset + if (transform.position.x - _originalPos.x >= _maxChargeDistance || _opponentsHit.Count >= _maxChargeHitCount) + { + _isCharging = false; + _movementVector = Vector2.zero; + transform.position = _originalPos; + _opponentsHit.Clear(); + + IsEnemyDetected = false; + Enemy = null; + + _detection.SetActive(true); + _chargeDetection.SetActive(false); } } else @@ -48,16 +76,8 @@ public class Rider : Ally void AttackEnemyRiding() { - //Attack Cooldown - if (AttackSpeedWait > AttackInterval) - { - - Animation.PlayAttackAnim(); - - AttackSpeedWait = 0f; - } - - AttackSpeedWait += Time.deltaTime; + _rootScript.Attack(); + _opponentsHit.Add(Enemy); } void AttackEnemy() diff --git a/Assets/Scripts/Detection.cs b/Assets/Scripts/Detection.cs index 0225fb3..ef419d1 100644 --- a/Assets/Scripts/Detection.cs +++ b/Assets/Scripts/Detection.cs @@ -15,12 +15,27 @@ public class Detection : MonoBehaviour // If it's a projectile damage > 0 private int _projectileDamage = 0; + private bool _hasStartBeenCalled = false; + protected virtual void Start() { _collider = GetComponent(); detectionRange = _collider.size; StartCoroutine(C_DetectCoroutine()); + + _hasStartBeenCalled = true; + } + + // Checks if Start ran once already. + // onEnable runs by default before Start so not everything is initialized. + // And I don't want to reinitialize the collider everytime I re-enable a unit's detection. + protected void OnEnable() + { + if (_hasStartBeenCalled) + { + StartCoroutine(C_DetectCoroutine()); + } } // Looped detection every 'delay' amount From 228e16b2b4165c792497e0e7f8661f6fbbadd84f Mon Sep 17 00:00:00 2001 From: Adam Hamid Salah Salah Date: Thu, 26 Jun 2025 14:32:44 -0400 Subject: [PATCH 4/4] charge damage and cooldown implemented --- .../BaseStick/animator_baseStick.controller | 2 +- Assets/Prefabs/Sticks/riderStick.prefab | 6 ++-- Assets/Scripts/Ally/Rider.cs | 36 ++++++++++++++----- Assets/Scripts/Root.cs | 12 +++++++ 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/Assets/Animations/Sticks/BaseStick/animator_baseStick.controller b/Assets/Animations/Sticks/BaseStick/animator_baseStick.controller index c8be080..50cef6d 100644 --- a/Assets/Animations/Sticks/BaseStick/animator_baseStick.controller +++ b/Assets/Animations/Sticks/BaseStick/animator_baseStick.controller @@ -36,7 +36,7 @@ AnimatorController: m_DefaultFloat: 0 m_DefaultInt: 0 m_DefaultBool: 0 - m_Controller: {fileID: 9100000} + m_Controller: {fileID: 0} m_AnimatorLayers: - serializedVersion: 5 m_Name: Base Layer diff --git a/Assets/Prefabs/Sticks/riderStick.prefab b/Assets/Prefabs/Sticks/riderStick.prefab index 51b03d7..334ad27 100644 --- a/Assets/Prefabs/Sticks/riderStick.prefab +++ b/Assets/Prefabs/Sticks/riderStick.prefab @@ -1118,11 +1118,13 @@ MonoBehaviour: _attack_damage: 3 _attack_interval: 2 _enemy: {fileID: 0} + _chargeAttackDamage: 5 + _chargeCooldown: 5 + _maxChargeHitCount: 3 + _maxChargeDistance: 10 _detection: {fileID: 9048754633958631738} _chargeDetection: {fileID: 4280547952316628076} _root: {fileID: 2230360378127571586} - _maxChargeHitCount: 3 - _maxChargeDistance: 10 --- !u!1839735485 &3032268583489863936 Tilemap: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Ally/Rider.cs b/Assets/Scripts/Ally/Rider.cs index 3145c5b..ca35db2 100644 --- a/Assets/Scripts/Ally/Rider.cs +++ b/Assets/Scripts/Ally/Rider.cs @@ -4,23 +4,29 @@ using UnityEngine; public class Rider : Ally { + [SerializeField] + private int _chargeAttackDamage; + [SerializeField] + private int _chargeCooldown; + [SerializeField] + private int _maxChargeHitCount; + [SerializeField] + private int _maxChargeDistance; [SerializeField] private GameObject _detection; [SerializeField] private GameObject _chargeDetection; - private Detection _chargeDetectionScript; [SerializeField] private GameObject _root; + + private Detection _chargeDetectionScript; private Root _rootScript; + private Vector3 _originalPos; private Vector2 _movementVector = Vector2.zero; private bool _isCharging; - [SerializeField] - private int _maxChargeHitCount; + private float _timeSinceLastCharge; private List _opponentsHit = new List(); - [SerializeField] - private int _maxChargeDistance; - private Vector3 _originalPos; public override void Start() { @@ -35,8 +41,15 @@ public class Rider : Ally public override void Update() { + // check for charge cooldown + if (_timeSinceLastCharge > _chargeCooldown) + { + _isCharging = true; + } + if (_isCharging) { + // toggle charge detection _detection.SetActive(false); _chargeDetection.SetActive(true); @@ -53,20 +66,27 @@ public class Rider : Ally // reset if (transform.position.x - _originalPos.x >= _maxChargeDistance || _opponentsHit.Count >= _maxChargeHitCount) { - _isCharging = false; + // position _movementVector = Vector2.zero; transform.position = _originalPos; + + // charge state + _isCharging = false; + _timeSinceLastCharge = 0; _opponentsHit.Clear(); + // detection state IsEnemyDetected = false; Enemy = null; + // toggle detection _detection.SetActive(true); _chargeDetection.SetActive(false); } } else { + _timeSinceLastCharge += Time.deltaTime; if (IsEnemyDetected) { AttackEnemy(); @@ -76,7 +96,7 @@ public class Rider : Ally void AttackEnemyRiding() { - _rootScript.Attack(); + _rootScript.AttackWithCustomDamage(_chargeAttackDamage); _opponentsHit.Add(Enemy); } diff --git a/Assets/Scripts/Root.cs b/Assets/Scripts/Root.cs index 338cc8f..5578eb9 100644 --- a/Assets/Scripts/Root.cs +++ b/Assets/Scripts/Root.cs @@ -24,6 +24,18 @@ public class Root : MonoBehaviour } } + public void AttackWithCustomDamage(int damage) + { + if (_entity == null || _entity.Enemy == null) return; + + _entity.Enemy.Hit(damage); + if (_entity.Enemy.Hp <= 0) + { + _entity.Enemy.Death(); + _entity.IsEnemyDetected = false; + } + } + public void ShotProjectile() { Rigidbody2D _rigidbodyAlly;