(http://)Hola Máquinas de Unity Spain llevo mucho tiempo intentar resolver este tema pero no consigo encontrar nada de estoA ver si alguien me puede ayudar Gracias!!!!Os mando una imagen donde explico mi dudaGRACIAS COMPAS!!!!
(//<fileStore.core_Attachment>/monthly_2016_03/imagen.jpg.901a0a0c8f3d7ab307a20c0be26accff.jpg)
Programar un script para que el personaje escale una pared, suba por una escalera, etc. necesitas de dos elementos básicos.El primero es la animación propiamente dicha (escalar, trepar, etc.) Cualquier transformación extra (traslación, rotación, etc) que necesites aplicar al modelo durante la ejecución de la animación principal puedes incluirlo posteriormente mediante un script de evento de animación o insertando la transformación en el propio clip de la animación.El segundo elemento que necesitas en un método de control para activar la animación o al menos para determinar que puede ser ejecutada. Me refiero al evento que determina que el personaje está al lado de una escalera, de una pared, muro, etc y puede usar la animación prevista. Esto lo puedes resolver situando un boxcollider en el punto que desees y cuando el personaje entra en el área de detección ejecutar el script que desees.A estos dos elementos puedes añadir una infinidad de controles o características para afinar todavía más y conseguir variantes de lo que necesitas. Pero inicialmente es lo que tienes que resolver para conseguirlo.
Está totalmente claro que lo que me explicas, tiene su lógica pero no es tan fácil como parece, porque el character debe coincidir justo en la esquinita de la plataforma mientras sube y vamos.. que lo que quieres decirme es que tiene su truco y que no hay nada en concreto...Lo lógico es utilizar colisiones y a partir de eso realiza una acción...pero claro...no es tan fácil, porque el character controller debe colocarse justo en la plataforma superior...es decir : Ejemplo:al colisionar el player con un collider, y pulse el botón Up debería poner un translate al character controller en Y para que éste pase a la plataforma superior y mientras va subiendo también reproduce la animación etc... pero todo debe coincidir entre el character y con la plataforma que eso es lo dificil!!!!!!!¿y debe ser esta la manera, no existe otra? ¿no tienes idea de como se puede llamar? ¿todo el mundo lo hace de esa manera?¿tu como lo harías para que se enganche a la plataforma?GRACIAS POR CONTESTAR COMPAÑERO!!!!
[quote author=fulanodetal33" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35332" data-ipsquote-contentcommentid="127893">al colisionar el player con un collider, y pulse el botón Up debería poner un translate al character controller en Y para que éste pase a la plataforma superior y mientras va subiendo también reproduce la animación etc... pero todo debe coincidir entre el character y con la plataforma que eso es lo dificil!!!!!!![/quote]Inicialmente no necesitas poner ningún Translate al CharacterController salvo que, como ya dije, necesites aplicar alguna modificación al Transform del mismo. Para que el resultado visual sea el adecuado necesitas disponer de un modelo que ya incorporé esa animación concreta o asignarle una animación externa que lo haga.Si el modelo es compatible con el sistema de animación mecamin podrás incorporarle cualquier animación de este tipo sin problemas. Y en los parámetros de la animación usar el Root Transform Rotation, el Root Transform Position (Y) y el Root Transform Position (XZ) para hacer que al escalar se eleve. Que luego, aparte, le incluyas algún
Título: ¿CÓMO SUBIR A LA PLATAFORMA SUPERIOR?
Publicado por: fulanodetal33 en Marzo 06, 2016, 12:43:19 AM
ok, lo de las animaciones y los transform está totalmente claro!! eso ya está mas que dominado y los colliders también...y se sabe que con todo eso se puede hacer una infinidad de cosas.Pero creo que esto es bastante distinto a cualquier colisión o animación.el tema es el ¡¡¡¡ ENGANCHE !!! (el personaje se agarra a la plataforma, juntos, pegados) que es lo que intento averiguar como muestro en las imágenes Pues intentaré averiguar que es el el Root Transform Position , (de momento ya tengo una cosa) a ver si voy avanzando con esto...porque no hay manera.... GRACIAS
... y debe de ser esta manera, no existe otra ? existen un monton de maneras, tantas como te de la imaginacion
Esto tiene tambien bastante de IK cinemáticas inversas, sin experiencias es muy complicado lograr algo..
Empezaría por programa movimientos basicos
Pues mira, tres años sin saber... pues alomejor es porque estoy mas ocupado que tu y no tengo tiempo para aprender.si no te gustan mis preguntas para que coño contestas? para vacilarme?pero no hace falta que vengas a presumir de lo avanzado que eres !!!Te parecen que mis preguntas son ridículas??? pues te formulo una última Rey Arturo!!¿para eso te metes en foros, para presumir y vacilar a la peña?
Bueno...paso del rey Arthure ese..... gracias por contestar
francoe1 ,los movimientos básicos mas o menos los tengo claros, la IK cinemática inversas se que eso lo tiene el 3d studio en animación porque yo controlo mas el tema del diseñopero bueno parece que hoy la gente sólo sabe decirme que no valgo y no sirvo y que empiece por lo básico, este es el foro de unityspain jajajajajajaj ¡¡¡madre mia , vaya tela!!!!!se que no me has dicho nada
francoe1 , pero me ha encendido el Arthure de los huevos ese...
Creo que me mal interpretaste, no estoy presumiendo nada, lo único que hice fue añadir al comentario de Arthure un poco mas de información..
Esto tiene tambien bastante de IK cinemáticas inversas, sin experiencias es muy complicado lograr algo..[/quote]Mi intención no era molestarte, y de hecho aporte bastante ya que el 80% del sistema se realiza con IK esto te va a servir para luego posicionar las partes del cuerpo correctamente, por eso dije, Primero empezaría con todos los movimientos básicos, luego lo iría puliendo.Aun que esta parte es algo bastante tedioso y lleva mucho trabajo lograr algo mas o menos decente, aparte de la gran cantidad de bug que empiezan a salir.Ten en cuenta que debes dispara varios RayCast para comprobar la posibilidad de Climb, tambien debes comprobar el normal de la pared y otras cuestiones, que si bien no es complicado, al final se termina armando un gran problema... Existen muchisimas técnicas como te comentaron antes otros usuario, por ejemplo la saga Assassin's Creed utiliza Triggers al igual que Tomb Rider y Far Cry 3,4. Si necesitas ayuda no tengo problema, es más esta clase de cosas son las que me gusta programar. Saludos!
[quote author=fulanodetal33 date=1457223094" data-ipsquote="" data-cite="fulanodetal33" class="ipsQuote">Pues mira, tres años sin saber... pues alomejor es porque estoy mas ocupado que tu y no tengo tiempo para aprender.si no te gustan mis preguntas para que coño contestas? para vacilarme?pero no hace falta que vengas a presumir de lo avanzado que eres !!!Te parecen que mis preguntas son ridículas??? pues te formulo una última Rey Arturo!!¿para eso te metes en foros, para presumir y vacilar a la peña?pero bueno parece que hoy la gente sólo sabe decirme que no valgo y no sirvo y que empiece por lo básico, este es el foro de unityspain jajajajajajajse que no me has dicho nada
francoe1 , pero me ha encendido el Arthure de los huevos ese...[/quote]Siento haberte ofendido, no era mi intencion, solo intentaba darte un consejo tan sencillo como que aprendieras a programar, no hacia falta que te encendieras por leer algo tan obvio. Las personas son libres de aceptar o no los consejos, y eso no debe ser motivo de ofuscacion o pensar que alguien esta presumiendo o vacilando ... a decir verdad es la primera vez que "escucho" que un consejo significa eso.No dudo de que seas una persona muy ocupada y no quiera perder tiempo en aprender a programar, pero eres un poco engañado si crees que buscando videotutoriales vas mas rapido. Un par de meses invertidos en aprendizaje no es nada, luego es tiempo mas que recuperado ... 36 meses dedicandose a buscar y copiar (encima sin entender) de videotutoriales es mucho mas tiempo; sin mencionar las limitaciones que eso supone. Asi que lo que tu llamas (incoherentemente) falta de tiempo otra persona podria llamarlo pereza o perreria pero asi va el mundo xDPero en algo si tienes razon, esto es el foro de unityspain: mucha gente que sabe del tema, se esfuerza en aprender cada dia un poquito mas, hace sus proyectos propios porque les gusta y se sienten orgullosos de su trabajo ... y otra mucha gente que piensa en hacer un juego sin molestarse en aprender pensando que copiando unos videotutoriales de internet se van a hacer ricos. Como esta claro que no tienes mucho interes en aprender supongo que perteneces al segundo grupo, tampoco es malo si se piensa de esa manera siendo consciente.Como dije en mi primer post, suerte con tu proyecto

Título:
¿CÓMO SUBIR A LA PLATAFORMA SUPERIOR?
Publicado por:
Braltor en
Marzo 06, 2016, 03:07:46 PM
no creo que los juegos viejos usaran ninguna IK, menos los 2D... solo necesitas un editor de mapas que marque las esquinas superiores de cada plataforma, luego le pones una zona de deteccion de agarre al personaje... si el punto de agarre esta en la zona de agarre entonces se quita la gravedad y se ejecuta la animacion de escalada moviendo el personaje acorde... recuerdo que en muchos juegos el personaje hacia un brinquito hacia la plataforma para ajustarlo en el punto horizontal de agarre... esto pq nadie tiene el ojo ni paciencia para colocarlo justo en la vertical del punto de agarre... es muy dificil perfeccionar eso para q no se note, pero ahi tienes lo basicosi te quieres reventar la cabeza sigue el camino del IK y la detección de vértices xD
Claro!! ya lo estuve viendo y el IK eso es para el 3d!! yo intento hacer un juego en 2DAlomejor no debí colocar la imagen del tomb raider en la imagen que he enviado para preguntar en el foro, pero sólo era un ejemplo, he puesto claramente que intento hacer un juego en 2DLA idea sería colocar un collider2d justo en la esquina de la plataforma y apartir de ahí cuando salte el character y colisione con collider2d programar y quitar la gravedad (no se si sería una buena idea) el problema es que cuando esté enganchado a la plataforma este suba...mando una imagen de como podría ser :Gracias Braltor me has servido de bastante ayuda !!! menos mal que hay compañeros que si van con intenciones de ayudar
si usas rigidbody lo mueves con rigidbody dentro de fixedupdate, sino con transform en update
OK, Braltor, probaré transform en update!! eres mu grande!! Cuando termine éste problema y funcione correctamente lo publicaré en unityspain para los que les interese este tema GRACIAS POR CONTESTAR!!
Hola Fulanodetal.Yo puedo comentar como lo hice en mi caso, es un juego 3d, no 2d, a ver si consigo aclararme para no explicarlo con mucho lio >.<Desde Unity 4, se incorporó una función con el sistema de animación mecanim, que permite desplazar un personaje durante la animación para que cierto hueso del humanoide coincida con una posición seleccionada durante la animación. Por lo que, sin esa función, podría ejecutar la animación de escalada como se menciona arriba, pero con ella, es lo que hace que se agarre al saliente. Creo que este era el proyecto:
https://www.assetstore.unity3d.com/en/#!/content/5328 Una de las demos, es del personaje escalando un contenedor que usa el sistema de ajuste. Imagen -
https://yadi.sk/i/2E_k7HEMpxzdp (Sólo podemos tomar una extremidad de base a la vez, en este caso el desplazamiento se hace en base a la mano, no tiene en cuenta que el pié está traspasando. Se podría hacer que sea el pié quien controle el desplazamiento pero no los 2 a la vez)Imagen2 -
https://yadi.sk/i/bytzMhtxpy2Fo (La bola azul, es el Alineador, el punto donde el personaje pondrá la mano).Imagen3 -
https://yadi.sk/i/MysAlejQpy2MT (Aqui se puede observar las variables Matching de mi proyecto, en el controller, esas variables son suficiente, pero cada animación de escalada, debe tener sus propias curvas)Dicho sistema, consiste en que al código, le digas cuando activar dicho ajuste y cuando pararlo, para ello, esa demo usa un par de variables en el gráfico de Mecanim, y las ajusta como curvas en la animación. (En mi proyecto de la captura, las he llamado MatchStart y MatchEnd). Al usarla como curvas, podemos decir en qué momento de la animación exacto se activa una variable y en qué momento detenerla. Al hacer eso, lo que debería pasar es que cuando se ejecute la animación, esas variables tomen el valor necesario en el momento adecuado, nada más, eso es lo único que queremos de ellas.Luego, en el código, en el momento en que hayas decidido disparar la animación y esta esté ejecutándose, deberás lanzar la función maravillosa:
http://docs.unity3d.com/ScriptReference/Animator.MatchTarget.htmlanimator.MatchTarget (matchPosition, matchRotation, target, weightMask, normalisedStartTime, normalisedEndTime);
Traduciendo un poco:En matchPosition, es la posición donde se pondrá el hueso, para esto tengo un objeto vacío que pongo en el borde que quiero escalar, la posición de ese objeto es la que mando aqui.En matchRotation, por su nombre parece que es la rotación del mismo objeto destino, pero no recuerdo si influía mucho con la animación (esto hace meses que lo hice no recuerdo muy bien O.ò)En Target, es el hueso del humanoide Mecanim que debe ponerse en ese lugar, puede que tu target sea que la mano derecha esté agarrándose al saliente o cogiendo la barra pero también puede que necesites que el pié esté sobre el poste o que la patada llegue hasta cierto interruptor... Pues eso, en Target elige el hueso de la lista Avatar Target (Mano D, Mano Izq, Pie D o Pie Izq, tampoco es que hayga una gran variedad...)En weightMask es una estructura temporal que el sistema utiliza para el desplazamiento, en la demo le cargaban esto: "new MatchTargetWeightMask(new Vector3(1, 1, 1), 0)" .normalisedStartTime y normalisedEndTime, son las variables de antes que hay en el mecanim, se dice normalizadas porque van de 0 a 1, (la variable no dice que "el desplazamiento" comienza en el segundo 8, lo que dirá es que empieza en el momento 0.12 de la animación, y así... Dicho valor también lo muestra el inspector en el mismo menú de las curvas así que tampoco es mucho problema.Al final la línea a mi proyecto me quedó algo así:
animator.MatchTarget(ClimbPoint.position, ClimbPoint.rotation, AvatarTarget.RightHand, new MatchTargetWeightMask(new Vector3(1, 1, 1), 0), animator.GetFloat("MatchStart"), animator.GetFloat("MatchEnd"));Básicamente el requisito antes de lanzarla, es ponerle la posición, (porque si no, se va a quedar sin saber que hacer y dando errores) para practicar, puedes crear una variable transform y ponerle un objeto nuevo que sea el Alineador y ponerlo en dicha variable, cuando ejecutes la animación, si lo hiciste bien, deberías ver como en el momento correcto, el personaje se desplaza hasta que el hueso elegido esté en la posición del objeto.Segunda parte, la colisión, pronto verás que el personaje efectivamente choca contra el borde y este puede detener dicho desplazamiento (provocando que ¡el personaje no escale!) bueno, en su momento mi solución fue drasticamente desactivar el collider del jugador mientras ejecuta la animación de escalada, y reactivarlo cuando acabe. Y funciona... O.ò (Desactivar, hacerlo como "IsTrigger", cambiar el layer a una nueva capa que no "colisione" con la capa de la geometría, etc...) el caso es que hay que hacerle algún apaño o seguirá chocando contra la geometría, ya depende de cada juego y las necesidades de cada uno el tipo de apaño que se haga.Tercera parte, una vez tengas eso funcionando en tu personaje, (bueno, el jugador los enemigos o lo que sea),lo siguiente sería hacer que esa habilidad funcione en cualquier saliente, como habrás imaginado ya, la clave ahora es la posición de ese Alineador, porque donde esté, será la parte donde el jugador ponga su mano, bien, si esto fuera un Tomb Raider clásico, donde la geometría de los escenarios son claras y simples, se podría hacer que el personaje vaya disparando un rayo invisible justo delante y desde arriba, y donde de el rayo, poner el Alineador, y cuando veas adecuado, activar la opción para que active la escalada, (no sé, si la distancia entre la altura del Alineador y la del jugador es mayor que 4, significa que el jugador tiene delante un saliente y puede activar la escalada pulsando la tecla acción...) Entonces detienes un momento la actualización del Alineador, activas la escalada y reactivas la actualización del alineador, sería una manera.
En mi proyecto, la colisión no es tan exacta o la geometría no es tan previsible, si hiciera algo como lo de los Tomb Raider clásicos, podría suceder que mi personaje escalara y atravesara algún muro, que no quiero, o que se suba a los muebles que tampoco quiero. Además, mis enemigos tiene que poder ***guirle y estos pues, no tienen tanta inteligencia como para permitirse esa libertad. :| Así que en mi proyecto uso los disparadores.
Cada "escalador" mio, es un disparador con su propio alineador, que dice la altura del saliente. Cuando el jugador entra, el alineador se desplaza horizontalmente por el saliente para encajar con la posición del jugador o enemigo, pero manteniendo la altura y profundidad, también al entrar, dicho alienador se pone como el "alineador activo" del jugador o enemigo, tras lo cual, se empieza a mirar las conidciones para iniciar la escalada (Que no esté disparando, ni muerto, ni le esté agarrando ningún zombie, etc...) Si todo va bien, se activa la animación de escalada que usará el alineador de ese lugar. Esto quiere decir que voy llenando mi escenario de Escaladores para que los salientes sean interactuables, me viene bien porque tampoco hay tantos salientes.Imagen:
https://yadi.sk/i/Nk46_rTLpy2Sq (como el alineador sólo se mueve horizontalmente, necesito usar varios "Escaladores" cuando la superficie es curva) Puede parecer algo lioso, pero en realidad la programación no se intensifica mucho, hace falta la función "MatchTarget" que es algo raruna "made in Unity" pero el resto no es nada nuevo. Pero como dije al principio, esto es en 3d, porque usa la función del animator, (sistema de animación mecanim), para 2d, que no es un modelo si no un gráfico que sólo tiene 1 hueso, (el de posición) pues el desplazamiento habría que programarlo manualmente... creo que la idea sería la misma, coger un punto de referencia y arrastrar el hueso del dibujo 2d hasta dicha posición con algún Slerp. y Que dicha función de desplazamiento pues se active si no es por la animación del dibujo, pues que sea por tiempo (tras pulsar la tecla, el desplazamiento se activarás tras los 0.2 sec y se desactivará tras los 0.6s) puede parecer también un comecocos, pero recuerda que esta función una vez la tengas, es una mecánica que puedes usar en muchas partes de tu juego, así que tal vez no sea algo tan temible. O.ò
Pues muchas gracias por tu gran explicación
Adngel!!Pues utilizar un Slerp no sería una mala idea, sería una opción mas. Veo que tu explicación se basa mucho mas en el 3d y es normal, ya que tu proyecto es en 3d, va de p...madre saber todo esto para cuando se me ocurra hacer un videojuego en 3d, pero de momento seguiré con mi proyecto que yo soy mas de los antiguos...Nunca he llegado a programar este tipo de cosas, pero lo entiendo bastante bien y ayuda ha seguir intentando como poder hacerlo en 2DPor el momento se me ocurre utilizar un collider justo debajo de la plataforma y que active una variable boolean. (al colisionar, la variable se pone en true) e indica que ese sería el punto de referencia donde se puede enganchar en la parte superiorEn ese momento que el personaje 2D (Sprite) salta en vertical y colisiona con otro collider que está en la esquinita de la parte superior de la plataforma, desactivo la gravedad o el rigidbody para que se detenga o se quede inmóvil, (y por supuesto reproduciendo la animación de estar enganchado colgando) aunque también debería indicarle la posición con transform ,por ejemplo:Como me cuentas tu utilizas huesos de las manos para agarrarse con "MatchTarget" pero yo no puedo hacer eso, así que no tengo mas remedio que utilizar un transform para que las manos se queden justo en la esquina de la plataforma y parezca que esté enganchado.(con las manos me refiero que el sprite completo esté colocado de tal manera que parezca que esté enganchado a la plataforma)Cuando pulso el botón up para desplazarse hacia arriba utilizar un Lerp y llegar hasta la parte superior....Pues no sé si estoy en lo correcto o es una chapuza lo que estoy diciendo pero seguiré hasta que lo consiga JAJAJAJAJA.Por eso pregunté al principio del foro si se conocía algún tutorial para conocer como se hace realmente, cual sería el método exacto para hacer este tipo de cosas.Con el 3D está totalmente claro,y hay un huevo de tutoriales que explican todo esto ,asi es como se hace, como tu lo dices Adngel y hay un método exacto para hacerlo, pero en 2D parece que la cosa se complica, y es extraño...ya que son los métodos mas antiguos en los juegos de plataformas...GRACIAS DE NUEVO Adngel!!!! Suerte con tu proyecto!!!!