/// <summary> /// /// </summary> /// <param name="inicio"></param> /// <param name="relacionGanancia"></param> /// <param name="grafo"></param> /// <param name="gasolina">La gasolina que riene la nave al comenzar el método</param> /// <param name="camino"></param> /// <param name="distancia"></param> private void buscarCamino(SistemaPlanetario inicio, double relacionGanancia, List <AristaSistema> grafo, float gasolina, List <SistemaPlanetario> camino, float distancia, int sondas, double[] materiales) { inicio.visitado = true; RecargarCombustible rc = new RecargarCombustible(); List <Planeta> planetasTemp = new List <Planeta>(); planetasTemp = clonarPlanetas(inicio.nodos); double[] materialesTemp = clonarMateriales(materiales); double rg = relacionGanancia; rc.recargarGasolinaYsondas(inicio, ref gasolina, ref sondas, ref materiales, ref rg); camino.Add(inicio); //int sondasTemp = inicio.recorrido.sondasGlobal; rg = calcularRelacionGanancia(inicio, rg, distancia, ref sondas, ref materiales); foreach (var item in buscarAdyacentes(inicio, grafo)) { if (!item.visitado) { float dis = ((new Vector3(inicio.x, inicio.y, inicio.z)) - (new Vector3(item.x, item.y, item.z))).magnitude; if (!caminoImposible(dis, gasolina)) { buscarCamino(item, rg, grafo, gasolina - (dis / Constantes.GASTO_COMBUSTIBLE), camino, dis, sondas, materiales); } } } SistemaPlanetario inicioAux = inicio; List <AristaSistema> grafoDuplicado = clonarGrafo(grafo, ref inicioAux); inicio.visitado = false; camino.Remove(inicio); buscarOrigen(inicioAux, rg, grafoDuplicado, gasolina, sondas, 0, camino, materiales); devolverMateriales(inicio.nodos, planetasTemp, ref materiales); devolverMaterialesNave(ref materiales, materialesTemp); }
public IEnumerator sistemaDeNavegacion(List <SistemaPlanetario> MejorCamino) { transform.position = new Vector3(MejorCamino[0].x, 0, MejorCamino[0].z); lineaPaso.SetPosition(0, new Vector3(MejorCamino[0].x, 0.1f, MejorCamino[0].z)); int i = 0; int contadorFinal = 0; //contador para saber si llego a Vector3 posInicial = new Vector3(MejorCamino[0].x, 0, MejorCamino[0].x); SistemaPlanetario sistemaInicial = MejorCamino[0]; foreach (var sistema in MejorCamino) { if (sistema == sistemaInicial && i != 0) { break; } float distancia = (posInicial - new Vector3(sistema.x, 0, sistema.z)).magnitude; posInicial = new Vector3(sistema.x, 0, sistema.z); if (combustible < (distancia / Constantes.GASTO_COMBUSTIBLE)) { gameOver = true; Debug.Log("Todo Esta Perdido"); Time.timeScale = 0; break; } contadorFinal++; lineaPaso.positionCount = i + 1; navegacionSistema(); GameObject circulo = new GameObject(); circulo.transform.position = new Vector3(sistema.x, 0, sistema.z); circulo.transform.localScale = new Vector3(20, 20, 20); GameObject sistemaTemp = new GameObject(); sistemaTemp.transform.parent = circulo.transform; sistemaTemp.transform.localPosition = new Vector3(0, -2, 0); sistemaTemp.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f); Vector3 target = new Vector3(sistema.x, 0, sistema.z); float combustibleTemp = ((transform.position - target).magnitude) * Constantes.GASTO_COMBUSTIBLE; float combustubleRestante = combustible - ((transform.position - target).magnitude) * Constantes.GASTO_COMBUSTIBLE; float gastoGasolina = 0; int entra = 0; while ((transform.position - target).magnitude != 0) { lineaPaso.SetPosition(i, new Vector3(transform.position.x, 0.1f, transform.position.z)); if (entra <= 1) { entra++; gastoGasolina = combustibleTemp * Constantes.GASTO_COMBUSTIBLE - (((transform.position - target).magnitude) * Constantes.GASTO_COMBUSTIBLE); } combustible -= gastoGasolina; float step = velocidadSistemas * Time.deltaTime; transform.position = Vector3.MoveTowards(transform.position, target, step); Vector3 targetDir = target - transform.position; Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0f); Debug.DrawRay(transform.position, newDir, Color.red); // Move our position a step closer to the target. transform.rotation = Quaternion.LookRotation(newDir); Vector3 posicion = transform.position + offsetSistema; Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, posicion, 0.1f); yield return(null); } i++;//esta es para las lineas combustible = combustubleRestante; #region RecargarCombustible ///Recarga combustible si es posible RecargarCombustible rc = new RecargarCombustible(); double[] materiales = new double[4]; materiales[0] = iridio; materiales[1] = paladio; materiales[2] = platino; materiales[3] = elementoZero; double rg = 0; rc.recargarGasolinaYsondas(sistema, ref combustible, ref sondas, ref materiales, ref rg); iridio = (float)materiales[0]; paladio = (float)materiales[1]; platino = (float)materiales[2]; elementoZero = (float)materiales[3]; #endregion RecargarCombustible GameObject planetaTemp = new GameObject(); planetaTemp.transform.parent = sistemaTemp.transform; if (sistema.recorrido.caminoGlobal.Count > 0) { planetaTemp.transform.localPosition = new Vector3(sistema.recorrido.caminoGlobal[0].x, 0, sistema.recorrido.caminoGlobal[0].z); transform.position = planetaTemp.transform.position; } foreach (var planeta in sistema.recorrido.caminoGlobal) { navegacionPlanetas(); planetaTemp.transform.localPosition = (new Vector3(planeta.x, 0, planeta.z)); target = planetaTemp.transform.position; Vector3 posicion = transform.position + offsetPlanetas; Camera.main.transform.position = posicion; while ((transform.position - target).magnitude >= 0.1f) { float step = velocidadplanetas * Time.deltaTime; transform.position = Vector3.MoveTowards(transform.position, target, step); Vector3 targetDir = target - transform.position; Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0f); Debug.DrawRay(transform.position, newDir, Color.red); // Move our position a step closer to the target. transform.rotation = Quaternion.LookRotation(newDir); posicion = transform.position + offsetPlanetas; Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, posicion, 0.1f);; yield return(null); } #region EntrarAPlaneta Vector3 posiciont = new Vector3(-7, 0, 0); Vector3 rotacion = new Vector3(0, 90, 0); Vector3 escala = new Vector3(0.1f, 0.1f, 0.1f); transform.position += posiciont; transform.eulerAngles = rotacion; transform.localScale -= escala; Vector3 offsetExtraccion = new Vector3(5f, 19, 22); // Camera.main.transform.position -= offsetExtraccion; if (sondas >= 2 && GastoSondas.valeLaPenaGastarSondas(planeta)) { Vector3 Posfinal1 = Camera.main.transform.position - offsetExtraccion; while ((Posfinal1 - Camera.main.transform.position).magnitude != 0) { Camera.main.transform.position = Vector3.MoveTowards(Camera.main.transform.position, Posfinal1, 1f); yield return(null); } sondas -= 2; double iridioTemp = planeta.iridio / tiempoExtraccion; double paladioTemp = planeta.paladio / tiempoExtraccion; double platinoTemp = planeta.platino / tiempoExtraccion; double elementoZeroTemp = planeta.elementoZero / tiempoExtraccion; inPlaneta = true; int contador = 0; nombrePlanetaTemp = planeta.nombre; ///Extraer materiales while (contador < tiempoExtraccion) { if (escapar) { escapar = false; break; } contador++; iridio += (float)iridioTemp; paladio += (float)paladioTemp; platino += (float)platinoTemp; elementoZero += (float)elementoZeroTemp; planeta.iridio -= iridioTemp; planeta.paladio -= paladioTemp; planeta.platino -= platinoTemp; planeta.elementoZero -= elementoZeroTemp; iridioPlanetaTemp = (float)planeta.iridio; paladioPlanetaTemp = (float)planeta.paladio; platinoPlanetaTemp = (float)planeta.platino; elementoZeroPlanetaTemp = (float)planeta.elementoZero; iridioPlanetaTemp = Mathf.Clamp(iridioPlanetaTemp, 0, Mathf.Infinity); platinoPlanetaTemp = Mathf.Clamp(platinoPlanetaTemp, 0, Mathf.Infinity); paladioPlanetaTemp = Mathf.Clamp(paladioPlanetaTemp, 0, Mathf.Infinity); elementoZeroPlanetaTemp = Mathf.Clamp(elementoZeroPlanetaTemp, 0, Mathf.Infinity); yield return(new WaitForSeconds(1f)); } } inPlaneta = false; transform.position -= posiciont; transform.eulerAngles = Vector3.zero; transform.localScale += escala; Vector3 Posfinal = Camera.main.transform.position + offsetExtraccion; while ((Posfinal - Camera.main.transform.position).magnitude != 0) { Camera.main.transform.position = Vector3.MoveTowards(Camera.main.transform.position, Posfinal, 1f); yield return(null); } #endregion EntrarAPlaneta } } GameObject.FindGameObjectWithTag("Teletransportar").GetComponent <Teletransportar>().iniciarAnimacion(); yield return(new WaitForSeconds(2.1f)); LevelLoader levelLoader = GameObject.FindGameObjectWithTag("LevelLoader").GetComponent <LevelLoader>(); levelLoader.loadLevel("ViaLactea"); }