using System; using System.Linq; using Unity.Cinemachine; using UnityEngine; using UnityEngine.InputSystem; using UnityUtils; [Serializable] public class AOETargeting : TargetingStrategy { public GameObject aoePrefab; public float aoeRadius = 5f; public LayerMask groundLayerMask = 1; GameObject previewInstance; public override void Start(Ability ability, TargetingManager targetingManager) { this.ability = ability; this.targetingManager = targetingManager; Cancel(); isTargeting = true; ToggleCameraOrbit(false); targetingManager.SetCurrentStrategy(this); if (aoePrefab != null) { previewInstance = UnityEngine.Object.Instantiate(aoePrefab, Vector3.zero.Add(y:0.1f), Quaternion.identity); } if (targetingManager.input != null) { targetingManager.input.Click += OnClick; } } public override void Update() { if (!isTargeting || previewInstance == null) return; previewInstance.transform.position = GetMouseWorldPosition().Add(y: 0.1f); } Vector3 GetMouseWorldPosition() { if (targetingManager.cam == null) return Vector3.zero; var ray = targetingManager.cam.ScreenPointToRay(Mouse.current.position.ReadValue()); return Physics.Raycast(ray, out var hit, 100f, groundLayerMask) ? hit.point : Vector3.zero; } void ToggleCameraOrbit(bool enabled) { var inputAxisControllers = targetingManager.GetComponentInChildren(); if (inputAxisControllers != null) { inputAxisControllers.enabled = enabled; } } public override void Cancel() { isTargeting = false; ToggleCameraOrbit(true); targetingManager.ClearCurrentStrategy(); if (previewInstance != null) { UnityEngine.Object.Destroy(previewInstance); } if (targetingManager.input != null) { targetingManager.input.Click -= OnClick; } } void OnClick(RaycastHit hit) { if (isTargeting) { var targets = Physics.OverlapSphere(hit.point, aoeRadius) .Select(c => c.GetComponent()) .OfType(); foreach (var target in targets) { ability.Execute(target); } Cancel(); } } }