} // end dispararMisilNormal() /// <summary> /// Se llama cada vez que hay que dibujar la interfaz de usuario ( Similar a Update() ) /// </summary> void OnGUI() { Event e = Event.current; //Controlamos la rueda del ratón if (e.type == EventType.scrollWheel && modoDisparo != ModoDisparo.auto) { if (tipoProyectil == TipoProyectil.pistola) { tipoProyectil = TipoProyectil.ametralladora; TextoMunicion.text = "Tipo Arma: Ametralladora"; } else if (tipoProyectil == TipoProyectil.ametralladora) { tipoProyectil = TipoProyectil.granada; TextoMunicion.text = "Tipo Arma: Granada"; } else if (tipoProyectil == TipoProyectil.granada) { tipoProyectil = TipoProyectil.misilNormal; TextoMunicion.text = "Tipo Arma: MisilNormal"; } else if (tipoProyectil == TipoProyectil.misilNormal) { tipoProyectil = TipoProyectil.misilInteligente; TextoMunicion.text = "Tipo Arma: MisilInteligente"; } else { tipoProyectil = TipoProyectil.pistola; TextoMunicion.text = "Tipo Arma: Pistola"; } } if (playerState == PlayerState.death) { //Skin GUI.skin = gameGuiSkin; float AnchoDialogo = Screen.width / 6; // 1/6 del ancho de la pantalla float AltoDialogo = Screen.height / 10; // 1/10 del alto de la pantalla //Area Principal centrada en la pantalla, con título y estilo de caja skinned //BeginArea (screenRect : Rect, text : String, style : GUIStyle) GUILayout.BeginArea(new Rect(Screen.width / 2 - AnchoDialogo / 2, Screen.height / 2 - AltoDialogo / 2, AnchoDialogo, AltoDialogo), "Has Muerto", gameGuiSkin.box); //Botón estilo skinned if (GUILayout.Button("Aceptar", gameGuiSkin.button)) { Application.Quit(); } GUILayout.EndArea(); } } // end OnGui()
} // end dispararMisil() void OnGUI() { Event e = Event.current; if (e.type == EventType.scrollWheel && modoDisparo != ModoDisparo.auto) { if (tipoProyectil == TipoProyectil.bala) { tipoProyectil = TipoProyectil.misil; TextoMunicion.text = "Munici\u00F3n: Misil"; } else { tipoProyectil = TipoProyectil.bala; TextoMunicion.text = "Munici\u00F3n: Bala"; } } } // end OnGui()
} //end Start() // Update is called once per frame void Update() { if (Input.GetButtonDown("Fire1")) { Vector3 raton; Vector3 view; raton = Input.mousePosition; view = Camera.main.ScreenToViewportPoint(raton); Ray ray = Camera.main.ViewportPointToRay(view); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { Transform target; if (trace) { print("Apuntando a: " + hit.transform.name); } //********************************************************************************************* // // Sección que facilita el disparo // if (hit.transform.tag.Contains("suelo")) { Collider[] colliders = Physics.OverlapSphere(hit.point, 3, layerMask_IgnoreSphereCast); if (colliders.GetLength(0) > 0) { int index = 0; for (index = 0; index < colliders.GetLength(0); index++) { if (colliders[index].transform.tag.Contains("enemigo")) { break; } } if (index < colliders.GetLength(0)) { Vector3 direccion = (colliders[index].transform.position + (colliders[index].transform.forward * offsetTarget.z) + (colliders[index].transform.right * offsetTarget.x) + (colliders[index].transform.up * offsetTarget.y)) - (tr.position + (transform.forward * offsetPlayerBalas.z) + (transform.right * offsetPlayerBalas.x) + (transform.up * offsetPlayerBalas.y)); ray.direction = direccion; ray.origin = tr.position + (transform.forward * offsetPlayerBalas.z) + (transform.right * offsetPlayerBalas.x) + (transform.up * offsetPlayerBalas.y); if (!Physics.Raycast(ray, out hit, direccion.magnitude, layerMask_IgnorePlayer)) { Debug.DrawRay(tr.position + (transform.forward * offsetPlayerBalas.z) + (transform.right * offsetPlayerBalas.x) + (transform.up * offsetPlayerBalas.y), direccion, Color.magenta); return; } else { if (trace) { print("Enemigo " + hit.transform.name + " facilitado"); } } } } } // //********************************************************************************************* if (hit.transform.tag.Contains("enemigo")) { Vector3 tempOffset = offsetTarget; target = hit.transform; if (modoDisparo == ModoDisparo.auto) { if (target.GetComponent <healthClass>().health > 10) //dirigido por salud //if((target.position - tr.position).magnitude <= rangoBala) //dirigido por distancia { tipoProyectil = TipoProyectil.bala; TextoMunicion.text = "Munici\u00F3n: Bala"; } else { tipoProyectil = TipoProyectil.misil; TextoMunicion.text = "Munici\u00F3n: Misil"; } } if (target.CompareTag("enemigo_estatico")) { tempOffset = Vector3.zero; } if (tipoProyectil == TipoProyectil.bala) { //Bala StopAllCoroutines(); StartCoroutine(dispararBala(target, tempOffset)); } else if (tipoProyectil == TipoProyectil.misil) { //Misil StopAllCoroutines(); StartCoroutine(dispararMisil(target, tempOffset)); } } } } } // end Update()
} //end Start() // Update is called once per frame void Update() { #region Movimiento Player //********************************************************************************************* // Sección que facilita el movimiento del player // if (controller.isGrounded) { if (depth) { //moveDirection = new Vector3( Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical")); moveDirection = new Vector3(0, 0, Input.GetAxis("Vertical")); transform.Rotate(0, Input.GetAxis("Horizontal") * rotationSpeed, 0); } else { moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, 0); } moveDirection = transform.TransformDirection(moveDirection); moveDirection *= linealSpeed; if (Input.GetButton("Jump")) { moveDirection.y = jumpSpeed; } } moveDirection.y -= gravity * Time.deltaTime; controller.Move(moveDirection * Time.deltaTime); // // Fin Sección que facilita el movimiento del player //********************************************************************************************* #endregion //Actualizamos el valor de energy en el GUI correspondiente playerEnergyText.text = "Energ\u00EDa : " + playerEnergy.ToString(); //Salir del juego if (Input.GetButtonDown("Scape")) { Application.Quit(); } else if (playerState == PlayerState.death) { return; } //Cambiar modo de disparo if (Input.GetKeyDown(KeyCode.A)) { modoDisparo = ModoDisparo.auto; TextoModoDisparo.text = "Modo disparo: autom\u00E1tico"; } else if (Input.GetKeyDown(KeyCode.M)) { modoDisparo = ModoDisparo.manual; TextoModoDisparo.text = "Modo disparo: manual"; } if (Input.GetButtonDown("Fire1")) { Vector3 raton; Vector3 view; raton = Input.mousePosition; //Cursor del ratón en coordenadas de viewPort view = Camera.main.ScreenToViewportPoint(raton); //Rayo desde la vista Ray ray = Camera.main.ViewportPointToRay(view); RaycastHit hit; //Se lanza el rayo if (Physics.Raycast(ray, out hit)) { Transform target; if (trace) { print("Apuntando a: " + hit.transform.name); } #region facilitadores //********************************************************************************************* // // Sección que facilita el disparo // //¿Se hizo clic contra el suelo? if (hit.transform.tag.Contains("suelo")) { //Se hizo clic contra el suelo, casteamos una esfera ignorando el suelo y los elementos estáticos del escenario Collider[] colliders = Physics.OverlapSphere(hit.point, 3, layerMask_IgnoreSphereCast); //¿Hay algo dentro de la esfera? if (colliders.GetLength(0) > 0) { //Encontramos elementos dentro de la esfera int index = 0; for (index = 0; index < colliders.GetLength(0); index++) { //Encontramos al menos un enemigo if (colliders[index].transform.tag.Contains("enemigo")) { break; } } //¿Hay enemigos? if (index < colliders.GetLength(0)) { //Hay enemigos en la esfera Vector3 direccion; if (colliders[index].transform.tag.Contains("estatico")) { //Enemigo estático direccion = colliders[index].transform.position - (tr.position + (transform.forward * offsetPlayerBalas.z) + (transform.right * offsetPlayerBalas.x) + (transform.up * offsetPlayerBalas.y)); } else { //Enemigo no estático direccion = (colliders[index].transform.position + (colliders[index].transform.forward * offsetTarget.z) + (colliders[index].transform.right * offsetTarget.x) + (colliders[index].transform.up * offsetTarget.y)) - (tr.position + (transform.forward * offsetPlayerBalas.z) + (transform.right * offsetPlayerBalas.x) + (transform.up * offsetPlayerBalas.y)); } //Dirección y origen de rayo hacia el target desde el player ray.direction = direccion; ray.origin = tr.position + (transform.forward * offsetPlayerBalas.z) + (transform.right * offsetPlayerBalas.x) + (transform.up * offsetPlayerBalas.y); //Se lanza un rayo en dirección al target, ignorando al player if (!Physics.Raycast(ray, out hit, direccion.magnitude, layerMask_IgnorePlayer)) { //No se encontró una dirección despejada hacia el target (por ejemplo, había obstáculos en la trayectoria de tiro) if (trace) { Debug.DrawRay(tr.position + (transform.forward * offsetPlayerBalas.z) + (transform.right * offsetPlayerBalas.x) + (transform.up * offsetPlayerBalas.y), direccion, Color.magenta); Debug.Break(); } //En vez de return, se podría continuar para disparar contra cosas del escenario (siempre que se haya seleccionado a un target enemigo) return; } else { //Enemigo facilitado if (trace) { print("Enemigo " + hit.transform.name + " facilitado"); } } } else { //No hay enemigos en la esfera if (trace) { print("No hay enemigos en la esfera"); } return; } } else { //No hay nada en la esfera (excepto suelo o elementos estáticos del escenario) if (trace) { print("No hay nada en la esfera"); } //************************************************************** // //Parte experimental para movimiento por clic // //StopAllCoroutines(); //Nos movemos hacia el punto donde se hizo clic en el suelo //StartCoroutine(goTo(hit.point)); // //************************************************************** //return; } } // // Fin Sección que facilita el disparo //********************************************************************************************* #endregion if (hit.transform.tag.Contains("enemigo")) { //Offset temporal del target, si el enemigo es estático lo pondremos a cero. Vector3 tempOffset = offsetTarget; //Transform del target target = hit.transform; //Elegimos munición if (modoDisparo == ModoDisparo.auto) { if (target.GetComponent <healthClass>().health > 10 || playerEnergy < 10) //decido por salud y por energía del player //if((target.position - tr.position).magnitude <= rangoBala) //dirigido por distancia { tipoProyectil = TipoProyectil.bala; TextoMunicion.text = "Munici\u00F3n: Bala"; } else { tipoProyectil = TipoProyectil.misil; TextoMunicion.text = "Munici\u00F3n: Misil"; } } //Sólo si enemigo estático if (target.CompareTag("enemigo_estatico")) { if (trace) { print("Enemigo est\u00E1tico detectado: " + hit.transform.name); } tempOffset = Vector3.zero; } //Disparo en función del tipo de munición if (tipoProyectil == TipoProyectil.bala) { //Bala StopAllCoroutines(); StartCoroutine(dispararBala(target, tempOffset)); //Por cada disparo de bala resto una cantidad a la energía del player playerEnergy -= 10; } else if (tipoProyectil == TipoProyectil.misil) { //Misil StopAllCoroutines(); StartCoroutine(dispararMisil(target, tempOffset)); //Por cada disparo de misil resto una cantidad a la energía del player playerEnergy -= 50; } } } } //Si no está pulsando el botón de disparo recuperamos energía else { playerEnergy++; if (playerEnergy > playerEnergyMax) { playerEnergy = playerEnergyMax; } } } // end Update()
} //end Start() // Update is called once per frame void Update() { #region Movimiento Player //********************************************************************************************* // Sección que facilita el movimiento del player // if (controller.isGrounded) { Vector3 raton; Vector3 view; raton = Input.mousePosition; //Cursor del ratón en coordenadas de viewPort view = Camera.main.ScreenToViewportPoint(raton); //Rayo desde la vista Ray ray = Camera.main.ViewportPointToRay(view); RaycastHit hit; //Lanzamos el rayo para calcular la rotación en función de la posición del mouse if (Physics.Raycast(ray, out hit)) { if (trace) { // print("Apuntando a: " + hit.transform.name); // print ("PosicionMouse = " + hit.point); } //Anulamos la componente y de la posición del mouse. hit.point = new Vector3(hit.point.x, transform.position.y, hit.point.z); // Determine the target rotation. This is the rotation if the transform looks at the target point. Quaternion targetRotation = Quaternion.LookRotation(hit.point - transform.position); // Smoothly rotate towards the target point. if (Mathf.Abs(tr.eulerAngles.y - targetRotation.eulerAngles.y) > umbralPrecisionRotacion) { //transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.time); //Rotamos descartando cualquier rotación que no sea del eje Y tr.rotation = Quaternion.RotateTowards(tr.rotation, Quaternion.Euler(0, targetRotation.eulerAngles.y, 0), Time.deltaTime * rotationSpeed); } } moveDirection = transform.TransformDirection(Vector3.forward) * Input.GetAxis("Vertical"); //transform.Rotate(0, Input.GetAxis("Horizontal")*rotationSpeed,0); moveDirection *= linealSpeed; if (Input.GetButton("Jump")) { moveDirection.y = jumpSpeed; } } moveDirection.y -= gravity * Time.deltaTime; controller.Move(moveDirection * Time.deltaTime); // // Fin Sección que facilita el movimiento del player //********************************************************************************************* #endregion #region Actualización Variables Player //Actualizamos el valor de energy en el GUI correspondiente playerEnergyText.text = "Energ\u00EDa : " + playerEnergy.ToString(); //Salir del juego if (Input.GetButtonDown("Scape")) { Application.Quit(); } else if (playerState == PlayerState.death) { return; } //Cambiar modo de disparo if (Input.GetKeyDown(KeyCode.A)) { modoDisparo = ModoDisparo.auto; TextoModoDisparo.text = "Modo disparo: autom\u00E1tico"; } else if (Input.GetKeyDown(KeyCode.M)) { modoDisparo = ModoDisparo.manual; TextoModoDisparo.text = "Modo disparo: manual"; } // // Fin Sección actualización variables del player //********************************************************************************************* #endregion #region Disparo Misiles, Granadas, Ametralladora, Pistola //********************************************************************************************* // // Sección que facilita el disparo de misiles, granadas, ametralladora, pistola // //********************************************************************************************* if (Input.GetButtonDown("Fire2")) { #region Calculo Armamento en modo Automático //************************************************************************** //Cálculos tan sólo si estamos en modo automático //Para saber qué armamento usar //************************************************************************** if (modoDisparo == ModoDisparo.auto) { //Calculo la posición de origen del rayo sumándole el offset correspondiente. Vector3 origenRayo = tr.position + (transform.up * offsetPlayerRayoDeteccionEnemigos.y); //Cojo la dirección forward del player con una determinada magnitud que viene dada por distanciaDisparo //En función de esa distancia calcularemos colisiones posibles del rayo a mayor o menor distancia. Vector3 target = transform.TransformDirection(Vector3.forward) * distanciaDisparo; RaycastHit hit; //Rayo desde el player hacia adelante una distancia determinada //Si hay colisión vemos los enemigos que hay en ese punto para actuar en consecuencia //si no hay colisión efectuamos sin más un disparo de bala en esa dirección siempre que estemos //en modo automático. if (Physics.Raycast(origenRayo, target, out hit)) { //En este caso el target es el lugar de impacto del rayo //target = hit.point; if (trace) { print("Apuntando a: " + hit.transform.name); Debug.DrawRay(origenRayo, target, Color.red, 1); } //Casteamos en cualquier caso una esfera ignorando el suelo y los elementos estáticos del escenario Collider[] colliders = Physics.OverlapSphere(hit.point, 10, layerMask_IgnoreSphereCast); //Dependiendo del número de enemigos que tengamos cerca usaremos un arma un otro. int contadorEnemigos = 0; //¿Hay algo dentro de la esfera? if (colliders.GetLength(0) > 0) { //Encontramos elementos dentro de la esfera int index = 0; for (index = 0; index < colliders.GetLength(0); index++) { //Encontramos al menos un enemigo if (colliders[index].transform.tag.Contains("enemigo")) { contadorEnemigos++; } //break; } } if (trace) { print("Numero Enemigos = " + contadorEnemigos); } //¿Hay enemigos? //Elegimos munición if (modoDisparo == ModoDisparo.auto) { if (contadorEnemigos > 8 && numGranadas > 0) { tipoProyectil = TipoProyectil.misilNormal; TextoMunicion.text = "Tipo Arma: MisilNormal"; } else if (contadorEnemigos > 8 && numMisilesInteligentes > 0) { tipoProyectil = TipoProyectil.misilInteligente; TextoMunicion.text = "Tipo Arma: MisilIngeligente"; } else if (contadorEnemigos > 5 && numGranadas > 0) { tipoProyectil = TipoProyectil.granada; TextoMunicion.text = "Tipo Arma: Granada"; } else if (contadorEnemigos > 3 && numCargadoresAmetralladora > 0) { tipoProyectil = TipoProyectil.ametralladora; TextoMunicion.text = "Tipo Arma: Ametralladora"; } else { tipoProyectil = TipoProyectil.pistola; TextoMunicion.text = "Tipo Arma: Pistola"; } } } //Si no existe colisión al lanzar el rayo efectuamos sin más un disparo de bala en esa dirección //siempre que estemos en modo de disparo automático else { //Elegimos como munición la bala if (modoDisparo == ModoDisparo.auto) { tipoProyectil = TipoProyectil.pistola; TextoMunicion.text = "Munici\u00F3n: Bala"; } } //Disparo en función del tipo de munición en MODO AUTOMÁTICO if (tipoProyectil == TipoProyectil.pistola && numBalas > 0) { //Pistola dispararPistola(); } else if (tipoProyectil == TipoProyectil.ametralladora) { //Ametralladora StartCoroutine(dispararAmetralladora()); } else if (tipoProyectil == TipoProyectil.misilNormal) { //Misil Normal dispararMisilNormal(); } } // // Fin Sección para saber qué armamento usar en modo automático //********************************************************************************************* #endregion #region Disparo Manual //************************************************************************** // // Sección de Disparo Manual // //************************************************************************** if (modoDisparo == ModoDisparo.manual) { if (tipoProyectil == TipoProyectil.pistola && numBalas > 0) { //Pistola dispararPistola(); } if (tipoProyectil == TipoProyectil.ametralladora && numCargadoresAmetralladora > 0) { //Ametralladora StartCoroutine(dispararAmetralladora()); } if (tipoProyectil == TipoProyectil.granada && numGranadas > 0) { //Ametralladora dispararGranada(); } if (tipoProyectil == TipoProyectil.misilNormal && numMisilesNormales > 0) { //Misil Normal dispararMisilNormal(); } if (tipoProyectil == TipoProyectil.misilInteligente && numMisilesInteligentes > 0) { //Misil Normal dispararMisilNormal(); } } // // Fin Sección de Disparo Manual //********************************************************************************************* #endregion } //Si no está pulsando el botón de disparo recuperamos energía else { playerEnergy++; if (playerEnergy > playerEnergyMax) { playerEnergy = playerEnergyMax; } } // // Fin Sección que facilita el disparo del player //********************************************************************************************* #endregion #region Recargar Munición //********************************************************************************************* //Sección que facilita el recargar armamento //********************************************************************************************* if (Input.GetKey(KeyCode.R)) { numBalas = maxNumBalas; } #endregion } // end Update()
// Use this for initialization void Start() { //Para hacer pruebas asigno el modo de disparo inicial modoDisparo = ModoDisparo.manual; tipoProyectil = TipoProyectil.granada; //Asigno la distancia de disparo if (Screen.width > Screen.height) { distanciaDisparo = Screen.width / 2; } else { distanciaDisparo = Screen.height / 2; } //Asigno mi transform tr = transform; //Asigno mi character controller controller = GetComponent <CharacterController>(); //Desabilito colisiones //controller.detectCollisions = false; //Visualiza la munición al principio if (tipoProyectil == TipoProyectil.pistola) { TextoMunicion.text = "Tipo Arma: Pistola"; } else if (tipoProyectil == TipoProyectil.misilNormal) { TextoMunicion.text = "Tipo Arma: MisilNormal"; } else if (tipoProyectil == TipoProyectil.misilInteligente) { TextoMunicion.text = "Tipo Arma: MisilInteligente"; } else if (tipoProyectil == TipoProyectil.ametralladora) { TextoMunicion.text = "Tipo Arma: Ametralladora"; } else if (tipoProyectil == TipoProyectil.granada) { TextoMunicion.text = "Tipo Arma: Granada"; } //Visualiza el modo de disparo if (modoDisparo == ModoDisparo.auto) { TextoModoDisparo.text = "Modo disparo: autom\u00E1tico"; } if (modoDisparo == ModoDisparo.manual) { TextoModoDisparo.text = "Modo disparo: manual"; } //Configuramos la capas layerSuelo = 1 << LayerMask.NameToLayer(nombreLayerSuelo); layerScenaryStatic = 1 << LayerMask.NameToLayer(nombreLayerScenaryStatic); layerPlayer = 1 << LayerMask.NameToLayer(nombreLayerPlayer); layerMask_IgnoreSphereCast = ~(layerSuelo | layerScenaryStatic); layerMask_IgnorePlayer = ~layerPlayer; //Inicializamos el texto de la energía del jugador playerEnergyText.text = "Energ\u00EDa : " + playerEnergy.ToString(); } //end Start()