Jump to content

Wazabee

Registrados
  • Content Count

    20
  • Joined

  • Last visited

  • Days Won

    1

Wazabee last won the day on March 28 2017

Wazabee had the most liked content!

Community Reputation

3 Neutral

About Wazabee

  • Rank
    Iniciado

Profile Information

  • Especialidad
    Diseñador
  1. ... Es correcto, era el rigidbody... Debi marcarlo sin darme cuenta antes de irme a la cama y no me fijé o no se pero hoy me he vuelto medio tonta intentando encontrar la solución... El caso es que ahora va bien. Gracias!
  2. Hola, Ayer en mi proyecto todo funcionaba bien pero, esta mañana al volver a ponerme con él, al exportar animaciones desde 3DS com estuve haciendo ayer he tenido problemas de deformaciones en la malla de mi personaje así que, después de intentar encontrar (sin exito) qué era lo que pasaba he decidido reimportar mi personaje y mis animaciones. El problema es que ahora el personaje (con su correspondiente colisionador) atraviesa todos los colisionadores que hay en el escenario... Me parece muy extraño puesto que el modelo que se deformaba y el nuevo tienen los mismos componentes lo que uno atraviesa todo y el otro no... No se si es que me olvido algo (que diría que no) o que es lo que pasa. Si alguien me puede echar una mano porfa... Untitled.mp4
  3. Bien, después de estrujarme los sesos, he dado con la solución y, cuando lo he hecho me ha dado hasta vergüenza haberlo preguntado... Era tan sencillo como añadir, en el sitio adecuado, una línea tal que así: transform.position.y = valor de "y"; y ya... Esta solución necesita que en cada animación se especifique el valor de "Y" para que siempre esté a nivel del suelo. Por otro lado, en un nivel en el que el suelo sea plano no habría ningún problema, pero si hay desniveles en el terreno no servirá. Así que, para salir del paso está bien, pero lo suyo es que todas las animaciones se ejecuten al mismo nivel. Salu2!
  4. Hola a tod@s, Estoy desarrollando un proyecto y tengo un problema con una de las animaciones. Cuando el enemigo empieza a andar, la animación se ejecuta bien pero por debajo del nivel del suelo. Todas las demás animaciones funcionan al nivel correcto. El tema está en que no consigo dar con la solución para poner la animación al nivel que toca, de hecho no estoy seguro de que se pueda hacer desde Unity directamente y en caso de que se pueda, no se hacerlo y no doy con ello. ¿A alguien se le ocurre o sabe cómo solucionarlo? Adjunto unas capturas para que se vea claro el problema. Muchas gracias de antemano! Saludos
  5. Muchas gracias. Supongo que, cuando termine estos ejercicios, me liaré con todo el tema de los enemigos que patrullan y todo eso. Por ahora todo esto me resulta un poco confuso pero espero que, con un poco de práctica, todo quede más claro y los códigos sean un poco más eficientes. Gracias!!
  6. Ugh...Gracias, pero eso de chapucera...Estoy aprendiendo a codear en JavaScript y a mi me parece muy complicado. Hago lo que puedo....Por el momento he podido solucionarlo, pero tomo nota de tu consejo. Esta noche le echo un ojo al video y, si necesito ayuda te comento!! Gracias!
  7. Hola a todos, Tengo un pequeño problema con un enemigo. Por ahora, en el escenario, sólo tengo un enemigo que, cuando me acerco a una cierta distancia, me persigue y me ataca. El problema que tengo es que, cuando deja de detectarme necesito que vuelva a su posición inicial almacenada en una variable y no sé cómo hacerlo. Llevo varios dias dándole vueltas al tema y no hay manera de encontrar la sentencia adecuada y todo lo que consigo es que, cuando deja de "verme", siga andando hacia mí y eso no me interesa... Adjunto código a ver si me podéis ayudar: var target : Transform; var initpos : Vector3; var anim : Animator; var SeeU : boolean = false; var attackanim : boolean = false; //var notSee : boolean = false; function Start () { initpos = transform.position; anim = GetComponent.<Animator>(); } function Update () { if (transform.position.y > target.position.y -0.5f && transform.position.y < target.position.y + 0.5f){ // var pos = transform.position - target.position; var pos = target.position - transform.position; SeeU = true; if (Vector3.Distance(transform.position, target.transform.position)<12 && Vector3.Distance (transform.position, target.transform.position)>1 && SeeU == true){ var rot = Quaternion.LookRotation (pos, Vector3.up); if (SeeU == true){ anim.SetTrigger ("seeU"); transform.rotation = Quaternion.Slerp (transform.rotation, rot, 2*Time.deltaTime); transform.Translate (Vector3.forward * Time.deltaTime * 0.3); print ("Te estoy viendo"); } } else if (Vector3.Distance (transform.position, target.transform.position)<=1) { var rot2 = Quaternion.LookRotation (pos, Vector3.up); transform.rotation = Quaternion.Slerp (transform.rotation, rot2, 2*Time.deltaTime); anim.SetTrigger ("attack"); } else { print ("no te veo"); //AQUI DEBERÍA IR LA SENTENCIA QUE HACE QUE EL ENEMIGO VUELVA A SU SITIO, PERO NO DOY CON ELLA... } } Muchas gracias Salu2!
  8. Genial! Gracias TheBullet! Ahora si que si! Saludos!
  9. Gracias Juanma por tu respuesta, pero no logro hacerlo funcionar...Al usar "Mathf.Approximately" me pasa lo mismo de antes, el "if" no se cumple: if (Mathf.Approximately(transform.position.y, target.position.y)) Lo que me extraña es que las posiciones en Y son parecidas, el enemigo está en Y = 2.242 y el personaje está en Y = 2.296856. Para mí son aproximadamente iguales pero, a lo mejor, para Unity excede el rango o no sé...Así que sigo atascado en esto...
  10. Hola a tod@s! Sigo con mi proyecto de aprendizaje con Unity y JavaScript. Ahora estoy desarrollando un script para un enemigo. Por ahora he conseguido que el enemigo rote mirando al personaje conforme éste cambia su posición. Ahora bien, el enemigo siempre rota siguiendo al personaje, pero lo que me interesa es que si el personaje está a una altura diferente, el enemigo no lo detecte y no rote conforme el personaje se mueve... El script que tengo es este: #pragma strict var target : Transform; function Start () { } function Update () { //var pos = transform.position - target.position; // Siempre de espaldas var pos = target.position - transform.position; // De cara var rot = Quaternion.LookRotation (pos, Vector3.forward); transform.rotation = Quaternion.Slerp (transform.rotation, rot, 2*Time.deltaTime); } He probado con hacer algo como if (transform.position == target.position){ //var pos = transform.position - target.position; // Siempre de espalda var pos = target.position - transform.position; // De cara var rot = Quaternion.LookRotation (pos, Vector3.forward); transform.rotation = Quaternion.Slerp (transform.rotation, rot, 2*Time.deltaTime); } else { print ("Enemy 'Y' position is "+ transform.position.y); print ("Character 'Y' position is "+ target.position.y); } } Pero el "if" no se cumple nunca. He probado a cambiar la altura del GameObject que actúa como target y varias cosas más, pero no consigo que se cumpla nunca y no sé cómo podría solucionarlo o plantearlo de otra forma. A ver si algun@ me puede echar una mano a enfocar la cosa... Mil gracias, Saludos!
  11. Hola a tod@s, Estoy haciendo pruebas con un proyecto tipo "Frontón". 3 paredes, suelo, raqueta y pelota. La pelota está emparentada a la raqueta y, ésta última, además de moverse hacia adelante, hacia atrás, hacia izquierda y derecha, también puede girar hacia derecha e izquierda. Todo funciona como es de esperar excepto que, si la pala está recta, mirando a la pared frontal, al disparar la pelota, ésta sale en dirección a la pared frontal. Hasta aqui, guay. Pero si giro la pala hacia una de las paredes laterales, la pelota sale también en línea recta hacia la pared frontal, no hacia los lados como sería lo que tendría que hacer. Adjunto el fragmento de código que controla el disparo de la pelota: var rb : Rigidbody; var velocidadInicialHorizontal : float = 1000f; var velocidadInicialVertical : float = 450f; var raqueta : GameObject; //Variable que llama al objeto "pala" para poder controlar ciertas características var recuperacion : boolean = true; //Variable que controla cuándo podemos recoger la pelota y cuando no var pelotalanzada : boolean = true; //Variable que regula cuando la pelota está en juego para que no pueda ser re-lanzada cuando está en el aire function Update () { if (Input.GetButtonDown ("Jump") && pelotalanzada == true) { // Al presionar la tecla "Espacio" lanzamos la pelota transform.parent = null; //Desvinculamos la pelota de la pala pelotalanzada = false; //Al ser esta variable FALSE la tecla "Espacio" deja de funcionar para no poder re-lanzar la pelota rb.isKinematic = false; rb.AddForce (new Vector3 (, velocidadInicialVertical, velocidadInicialHorizontal)); //Disparamos la pelota. **** De momento, aunque la pala esté girada, la pelota sale siempre hacia la pared frontal **** } } Entiendo que, para hacer lo que quiero, la sentencia "rb.AddForce (...)" debería tener como "new Vector3" la dirección en la que está mirando la raqueta. El tema está en que no se como relacionar la orientación de la raqueta con el AddForce de la pelota...Alguna idea, sugerencia o similar por favor? Espero haberme explicado bien... Gracias
  12. Muchas gracias por tu ayuda Harsel. Aunque no es exactamente lo que buscaba, tu respuesta me ha sido muy útil para dar con la solución. Al final la cosa ha quedado así: function OnTriggerEnter (collider:Collider) { if (collider.gameObject.tag=="Item") { print ("Estoy recogiendo mi Item"); //Destroy(collider.gameObject); //print ("You spent " + Time.time + " seconds to finish this level"); // La diferència d'un comptador a l'altre és mínima print ("Has tardado " + reloj + " segundos en hacer el recorrido"); print ("YOU'VE BEEN RESPAWNED"); record = reloj; //Guardamos el tiempo que hemos tardado en hacer el recorrido //print (tiempoinvertido); if(record <= tiempoinvertido){ //Comparamos el valor "record" con el valor "tiempoinvertido". Si el primero es menor o igual al print("NUEVO RECORD " + record); // segundo mostramos el NUEVO RECORD } tiempoinvertido = reloj; // Almacenamos el tiempo que tardamos igualando el valor de "reloj" al "tiempoinvertido" transform.position = new Vector3 (31.43, 2.248855, 140); reloj = ; } } En la función Start le he dado un valor alto a la variable "record" de manera que la primera vez no salte el mensaje del Nuevo Record. Muchas gracias!
  13. Hola a tod@s, Estoy estancado en un proyecto y necesito ayuda. En mi escenario, el personaje tiene que hacer un recorrido y, al final de éste, recoger un objeto. Al hacerlo, el personaje vuelve al punto de partida y debe hacer de nuevo el recorrido para volver a recoger el objeto. Hasta ahí no hay problema. El tema está en que una vez hecho esto, si el tiempo que tarda en hacer el recorrido por segunda vez es inferior al tiempo invertido la primera vez, se debe mostrar en consola un mensaje de felicitación y es ahí donde me he quedado bloqueado y no encuentro la forma de solucionarlo. El problema (creo) está en la función "OnTriggerEnter". Adjunto el código para ver si me podéis echar un cable: #pragma strict //Variables OBJETOS CON EFECTOS TEMPORALES var scriptPersonaje : UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter; var contador : float; var contador_switch : boolean; var reloj : float; var tiempoinvertido : float; var record : float; //Variables RAYCAST var hit : RaycastHit; //Variables MUERTE var onGround: boolean = true; // nos dice cuando el personaje está en caida var firstY : float; // Posición inicial del personaje var lastY : float; // La última posición del personaje en que tocaba suelo var hFall : float; var character: CharacterController; var salud : int = 20; function Start () { firstY = transform.position.y; } function Update () { //RAYCAST if (Physics.Raycast(transform.position, transform.forward, hit, 5)){ if (hit.collider.gameObject.tag=="interruptores"){ print ("Estoy tocando el interruptor. Pulsa 'E' para recogerlo"); if(Input.GetKeyDown("e")) { print ("He cogido el interruptor"); Destroy(hit.collider.gameObject); } } } reloj = reloj + Time.deltaTime; //ITEMS DE TIEMPO LIMITADO if (contador_switch){ // Esta variable controla el tiempo que los items de tamaño y velocidad están activos contador = contador + Time.deltaTime; if(contador>5){ contador = ; contador_switch = false; } } else { scriptPersonaje = GetComponent (UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter); scriptPersonaje.m_MoveSpeedMultiplier = 1; transform.localScale = new Vector3 (1f, 1f, 1f); } } // FUNCIONES DE COLISIONES function OnCollisionEnter(collision: Collision) { // COLISIONES CON ITEMS Y LÍMITES DEL ESCENARIO // Podría ser también: // function OnCollisionEnter (hit:Collision){ if (collision.gameObject.tag== "cubo") { // if (hit.gameObject.tag== "cubo") { print ("Estoy Chocando Con El Cubo"); // print ("Estoy Chocando Con El Cubo"); } // } if (collision.gameObject.tag== "limite"){ print ("No creo que deba ir por ahí"); } // COLISIONES PARA CONTROLAR CUANDO ESTAMOS EN EL SUELO if (collision.gameObject.tag=="suelo") { //Cada vez que tocamos el suelo grabamos nuestra última posición lastY = transform.position.y; hFall = firstY - lastY; if (hFall > 4){ print ("GAME OVER"); // Si caemos de una altura de más de 4 unidades, palmamos transform.position = new Vector3 (31.43, 2.248855, 140); // RESPAWN print ("YOU'VE BEEN RESPAWNED"); } } if (collision.gameObject.tag=="plataformas") { //Cada vez que tocamos el suelo grabamos nuestra última posición lastY = transform.position.y; hFall = firstY - lastY; if (hFall > 2){ // Si caemos de una altura de más de 2 unidades nuestra salud disminuirá 5 puntos salud -= 5; //NO FUNCIONA BIEN POR LAS FÍSICAS DE UNITY print (salud); } } } function OnTriggerEnter (collider:Collider) { // COLISIONES CON ITEMS NORMALES E ITEMS DE TIEMPO LIMITADO if (collider.gameObject.tag=="cubo-tamaño") { //Al recoger este item aumentamos nuestro tamaño 0,5 unidades //print ("Esto es un trigger"); contador_switch = true; transform.localScale += new Vector3(1.5F, 1.5, 1.5); Destroy(collider.gameObject); } if (collider.gameObject.tag=="cubo-velocidad") { //Al recoger este item multiplicamos la velocidad X3 contador_switch = true; scriptPersonaje = GetComponent (UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter); scriptPersonaje.m_MoveSpeedMultiplier = 3; Destroy(collider.gameObject); } if (collider.gameObject.tag=="Item") { print ("Estoy recogiendo mi Item"); //Destroy(collider.gameObject); //print ("You spent " + Time.time + " seconds to finish this level"); // La diferència d'un comptador a l'altre és mínima print ("Has tardado " + reloj + " segundos en hacer el recorrido"); print ("YOU'VE BEEN RESPAWNED"); tiempoinvertido = reloj; // Igualamos el valor del reloj al tiempoinvertido //print (tiempoinvertido); /* EL PROBLEMA ESTÁ POR AQUÍ (CREO). ENTIENDO QUE, SEGÚN LO QUE TENGO ESCRITO, LA VARIABLE "record" SIEMPRE SERÁ IGUAL A LA VARIABLE "tiempoinvertido" Y AL RELOJ. LA COSA ESTÁ EN QUE NO SÉ CÓMO HACERLO PARA DISTINGUIR ENTRE "record" Y "tiempoinvertido" Y QUE FUNCIONE COMO YO QUIERO */ record = reloj; if(record < tiempoinvertido){ print("NUEVO RECORD " + record); } reloj = ; transform.position = new Vector3 (31.43, 2.248855, 140); } } function OnCollisionExit (collisionInfo : Collision) { //COLISIONES DE CONTROL CUANDO DEJAMOS DE TOCAR EL SUELO if (collisionInfo.gameObject.tag=="suelo") { //Cuando saltamos no estamos en el suelo, por lo tanto OnGround = false // print ("Estoy en el suelo"); onGround = false; firstY = transform.position.y; } if (collisionInfo.gameObject.tag=="plataformas") { //Cuando saltamos no estamos en el suelo, por lo tanto OnGround = false onGround = false; firstY = transform.position.y; } } Saludos y muchas gracias de antemano
  14. Bueno, gracias a los dos por echarme una mano, pero al final lo estoy intentando hacer de otro modo. La idea ahora es acceder a la variable del Script "ThirdPersonCharacter" desde mi Script "Colisiones" ( que estan en carpetas distintas) via GetComponent (UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter) y ahí ya cambiar la velocidad. Lo que no tengo muy claro cómo hacerlo para que sea sólo durante un periodo de tiempo determinado y no de forma permanente. Supongo que será combinando un contador de tiempo y un boolean o algo así, pero no sé muy bien cómo...Seguiré investigando a ver si saco algo en claro. Sobre lo de "Podría ser también" era una aclaración para mi mismo porque tuve un montón de problemas para que me funcionara esa función y, al final, de esos dos modos tiraba bien y lo de por qué uso OnCollision y OnTrigger es porque el ejercicio que estoy haciendo me lo requiere... De nuevo gracias a los dos Saludos
UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...