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); }