public void CancelInteraction(ElementInstance a, ElementInstance b)
    {
        int hash = a.GetHashCode() + b.GetHashCode();

        if (_activeInteractions.ContainsKey(hash))
        {
            _activeInteractions[hash].Kill();
        }
    }
    public Interaction GetInteraction(ElementInstance a, ElementInstance b)
    {
        if (a == null || b == null)
        {
            return(null);
        }
        int hash = a.GetHashCode() + b.GetHashCode();

        if (_activeInteractions.ContainsKey(hash))
        {
            return(_activeInteractions[hash]);
        }
        InteractionData validInteraction = null;

        foreach (var interaction in availableInteractions)
        {
            if (interaction.IsFulfilledBy(a.Data, b.Data))
            {
                if (Vector3.Distance(a.transform.position, b.transform.position) < interaction.distance)
                {
                    validInteraction = interaction;
                }
                else
                {
                    CancelInteraction(a, b);
                }
            }
        }
        if (validInteraction != null)
        {
            Interaction newInteraction = Instantiate(validInteraction.interactionPrefab);
            newInteraction.Birth(a, b);
            newInteraction.OnKill            += () => { _activeInteractions.Remove(hash); };
            newInteraction.transform.position = (a.transform.position + b.transform.position) / 2;
            _activeInteractions[hash]         = newInteraction;
            return(newInteraction);
        }
        return(null);
    }