Jump to content
UnitySpain

Mcloud

Registrados
  • Content Count

    53
  • Joined

  • Last visited

Community Reputation

8 Neutral

About Mcloud

  • Rank
    Usuario

Profile Information

  • Especialidad
    Coder

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Buenas, Muchísimas gracias, y disculpadme porque llevo una semana infernal en la oficina y no he podido tocar nada aun del juego, pero sera lo primero que modifique y os comento
  2. Buenas, Sigo con el RPG en 2D, me cree unos prefabs de arboles, el tronco rígido para que no lo atraviese y la copa siempre por encima con un script que controla el numero de layer por si hay varios juntos(este script es de los vídeos de Hektor profe que me parecen geniales) Total todo va bien, pero quisiera que cuando mi personaje pasa por debajo del árbol, tal que así Quisiera que la copa se volviera un poco transparente y así poder ver al personaje sin problema, he puesto un collider como triguer, y detecto cuando entra y sale sin problema, pero por mas que intento cambiar la transparencia no hay manera... Muchas gracias!!
  3. gracias!! ya lo he pillado, el problema estaba en la layer de la lava que estaba como default, al cambiársela ya me ve y me ataca! muchas gracias!!!
  4. Buenas, Tengo un enemigo arquero que no va mal, todos los enemigos localizan al jugador con raycast, y cuando entra en su zona de visión van hacia el, y si entra en su zona de ataque pues....si, ataca... El caso es que el arquero ataca desde que entras en su campo de visión, salvo que haya algun collider entre medias, en ese caso no detecta que entras, a uno en especial lo tengo puesto en una zona rodeado de lava, en los lagos de lava tengo puesto un collider a modo de ataque para que si el jugador lo pisa le quite algo de vida, y si se queda dentro pues acaba yendo a buscar el anillo único...pero con estos colliders el arquero no ataca, pongo un par de imágenes por si ayudan a que os hagáis una idea Este es el arquero en su zona, el cillider esta como triger, he usado un poligono que he ido ajustando Aquí se ve su visión y como tira el raycast Si quito desactivo el collider ataca sin problema Como puedo hacer para que ignore el colider y ataque? Gracias!!
  5. Buenas, Disculpad que no he podido escribir antes, lo he solucionado, en vez de la rotación modifico los eulerAngles, con eso la flecha apunta donde quiero, el problema parece que estaba en los grados de giro, que Rotation los coge de una manera y eulerAngles de otra, que esra la que yo necesitaba gracias!!
  6. buenas, He probado el LookAt, pero no me va, me añade rotación en X y en Y, con lo que el objeto se hace invisible practicamente Para poner mas en contexto, a mi me sale la flecha así y quisiera que saliera asi el objeto de la flecha tiene el sprite como en la primera imagen, así en horizontal, lo único que he visto para girarlo es añadiendo valor a la Z de la rotación, pero LookAt no me lo hace. En la funcion donde saco la rotacion cambia a Quaternion, lo asignaba con transform.rotation, tampoco me iba bien y por eso cambie a transform.Rotate y al Vector3 Gracias!!
  7. Muchas gracias! si basicamente es eso, como la imagen es una flecha normal en horizontal, la tire donde la tire va en horizontal....en cuanto llegue a casa lo pruebo que no conocia esa funcion! gracias!!!
  8. Muy buenas, Estoy con un RPG en 2D, estoy haciendo un enemigo arquero, tengo la imagen de la flecha, la instancio correctamente y va a su destino sin problema, o bueno, casi sin problema, porque claro la imagen es fija, una flecha en horizontal, y este donde este el objetivo la flecha va en horizontal.... He pensado que cambiando la rotación puedo hacer que apunte al destino, tengo este código( de momento solo pruebo con el disparo hacia abajo para ver si va bien) void Start() { player = GameObject.FindGameObjectWithTag("Player"); rb2d = GetComponent<Rigidbody2D>(); // Recuperamos posición del jugador y la dirección normalizada if (player != null) { target = player.transform.position; dir = (target - transform.position).normalized; Debug.Log("X "+dir.x); Debug.Log("Y " + dir.y); Vector3 rotacion = DameRotacionFlecha(); transform.Rotate(rotacion, 50f); } } private Vector3 DameRotacionFlecha() { Vector3 rotacion; float derecha = 0; float izquierda = 180; float arriba = 90; float abajo = -90; float diagAbjDcha = -45; float diagArrDcha = 45; float diagAbjIzq = -135; float diagArrIzq = 135; if (dir.y < 0) {//abajo if (dir.x < 0) {//izquierda if (dir.x > -0.85) { rotacion = new Vector3(0, 0, diagAbjIzq); } else { rotacion = new Vector3(0, 0, izquierda); } } else {//derecha if (dir.x < 0.85) { rotacion = new Vector3(0, 0, diagAbjDcha); } else { rotacion = new Vector3(0, 0, derecha); } } } else {//arriba if (dir.x < 0) {//izquierda rotacion = new Vector3(0, 0, diagArrIzq); } else {//derecha rotacion = new Vector3(0, 0, diagArrDcha); } } return rotacion; } void FixedUpdate() { if (target != Vector3.zero) { speed = 5; rb2d.MovePosition(transform.position + (dir * Speed) * Time.deltaTime); } } El caso es que cuando estoy por debajo de el y a la derecha va bien, pero si me cruzo a la izquierda nada....me pone otro valor en la "z" que no corresponde con lo que le asigno...igual no es la forma correcta de hacer que la flecha mire a su destino y me estoy complicando mucho cuando es mas sencillo... Gracias de antemano Un saludo
  9. Buenas, Por fin con algo de tiempo, he revisado y probado, y hasta se me ocurrió actualizar Unity que me salio el mensaje....vaya error, ahora no me va el joistyck, la barra de vida....jeje, en fin...a revisar mas cosas... He probado como decías, he quitado y puesto tantas cosas que la verdad no se decirte, pero al final creo que lo tengo, en la prueba 236 cambie el rigidbody del enemigo a Kinetic, con esto mejoro el asunto, empezaba a ver la luz, 10 o 12 pruebas después cuando creía que lo tenia me di cuenta que el muy @%$# del enemigo me seguía desplazando si me venia por arriba...el resto no....a seguir... Después de N pruebas mas se me ha ocurrido limpiarme las gafas, gracias a eso he visto que los colliders del enemigo estaban en el mismo objeto, tanto el trigger que uso para detectar los ataques como el que tengo para que no le pasen, y no solo eso, si no que el pequeñín, el que se supone que hace que no le traspasen ni muevan, sobresalía un poco por debajo y los lados....asi que he metido el collider triger en un objeto hijo y he ajustado el otro para que quede dentro y así no me desplaza ya...o por lo menos en las 6 o 7 pruebas que he hecho después....espero que tras colgar esto no deje de funcionar....porque me veo traduciendo a todos los idiomas "en mi ordenador funciona" cuando no paren de quejarse en los comentarios.... Muchas gracias Alex!!
  10. Muchas gracias, hoy tengo turno chungo de curro y no podre probar pero mañana en cuanto este en casa le doy, gracias de nuevo!
  11. Buenas, gracias, te cuento, mi personaje lo tengo asi ahora mismo Tengo dos BoxColliders, uno pequeño que ves para que choque, el otro que cubre al jugador es un triger para detectar los ataques, el circulo es mi ataque, lo tengo en un gameobject hijo. El script de"DatosJugador" contiene todos los datos de fuerza, vida y demas. el script de "Interactua" lo uso para hablar con NPCs, en el tengo la funcion "OnTrigerStay" para detectar los NPCs, cofres y demas objetos que tengo marcados como interactuables EL script de "Player" es el que contiene todo el movimiento, y tambien "OnTrigerEnter", es enorme, copio la parte del movimiento, espero que se entienda porque no es que sea un experto codificando, disculpad private void Update() { //lo uso para que el personaje no pueda salir si no ha completado alguna mision if (stopAll) { Detener(); DetenerAtaques(); StartCoroutine(MovimientoArribaUnPoco(0.5f)); } //compruebo que no esta hablando if (ManejaVentanas.IntefConversacion.activeSelf || Ataque1) { puedeAndar = false; touchStart = false; } else { puedeAndar = true; } if (puedeAndar) { Rect areaClick = new Rect(-300, -500, Screen.width / 2, Screen.width / 2); if (Input.GetMouseButtonDown(0)) { if (areaClick.Contains(Input.mousePosition)){touchValido = true;}else{touchValido = false;} pointA = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.transform.position.z)); if (!(ManejaVentanas.IntefConversacion.activeSelf) && touchValido) { circle.transform.position = pointA * +1; outerCircle.transform.position = pointA * +1; } } if (Input.GetMouseButton(0) && touchValido && areaClick.Contains(Input.mousePosition)) { pointA = outerCircle.position; touchStart = true; pointB = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.transform.position.z)); Vector2 offset1 = pointB - pointA; } else{touchStart = false;} } if (destino != Vector3.zero) { coliderAtaque.offset = new Vector3(animador.GetFloat("movX") / 2, animador.GetFloat("movY") / 2); } DatosJugador.PosX = transform.position.x; DatosJugador.PosY = transform.position.y; } void FixedUpdate() { if (touchStart && puedeAndar) { ManejaVentanas.IntefPremios.SetActive(false); Vector2 offset = pointB - pointA; Vector2 direction = Vector2.ClampMagnitude(offset, 1.0f); mov = direction; estableceAnimacion("walkingP", direction); moveCharacter(direction * +1); circle.transform.position = new Vector2(pointA.x + direction.x, pointA.y + direction.y) * +1; coliderAtaque.offset = new Vector3(animador.GetFloat("movX") / 2, animador.GetFloat("movY") / 2); } else { if (!stopAll && !Ataque1) { posDefectoJoystick.Set(DatosJugador.PosX - 10, DatosJugador.PosY - 5, 0); circle.transform.position = posDefectoJoystick; outerCircle.transform.position = posDefectoJoystick; Detener(); } } if (!touchStart) { Debug.Log("Nada"); Detener(); } } void moveCharacter(Vector2 direction) { player.Translate(direction * speed * Time.deltaTime); } el del enemigo seria este SU ataque lo tengo en el mismo. pero lo acabo de cambiar para hacer pruebas, lo activo y desactivo cuando ataca, durante menos de un segundo, se ve bien depurando, pero no se porque mi jugador no detecta la colisión, por eso el cambio para hacer pruebas, el código de movimiento seria: void Movimiento() { if (target != Vector3.zero) coliderAtaque.offset = new Vector3(anim.GetFloat("movX") / 2, anim.GetFloat("movY") / 2); target = initialPosition; Vector3 forward = transform.TransformDirection(player.transform.position - transform.position); Debug.DrawRay(transform.position, forward, Color.red); if (hit.collider != null) { if (hit.collider.tag == "Player") { target = player.transform.position; target.y = target.y - 0.4f; } } float acuanto = Vector3.Distance(transform.position, player.transform.position); if (acuanto < visionRadius) { Velocidad = 2; } float distance = Vector3.Distance(target, transform.position); Vector3 dir = (target - transform.position).normalized; if (target != initialPosition && distance < (attackRadius)) { anim.SetFloat("movX", dir.x); anim.SetFloat("movY", dir.y); if (!attacking) { anim.SetFloat("movX", dir.x); anim.SetFloat("movY", dir.y); Atacando(); } }else{ coliderAtaque.enabled = false; rb2d.MovePosition(transform.position + dir * Velocidad * Time.deltaTime); persigue = true; Velocidad = 2; anim.SetFloat("movX", dir.x); anim.SetFloat("movY", dir.y); anim.SetBool("walking", true); anim.SetBool("atak", false); } if (target == initialPosition && distance < 0.05f) { transform.position = initialPosition; anim.SetBool("walking", false); if (patrulla) { persigue = false; StartCoroutine(Espera(1)); } } if (!patrulla && target != player.position) { anim.SetBool("walking", false); initialPosition = transform.position; } else { AnimatorStateInfo infoAnim = anim.GetCurrentAnimatorStateInfo(0); float tiempoPlay = infoAnim.normalizedTime; bool andando = infoAnim.IsName("EnemigoWalk"); if (andando && tiempoPlay > 3) { initialPosition = transform.position; } } Debug.DrawLine(transform.position, target, Color.green); } private void Atacando() { AnimatorStateInfo infoAnim = anim.GetCurrentAnimatorStateInfo(0); attacking = infoAnim.IsName("EnemigoAtack"); if (!attacking) { anim.SetBool("walking", false); anim.SetBool("atak", true); } if (attacking) { float tiempoPlay = infoAnim.normalizedTime; if (tiempoPlay > 0.30 && tiempoPlay < 0.60) { coliderAtaque.enabled = true; } else { coliderAtaque.enabled = false; anim.SetBool("atak", false); } } attacking = false; } No se si haría falta algo mas, aunque no se si se entenderá algo, entre ver tutoriales y la "cosecha propia" a veces no se ni como hace algo esto jeje Muchas gracias
  12. Buenas, No se porque pasa, y no se como pararlo, pero cuando el enemigo se me acerca y me quedo quieto mi personaje empieza a irse hacia atrás, si huyo y el enemigo me deja tranquilo, al quedarme quieto sigue moviéndose, si me muevo hacia el lado contrario va un poco mas despacio y cuando vuelvo a parar nada, otra vez hacia atrás....eso hasta que colisiono con algun objeto rígido, ahí ya se para y se mueve normal.... He depurado y puesto mil mensajes de log pero no veo la forma de pararlo y que no se mueva, todo es en 2D y el movimiento depende de por donde me de el enemigo Muchas gracias
  13. Gracias Pioj, y disculpa, no vi la respuesta, de momento no me ha dado problemas, pero lo tendre en cuenta para mejorarlo, he probado en el movil y la tablet y va bien, algo amigo que ha probado me ha comentado que sin problema, pero si es como dices fallara en algun momento....
  14. Buenas, Solucionado! no se si es la mejor manera pero me ha ido bien Rect areaClick = new Rect(-300, -500, Screen.width / 2, Screen.width / 2); if (areaClick.Contains(Input.mousePosition)) { touchValido = true; } else { touchValido = false; }
  15. Buenas. He cambiado el movimiento de mi personaje, en vez de 4 botones de direccion he puesto un joystick, bastante chulo ha quedado, he usado el codigo de aqui http://www.astoldbywaldo.com/tutorials/2018/06/22/39/mobile-joystick-in-unity.html Lo he tenido que adaptar un poco porque mi personaje se mueve por el mapa, pero una vez conseguido eso va de lujo. Mi duda ahora es que el joystick se activa en cualquier parte del mapa y no quiero, me gustaría que fuera en una zona especifica, he hecho varias pruebas pero sin éxito, no se si poner un colider es la solución, no me parece lo mejor aunque igual si lo es... Muchas gracias
×
×
  • Create New...