diff --git a/Assets/Prefabs/TestUnit.prefab b/Assets/Prefabs/TestUnit.prefab index c7ac2eb..cbaf7be 100644 --- a/Assets/Prefabs/TestUnit.prefab +++ b/Assets/Prefabs/TestUnit.prefab @@ -179,12 +179,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 9815bed5dc151c8c6a271899ed1b7c4f, type: 3} m_Name: m_EditorClassIdentifier: - k__BackingField: {fileID: 3280843376750909586} - k__BackingField: {fileID: 8213395333053285225} - k__BackingField: {fileID: 8908285060348773052} - k__BackingField: {fileID: 6587310683195830629} - k__BackingField: 1 price: 0 + k__BackingField: 1 + k__BackingField: {fileID: 3280843376750909586} + k__BackingField: {fileID: 8213395333053285225} + k__BackingField: {fileID: 8908285060348773052} + k__BackingField: {fileID: 6587310683195830629} --- !u!114 &8213395333053285225 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/GlobalsVariable.cs b/Assets/Scripts/GlobalsVariable.cs deleted file mode 100644 index 7535645..0000000 --- a/Assets/Scripts/GlobalsVariable.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -public static class GlobalsVariable -{ - public static List AliveUnitsTeamA = new List(); - public static List AliveUnitsTeamB = new List(); - -} diff --git a/Assets/Scripts/Unit.cs b/Assets/Scripts/Unit.cs deleted file mode 100644 index 0faeb2c..0000000 --- a/Assets/Scripts/Unit.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Unity.VisualScripting; -using UnityEngine; -using UnityEngine.AI; - -[DisallowMultipleComponent] -[RequireComponent(typeof(Rigidbody))] -public class Unit : MonoBehaviour -{ - [field: SerializeField] public Rigidbody Body { get; private set; } - [field: SerializeField] public HealthHandler Health { get; private set; } - [field: SerializeField] public AttackHandler Attack { get; private set; } - [field: SerializeField] public MovementHandler Move { get; private set; } - - [field: SerializeField] public bool IsTeamA { get; private set; } - - [SerializeField] private int price; - - - - void OnValidate() - { - Debug.Assert(Body != null); - Debug.Assert(Health != null); - Debug.Assert(Attack != null); - Debug.Assert(Move != null); - } - - void Awake() - { - - if (IsTeamA) - { - GlobalsVariable.AliveUnitsTeamA.Add(this); - } - else - { - GlobalsVariable.AliveUnitsTeamB.Add(this); - } - } - - -} diff --git a/Assets/Scripts/UnitScripts.meta b/Assets/Scripts/UnitScripts.meta new file mode 100644 index 0000000..eb10dd8 --- /dev/null +++ b/Assets/Scripts/UnitScripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8a05c17988617d46a9233519a2dfbf3c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UnitScripts/AbstractUnit.cs b/Assets/Scripts/UnitScripts/AbstractUnit.cs new file mode 100644 index 0000000..2bf69db --- /dev/null +++ b/Assets/Scripts/UnitScripts/AbstractUnit.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +public abstract class AbstractUnit : MonoBehaviour +{ + public float price; + [field: SerializeField] public bool IsTeamA { get; private set; } + public abstract bool Attack(); + public abstract void TakeDamage(float damage); + +} diff --git a/Assets/Scripts/UnitScripts/AbstractUnit.cs.meta b/Assets/Scripts/UnitScripts/AbstractUnit.cs.meta new file mode 100644 index 0000000..8b6d1a3 --- /dev/null +++ b/Assets/Scripts/UnitScripts/AbstractUnit.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c34c1a29dc0657256b674f37fe8466d9 \ No newline at end of file diff --git a/Assets/Scripts/AttackHandler.cs b/Assets/Scripts/UnitScripts/AttackHandler.cs similarity index 76% rename from Assets/Scripts/AttackHandler.cs rename to Assets/Scripts/UnitScripts/AttackHandler.cs index e99923b..b0ff288 100644 --- a/Assets/Scripts/AttackHandler.cs +++ b/Assets/Scripts/UnitScripts/AttackHandler.cs @@ -4,7 +4,7 @@ using UnityEngine; using UnityEngine.Serialization; using Random = UnityEngine.Random; -[RequireComponent(typeof(Unit))] +[RequireComponent(typeof(MinecraftUnit))] public class AttackHandler : MonoBehaviour { [SerializeField] private float damage; @@ -14,11 +14,11 @@ public class AttackHandler : MonoBehaviour [SerializeField] private float knockbackVerticalForce; private float _timer; - private Unit _unit; + private MinecraftUnit _minecraftUnit; void Awake() { - _unit = GetComponent(); + _minecraftUnit = GetComponent(); } void Start() @@ -46,16 +46,22 @@ public class AttackHandler : MonoBehaviour { if (!target.CompareTag("Unit")) continue; // GetComponent is expensive in performance, optimize here if it's slow - Unit targetUnit = target.GetComponent(); + AbstractUnit targetUnit = target.GetComponent(); // No friendly fire - if (targetUnit.IsTeamA == _unit.IsTeamA) continue; + if (targetUnit.IsTeamA == _minecraftUnit.IsTeamA) continue; + + targetUnit.TakeDamage(damage); - targetUnit.Health.TakeDamage(damage); Vector3 knockbackVector = knockbackHorizontalForce * (target.transform.position - transform.position).normalized + knockbackVerticalForce * Vector3.up; - targetUnit.StartCoroutine(targetUnit.Move.TakeImpulse(knockbackVector)); + // Knockback logic specific to MinecraftUnit (can't force other team to do our weird impl) + if (targetUnit is MinecraftUnit) + { + MinecraftUnit minecraftTarget = (MinecraftUnit)targetUnit; + minecraftTarget.StartCoroutine(minecraftTarget.MovementHandler.TakeImpulse(knockbackVector)); + } } _timer = cooldown + Random.Range(-cooldown*0.2f, cooldown*0.2f); return true; diff --git a/Assets/Scripts/AttackHandler.cs.meta b/Assets/Scripts/UnitScripts/AttackHandler.cs.meta similarity index 100% rename from Assets/Scripts/AttackHandler.cs.meta rename to Assets/Scripts/UnitScripts/AttackHandler.cs.meta diff --git a/Assets/Scripts/CameraMouvement.cs b/Assets/Scripts/UnitScripts/CameraMouvement.cs similarity index 100% rename from Assets/Scripts/CameraMouvement.cs rename to Assets/Scripts/UnitScripts/CameraMouvement.cs diff --git a/Assets/Scripts/CameraMouvement.cs.meta b/Assets/Scripts/UnitScripts/CameraMouvement.cs.meta similarity index 100% rename from Assets/Scripts/CameraMouvement.cs.meta rename to Assets/Scripts/UnitScripts/CameraMouvement.cs.meta diff --git a/Assets/Scripts/UnitScripts/GlobalsVariable.cs b/Assets/Scripts/UnitScripts/GlobalsVariable.cs new file mode 100644 index 0000000..3f3fb78 --- /dev/null +++ b/Assets/Scripts/UnitScripts/GlobalsVariable.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +public static class GlobalsVariable +{ + public static List AliveUnitsTeamA = new List(); + public static List AliveUnitsTeamB = new List(); + +} diff --git a/Assets/Scripts/GlobalsVariable.cs.meta b/Assets/Scripts/UnitScripts/GlobalsVariable.cs.meta similarity index 100% rename from Assets/Scripts/GlobalsVariable.cs.meta rename to Assets/Scripts/UnitScripts/GlobalsVariable.cs.meta diff --git a/Assets/Scripts/HealthHandler.cs b/Assets/Scripts/UnitScripts/HealthHandler.cs similarity index 80% rename from Assets/Scripts/HealthHandler.cs rename to Assets/Scripts/UnitScripts/HealthHandler.cs index 3f1e5c9..b2c82a2 100644 --- a/Assets/Scripts/HealthHandler.cs +++ b/Assets/Scripts/UnitScripts/HealthHandler.cs @@ -1,17 +1,17 @@ using UnityEngine; -[RequireComponent(typeof(Unit))] +[RequireComponent(typeof(MinecraftUnit))] public class HealthHandler : MonoBehaviour { [SerializeField] private float maxHealth; [SerializeField] private float currentHealth; [SerializeField] private float armor; - private Unit _unit; + private MinecraftUnit _minecraftUnit; public void Awake() { - _unit = GetComponent(); + _minecraftUnit = GetComponent(); } public void TakeDamage(float damage) @@ -47,13 +47,13 @@ public class HealthHandler : MonoBehaviour public void Death() { print("you dead"); - if (_unit.IsTeamA) + if (_minecraftUnit.IsTeamA) { - GlobalsVariable.AliveUnitsTeamA.Remove(_unit); + GlobalsVariable.AliveUnitsTeamA.Remove(_minecraftUnit); } else { - GlobalsVariable.AliveUnitsTeamB.Remove(_unit); + GlobalsVariable.AliveUnitsTeamB.Remove(_minecraftUnit); } Destroy(gameObject); diff --git a/Assets/Scripts/HealthHandler.cs.meta b/Assets/Scripts/UnitScripts/HealthHandler.cs.meta similarity index 100% rename from Assets/Scripts/HealthHandler.cs.meta rename to Assets/Scripts/UnitScripts/HealthHandler.cs.meta diff --git a/Assets/Scripts/UnitScripts/MinecraftUnit.cs b/Assets/Scripts/UnitScripts/MinecraftUnit.cs new file mode 100644 index 0000000..12a4d34 --- /dev/null +++ b/Assets/Scripts/UnitScripts/MinecraftUnit.cs @@ -0,0 +1,48 @@ +using Unity.VisualScripting; +using UnityEngine; +using UnityEngine.AI; + +[DisallowMultipleComponent] +[RequireComponent(typeof(Rigidbody))] +public class MinecraftUnit : AbstractUnit +{ + [field: SerializeField] public Rigidbody Body { get; private set; } + [field: SerializeField] public HealthHandler HealthHandler { get; private set; } + [field: SerializeField] public AttackHandler AttackHandler { get; private set; } + [field: SerializeField] public MovementHandler MovementHandler { get; private set; } + + + + void OnValidate() + { + Debug.Assert(Body != null); + Debug.Assert(HealthHandler != null); + Debug.Assert(AttackHandler != null); + Debug.Assert(MovementHandler != null); + } + + void Awake() + { + + if (IsTeamA) + { + GlobalsVariable.AliveUnitsTeamA.Add(this); + } + else + { + GlobalsVariable.AliveUnitsTeamB.Add(this); + } + } + + // Abstract implementation for compatibility with other team + + public override bool Attack() + { + return AttackHandler.Attack(); + } + + public override void TakeDamage(float damage) + { + HealthHandler.TakeDamage(damage); + } +} diff --git a/Assets/Scripts/Unit.cs.meta b/Assets/Scripts/UnitScripts/MinecraftUnit.cs.meta similarity index 100% rename from Assets/Scripts/Unit.cs.meta rename to Assets/Scripts/UnitScripts/MinecraftUnit.cs.meta diff --git a/Assets/Scripts/MovementHandler.cs b/Assets/Scripts/UnitScripts/MovementHandler.cs similarity index 81% rename from Assets/Scripts/MovementHandler.cs rename to Assets/Scripts/UnitScripts/MovementHandler.cs index 925d710..fd2b921 100644 --- a/Assets/Scripts/MovementHandler.cs +++ b/Assets/Scripts/UnitScripts/MovementHandler.cs @@ -6,7 +6,7 @@ using UnityEngine; using UnityEngine.AI; using UnityEngine.InputSystem.iOS; -[RequireComponent(typeof(Unit))] +[RequireComponent(typeof(MinecraftUnit))] [RequireComponent(typeof(Rigidbody))] public class MovementHandler : MonoBehaviour { @@ -14,12 +14,12 @@ public class MovementHandler : MonoBehaviour [SerializeField] private NavMeshAgent agent; [SerializeField] private Transform defaultMoveTarget; - private Unit _unit; + private MinecraftUnit _minecraftUnit; private Rigidbody _rigidbody; void Awake() { - _unit = GetComponent(); + _minecraftUnit = GetComponent(); _rigidbody = GetComponent(); } @@ -48,23 +48,23 @@ public class MovementHandler : MonoBehaviour MoveTowards(FindNearestEnemy().transform.position); } - Unit FindNearestEnemy() + MinecraftUnit FindNearestEnemy() { - List enemies = _unit.IsTeamA ? GlobalsVariable.AliveUnitsTeamB : GlobalsVariable.AliveUnitsTeamA; + List enemies = _minecraftUnit.IsTeamA ? GlobalsVariable.AliveUnitsTeamB : GlobalsVariable.AliveUnitsTeamA; - Unit closestUnit = null; + MinecraftUnit closestMinecraftUnit = null; float closestDistance = float.MaxValue; - foreach (Unit enemy in enemies) + foreach (MinecraftUnit enemy in enemies) { float distanceToEnemy = (enemy.transform.position - transform.position).sqrMagnitude; if (distanceToEnemy < closestDistance) { - closestUnit = enemy; + closestMinecraftUnit = enemy; closestDistance = distanceToEnemy; } } - return closestUnit; + return closestMinecraftUnit; } void Update() @@ -94,7 +94,7 @@ public class MovementHandler : MonoBehaviour // Die if exited navMesh for to long if (noSurfaceTime > 6.0f) { - _unit.Health.Death(); + _minecraftUnit.HealthHandler.Death(); yield break; } diff --git a/Assets/Scripts/MovementHandler.cs.meta b/Assets/Scripts/UnitScripts/MovementHandler.cs.meta similarity index 100% rename from Assets/Scripts/MovementHandler.cs.meta rename to Assets/Scripts/UnitScripts/MovementHandler.cs.meta