Targeter
Fri Sep 29 2023 20:07:18 GMT+0000 (Coordinated Universal Time)
Saved by @juanesz
public class Targeter : MonoBehaviour { [SerializeField] private CinemachineTargetGroup cinemachineTargetGroup; private Camera cam; private List<Target> targets = new List<Target>(); public Target CurrentTarget { get; private set; } private void Start() { cam = Camera.main; } private void OnTriggerEnter(Collider other) { if (!other.TryGetComponent<Target>(out Target target)) { return; } targets.Add(target); target.OnDestroyed += RemoveTarget; } private void OnTriggerExit(Collider other) { if (!other.TryGetComponent<Target>(out Target target)) { return; } RemoveTarget(target); } public bool SelectTarget() { if (targets.Count == 0) { return false; } Target closestTarget = null; float closestTargetDistance = Mathf.Infinity; foreach (Target target in targets) { Vector2 viewportPos = cam.WorldToViewportPoint(target.transform.position); if (!target.GetComponentInChildren<Renderer>().isVisible) { continue; } Vector2 centerOffset = viewportPos - new Vector2(0.5f, 0.5f); if (centerOffset.sqrMagnitude < closestTargetDistance) { closestTarget = target; closestTargetDistance = centerOffset.sqrMagnitude; } } if (closestTarget == null) { return false; } CurrentTarget = closestTarget; cinemachineTargetGroup.AddMember(CurrentTarget.transform, 1f, 2f); return true; } public void Cancel() { if (CurrentTarget == null) { return; } cinemachineTargetGroup.RemoveMember(CurrentTarget.transform); CurrentTarget = null; } private void RemoveTarget(Target target) { if (CurrentTarget == target) { cinemachineTargetGroup.RemoveMember(CurrentTarget.transform); CurrentTarget = null; } target.OnDestroyed -= RemoveTarget; targets.Remove(target); } }
Comments