public void AddTarget(EzLockOnTarget newTarget)
 {
     if (!m_nearbyTargets.Contains(newTarget))
     {
         m_nearbyTargets.Add(newTarget);
     }
 }
 public override void ExitState()
 {
     if (m_currentTarget != null)
     {
         m_currentTarget.SetIconActive(false);
         m_currentTarget = null;
     }
 }
    private void SetInitialTarget()
    {
        // Find the closest Target

        // for now set to the initial one in the list
        m_currentTarget = m_nearbyTargets[0];
        m_currentTarget.SetIconActive();
    }
    public void MoveToNextTarget(Vector3 direction)
    {
        // if one target early out
        if (m_nearbyTargets.Count <= 1)
        {
            return;
        }

        // if two targets, toggle between them
        if (m_nearbyTargets.Count == 2)
        {
            m_currentTarget.SetIconActive(false);
            m_currentTarget = m_currentTarget == m_nearbyTargets[0] ? m_nearbyTargets[1] : m_nearbyTargets[0];
            m_currentTarget.SetIconActive(true);
            return;
        }

        // if more than two targets:
        // Find the target nearest to the direction we want to move
        EzLockOnTarget nearestTarget          = m_currentTarget;
        EzLockOnTarget nextTarget             = null;
        Vector3        relativeDirection      = direction;
        float          currentNearestDistance = float.MaxValue;
        float          sqDstance = float.MaxValue;

        for (int i = 0; i < m_nearbyTargets.Count; ++i)
        {
            nextTarget = m_nearbyTargets[i];
            if (nextTarget == m_currentTarget)
            {
                continue;
            }

            relativeDirection = nextTarget.transform.position - m_cameraTransform.position;
            if (Vector3.Dot(relativeDirection, direction) > 0)
            {
                //sqDstance = relativeDirection.sqrMagnitude;
                sqDstance = (m_currentTarget.transform.position - nextTarget.transform.position).sqrMagnitude;
                if (sqDstance < currentNearestDistance)
                {
                    nearestTarget          = nextTarget;
                    currentNearestDistance = sqDstance;
                }
            }
        }

        m_currentTarget.SetIconActive(false);
        m_currentTarget = nearestTarget;
        m_currentTarget.SetIconActive(true);
    }
    private void CycleTargets()
    {
        // if one target early out
        if (m_nearbyTargets.Count <= 1)
        {
            return;
        }

        // if two targets, toggle between them
        if (m_nearbyTargets.Count == 2)
        {
            m_currentTarget = m_currentTarget == m_nearbyTargets[0] ? m_nearbyTargets[1] : m_nearbyTargets[0];
            return;
        }

        m_currentTarget.SetIconActive(false);
        m_currentTarget = m_nearbyTargets[CycleIndex(m_nearbyTargets.IndexOf(m_currentTarget), m_nearbyTargets.Count)];
        m_currentTarget.SetIconActive(true);
    }
    public void RemoveTarget(EzLockOnTarget targetToRemove)
    {
        if (m_nearbyTargets.Contains(targetToRemove))
        {
            m_nearbyTargets.Remove(targetToRemove);

            if (m_currentTarget == targetToRemove)
            {
                m_currentTarget.SetIconActive(false);
                m_currentTarget = null;
                if (m_nearbyTargets.Count > 0)
                {
                    m_currentTarget = m_nearbyTargets[0];
                    m_currentTarget.SetIconActive(true);
                }
                else
                {
                    m_isActive = false;
                    m_controlledCamera.SetState(m_controlledCamera.DefaultState);
                }
            }
        }
    }