Пример #1
0
	//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();
		}
	}
Пример #2
0
    //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();
        }
    }