//Establecemos el interactuable más cercano a un ray de la lista de interactuablescercanos a Accionable public void EncontrarInteractuablesCercanos() { nearestDistanceSqr = Mathf.Infinity; //Creamos un rayo que va desde la cámara hacia adelante ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2,Screen.height/2,0)); //Dubujamos el rayo Debug.DrawRay(ray.origin, ray.direction*100, Color.blue); //Si tenemos guardado una referencia al interactuable más cercano, le quitamos el estado seleccionado if(nearestInteractuable != null) { inter = nearestInteractuable.GetComponent<Interactuable>(); //Si el interactuable es visible por la cámara y tiene más de una acción if(inter.CurrentState != Interactuable.State.Desactivado) { if(inter.IsVisible() && inter.DevolverAccionesCreadas() > 0) { inter.SetState (Interactuable.State.Accionable); inter.DesactivarTextoAcciones(); } else { inter.SetState (Interactuable.State.Desactivado); inter.OcultaCanvas(); inter.ReiniciarDistancia(); } } nearestInteractuable = null; } for(int i = Manager.instance.DevuelveNumeroInteractuablesCercanos() - 1; i >= 0; i--) { GameObject interCercano = Manager.instance.DevuelveInteractuableCercano(i); //el interactuable existe if(interCercano != null) { inter = interCercano.GetComponent<Interactuable>(); //Si el interactuable es visible por la cámara y tiene más de una acción if(inter.IsVisible() && inter.DevolverAccionesCreadas() > 0) { Vector3 objectPos = interCercano.transform.position; float distanceSqr = DistanceToLine(ray, objectPos); if (distanceSqr < nearestDistanceSqr) { nearestInteractuable = interCercano.transform; nearestDistanceSqr = distanceSqr; } } else if(inter.CurrentState != Interactuable.State.Desactivado) { inter.SetState (Interactuable.State.Desactivado); inter.OcultaCanvas(); inter.ReiniciarDistancia(); } } //El interactuable ya no existe, ha sido eliminado de la escena, lo eliminamos de la lista else { Manager.instance.DeleteInteractuableCercano(interCercano); } } //Si existe el más cercano, le cambiamos el estado a accionable if(nearestInteractuable != null && Manager.instance.DevuelveNumeroInteractuablesCercanos() != 0) { inter = nearestInteractuable.gameObject.GetComponent<Interactuable>(); inter.SetState(Interactuable.State.Seleccionado); inter.ActivarTextoAcciones(); } }
//Establecemos el interactuable más cercano a un ray de la lista de interactuablescercanos a Accionable public void EncontrarInteractuablesCercanos() { nearestDistanceSqr = Mathf.Infinity; //Creamos un rayo que va desde la cámara hacia adelante ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0)); //Dubujamos el rayo Debug.DrawRay(ray.origin, ray.direction * 100, Color.blue); //Si tenemos guardado una referencia al interactuable más cercano, le quitamos el estado seleccionado if (nearestInteractuable != null) { inter = nearestInteractuable.GetComponent <Interactuable>(); //Si el interactuable es visible por la cámara y tiene más de una acción if (inter.CurrentState != Interactuable.State.Desactivado) { if (inter.IsVisible() && inter.DevolverAccionesCreadas() > 0) { inter.SetState(Interactuable.State.Accionable); inter.DesactivarTextoAcciones(); } else { inter.SetState(Interactuable.State.Desactivado); inter.OcultaCanvas(); inter.ReiniciarDistancia(); } } nearestInteractuable = null; } for (int i = Manager.instance.DevuelveNumeroInteractuablesCercanos() - 1; i >= 0; i--) { GameObject interCercano = Manager.instance.DevuelveInteractuableCercano(i); //el interactuable existe if (interCercano != null) { inter = interCercano.GetComponent <Interactuable>(); //Si el interactuable es visible por la cámara y tiene más de una acción if (inter.IsVisible() && inter.DevolverAccionesCreadas() > 0) { Vector3 objectPos = interCercano.transform.position; float distanceSqr = DistanceToLine(ray, objectPos); if (distanceSqr < nearestDistanceSqr) { nearestInteractuable = interCercano.transform; nearestDistanceSqr = distanceSqr; } } else if (inter.CurrentState != Interactuable.State.Desactivado) { inter.SetState(Interactuable.State.Desactivado); inter.OcultaCanvas(); inter.ReiniciarDistancia(); } } //El interactuable ya no existe, ha sido eliminado de la escena, lo eliminamos de la lista else { Manager.instance.DeleteInteractuableCercano(interCercano); } } //Si existe el más cercano, le cambiamos el estado a accionable if (nearestInteractuable != null && Manager.instance.DevuelveNumeroInteractuablesCercanos() != 0) { inter = nearestInteractuable.gameObject.GetComponent <Interactuable>(); inter.SetState(Interactuable.State.Seleccionado); inter.ActivarTextoAcciones(); } }