using Unity.VisualScripting; using UnityEngine; /// /// Should be attached to the Arrow, not the skeleton /// [RequireComponent(typeof(Rigidbody))] public class ArrowHandler : MonoBehaviour { [SerializeField] private float baseDamage; [SerializeField] private float baseKnockback; private Rigidbody _rigidBody; private bool _fromTeamA; void Awake() { _rigidBody = GetComponent(); } void Update() { // Align with speed if (_rigidBody.linearVelocity.magnitude >= 1f) transform.forward = _rigidBody.linearVelocity.normalized; } public void LaunchArrow(Vector3 baseSpeed, bool fromTeamA) { _rigidBody.linearVelocity = baseSpeed; _fromTeamA = fromTeamA; } void OnCollisionEnter(Collision collision) { // Can be optimized with tags, but it add dependance beetween teams if (collision.gameObject.TryGetComponent(out AbstractUnit unit)) { if (unit is MinecraftUnit && unit.IsTeamA != _fromTeamA) // No friendly fire { MinecraftUnit minecraftUnit = unit as MinecraftUnit; Vector3 knockback = _rigidBody.linearVelocity * baseKnockback; minecraftUnit.StartCoroutine(minecraftUnit.MovementHandler.TakeImpulse(knockback)); } unit.TakeDamage(baseDamage); } Destroy(this.gameObject); } }