Jump to content

Antonio

Registrados
  • Content Count

    199
  • Joined

  • Last visited

  • Days Won

    6

Antonio last won the day on December 2 2019

Antonio had the most liked content!

Community Reputation

185 Excellent

2 Followers

About Antonio

  • Rank
    Asiduo

Profile Information

  • Especialidad
    Coder

Recent Profile Visitors

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

  1. Saludos. Durante este tiempo, me las he apañado bien usando 3ds max y maya, pero en un intento de legalizar las cosas, estoy usando Blender, 2.81.16, he aprendido a hacer muchas de las cosas que sabía hacer en el otro lado. También he estado practicando el desarrollo de animaciones, especialmente a crear Inverse Kinematics (IK) bones para crear animaciones que interaccionen con otros objetos. Las dudas me vienen en como importarlo y prepararlo para que funcione con el sistema Mecanim de Unity. Veamos, yo puedo crear un personaje bípedo (imaginemos alguno de Mixamo, con el esqueleto de MIxamo directo) con su animación (¿saltar?) lo guardo en .fbx y lo importo a Unity, ahí puedo convertirlo a Mecanim, así puedo usar esa animación saltar en los otros modelos que también estén adaptados para mecanim. Ahora, estoy haciendo una animación propia en Blender que interacciona con una palanca, para ello he creado unos huesos IK para ayudarme en la animación y hacer que las manos se posicionen a lo largo de la barra, pero estos huesos IK y Constrains, no tienen efecto fuera de Blender, y si se arrastran a Unity, rompen el orden de la jerarquía y fallan para convertirlos en Mecanim. Para exportar la animación con IK de Blender a Unity, tengo que intentar hacer el bake de la animación (de modo que los huesos tengan todos los frames con la rotación guardada) para después poder borrar esos huesos IK de ayuda y exportar el modelo con la jerarquía válida. ¿Sabéis de algún flujo de trabajo más sencillo para esto? Quisiera poder importar las animaciones a unity para usarlas con los mecanims, pero a poder ser de la manera más sencilla posible, (por otro lado, me gustaría poder mantener el rigging IK en el archivo de Blender para poder hacer las animaciones y no tener que ir borrándole para cada vez que quiera exportar).
  2. Hola Didier Luego son tres problemas: 1- El objeto aparece cuando haces click en los bordes de la pantalla. No estoy familiarizado con la función OverlapPoint, pero la cosa es que al buscarla, he observado que no devuelve una variable booleana si no que devuelve un número entero. https://docs.unity3d.com/ScriptReference/Physics2D.OverlapPoint.html int Returns the number of results placed in the results array. Es decir, que lo que devuelve es el número de resultados que encuentra. Esto explicaría porque te genera ese problema. En la línea if(coll.OverlapPoint(click)) Está comprobando si la función OverlapPoint devuelve algo positivo (es decir, distinto de "null" y distinto de 0) entonces la función if la da como válida, pero en la lógica no lo es. Si tu haces click en el lado de la pantalla, o en otro objeto con collider, (aunque haya varios superpuestos), eso debería dar la condición como válida porque el resultado de OverlapPoint sería 1 o más. 2- Al hacer click en la manzana, esta aparece, pero no tiene que ser así. Sólo ha de aparecer una vez que el usuario haya pulsado el botón correspondiente. Esto no es un error de código, lo que pasa es que a tu script le faltan instrucciones para que haga esto. Podrías crear una variable bool (Por ejemplo "bool button= false;" (encima de la función Start, con las otras variables), esta variable bool button podría ser comportarse así. La variable bool button empieza en false. Si se presiona el botón, la variable bool button se pone en true. Si se presiona la manzana, la variable bool button se pone en false otra vez. Luego, cuando hace el click del ratón, pones otra condición if con esa variable bool button, y dentro de ella, (si button es true) entonces haces el chequeo de la manzana. Pero si button es falso (porque no ha pulsado el botón todavía) ignoraría ese código de la búsqueda de la manzana. 3- Al hacer click, afecta varios objetos si estos están en la posición del ratón, y quieres que sólo afecte al 1º. Si vas a usar OverlapPoint, en el manual describe que la función recolecta los resultados encontrados, pero es necesario que crees un array antes para almacenarlos. https://docs.unity3d.com/ScriptReference/Physics2D.OverlapPoint.html public static int OverlapPoint(Vector2 point, ContactFilter2D contactFilter, Collider2D[] results); (El parámetro del final, Collider2D[] results, si pones ahí tu propio array, este se llenará con los resultados cuando llames esta función). Lo que no sé, es en cual extremo del array estaría el objeto "de encima", no sé si es el primer nodo o el último, (imagino que será el primero, el nodo 0, pero bueno, pruébalo con varios objetos para ver si es así).
  3. Hola Hueggvo Yo todavía no he intentado hacer la tienda online, no obstante tengo guardado este tutorial para cuando me vaya a enfrentar a ello: https://learn.unity.com/tutorial/unity-iap Explica como integrar el package In App purchases. Sobre lo que llevas, puedes intentar guardar las compras en player pref, pero eso es un archivo que se guarda localmente en el móvil, si el jugador lo borra (liberando espacio) o cambia de móvil, perdería la información de las compras que haya hecho. Creo que playerpref puede ser útil para guardar la partida, las configuraciones que tenga puesta el jugador (idioma, volumen, y tal), pero para las compras con dinero real, yo no lo usaría. Ese tutorial con el I.A.P. incluye una función para restaurar los consumables que haya comprado el cliente, (nuevamente tengo que ponerlo en práctica para saber más), confío que si estás con las manos en ello, esa información te puede venir bien, ver como lo hacen y tal.
  4. Hola JorgeLi. Yo creo que el script que has compartido, no funcionaría, observando esta línea: script2.GetComponent<GameObject>().Enemigo01; "script2" es el objeto tipo "Script2", quizás este tipo Script2 tenga alguna variable pública tipo llamada "Enemigo01", pero esta línea, esta buscando el componente "GameObject" que hay asociado al objeto script2, y luego está buscando la variable Enemigo01 dentro de la clase Gameobject, el cual no existe. Enemigo01 está dentro la clase Script2, no dentro de la clase GameObject. También, estás intentando acceder a la variable Enemigo01, pero no estás haciendo nada con ella, (no la estás pasando a ninguna variable local ni la estás pasando como parámetro a ninguna función). Has dicho que quieres el script1 (el que has compartido) coja el "GameObject del script2" Pero, luego buscas un "Enemigo01", ¿qué es este Enemigo01? Para coger el GameObject que incluye el el Script2 (referenciado por script2) puedes usar el getcomponent como estabas usando.: GameObject GOrecogido = script2.GetComponent<GameObject>(); Si lo que quieres es coger Enemigo01 (imagino que será una variable tipo GameObject ya inicializada), bastaría con transferirla. GameObject GOrecogido = script2.Enemigo01; Así se podría coger, pero recuerda que las variables locales se eliminan al acabar su dominio, ¿para qué quieres ese "Gameobject del script2"? ¿es algo sólo para esa función o lo usará también otras funciones diferentes a "Enemies()"? ¿es algo para usarlo continuamente o es una información que sólo vas a usar en ese momento puntual? Dependiendo de la respuesta, puede que quieras declarar "GameObject GOrecogido" en un sitio u otro.
  5. Valep, creo que ya... Básicamente lo que he aprendido es a mandar al traste con las opciones de posición, longitud, escalados, layouts y anchors-presets. En su lugar centrarme mayormente en colocar los anchors manualmente, (Extendiendo el atributo "anchors" y poniendo los valores ahí, luego arriba dejar sólo los márgenes o generalmente, 0 en los 4 costados). Así, parece que sí puedo juntar las piezas que sean paralelas (no hijas de) (haciendo por ejemplo que una tenga anchors de [0 - 0.7] y otra de [0.7 - 1] ) Así, aunque la ventana se escale diferente, parece que las proporciones se mantienen más o menos (obviamente cambian la longitud de los textos, pero al menos no se separan ni solapan las piezas más). Por otra parte, he leído que es aconsejable separar los elementos en distintos Canvas según la frecuencia con la que se modifica. Yo ahora mismo lo tengo así. |--- Menu Pausa |---SubCanvas Principal |---SubCanvas Settings |---SubCanvas Gameplay |---SubCanvas Control |---SubCanvas Vídeo |---SubCanvas Audio |--- Menu Personaje |---SubCanvas General |---SubCanvas Estado |---SubCanvas Coleccionables |---SubCanvas Diario Están activos al inicio (por lo que en teoría, se pre-carga todo antes de empezar el nivel, cuando lo hacen, se desactivan sólo los componentes Canvas renderer, y los reactivo según las opciones. Ahora, si debería dividir piezas que se actualizan mucho, (como relojes o la descripción del diario que cambia con el click de cada entrada). Supongo que eso sería ¿un nuevo SubCanvas más?. Para que cuando estos se recreen, no fuercen la recreación de los demás componentes. O_ò (¿en teoría?). También veo que tengo que hacer 2 códigos más, uno para que las entradas del diario se creen automáticamente (es un poco lata meter cada botón e ir cambiado dimensiones aquí y allá @_@ ) y por otro lado, algún script que actualice los textos para el cambio de idioma. aains... paciencia...
  6. Ayer estuve dando vueltas otra vez intentando hacer menús, pero se me siguen mareando los elementos UI.(Las ventanas son Image UI) Este es mi ejemplo más reciente, pero llevo lidiando con este problema mucho tiempo. En este ejemplo, intento que aparezca esa ventana a la derecha: - Que aparezca pegada a la ventana de Settings (ni más lejos ni que se pisen), - Que no se corte al final de la ventana. - Que se mantengan ciertos márgenes. - Que la ventana de Settings aparezca relativamente a la izquierda de la pantalla (podía ponerla en el centro y que se estrechara, pero prefiero que aparezca fija a la izquierda y usar el centro y la mitad derecha para mostrar la información, distintos paneles y tal). Esto esta hecho con un canvas usando Screen-Space camera y Scale with Screen Size. Como hijo tiene otros 2 canvas (uno para el menu pause, y otro para el menu Settings. El menu pause no tiene ventana a la derecha y sus botones tienen otros nombres y funciones, pero visualmente son muy similares). Cada subCanvas (pause y settings) tiene un Elemento imagen que es el cuadrado azul, y este elemento, tienen varios hijos múltiples que son los botones). La ventana a la derecha, no sé si hacerla como sub-canvas de Settings o si ponerla simplemente como otro hijo o qué hacer con ella... @_@ He probado distintas configuraciones con los anclajes y el escalado, pero no consigo mantenerlo, también he probado el Layout horizontal, pero aunque me mantiene los márgenes, hace que las dos ventanas se pisen o se separen. Buscando, veo que muchos hacen un diseño de un menó con objetos flotantes separados, pero si quisiera objetos unidos, ¿como podría hacerlo? Otras veces he intentado completar más un menú para gestiones (un lado columna de objetos, al otro lado un mapa y debajo unas estadísticas) pero me siguen dando la tabarra problemas similares. ¿Conocéis algún procedimiento para tratar con este embrollo? @_@
  7. Hola nomoregames. Ahora mismo no recuerdo con garantías en como se evitaba el choque ese del 360 al 0. Pero ¿has probado usando las rotaciones quaternarias? (en vez de las Eulerianas) El tipo Quaternion (que es el que unity usa por defecto para las rotaciones) tiene su X, Y, Z y W, ese valor extra, el motor lo usa para averiguar la dirección de la rotación y evitar errores como ese. Por eso, yo probaría, en vez de usar el smoothdamp del Vector3, usaría el Slerp que hay en la clase de Rotation (que trabaja con números quaternarios). public GameObject Cabeza; public GameObject Cuerpo; float MouseX; float MouseY; public float MaxY; public float MinY; Vector3 current; private float RotationSpeed = 5.0f; //Added private float timeCount = 0.0f; //Added // Update is called once per frame void FixedUpdate() { MouseX += Input.GetAxis("Mouse X"); MouseY += Input.GetAxis("Mouse Y"); MouseX = Mathf.Clamp(MouseY, 0, 360);//Added MouseY = Mathf.Clamp(MouseY, MinY, MaxY); Cabeza.transform.eulerAngles = new Vector3(-MouseY, MouseX,0 ); Cuerpo.transform.rotation = Quaternion.Slerp(Cuerpo.transform.rotation, Cabeza.transform.rotation, timeCount); //Added timeCount = timeCount + Time.deltaTime * RotationSpeed; //Added } } No lo he probado y no estoy seguro de si funcionará, pero bueno, algo así es lo que probaría yo.
  8. Lo hice :D Al final tuve que dar un poco más de vuelta pero ya me funciona. Recapitulando, para arreglar el bloqueo de la caída que se me producía cuando chocaba con algún collider: He creado dos vectores nuevos: Pushdir este guardará la dirección a la que empujar un personaje para evitar la última colisión detectada. ExtraMoveDir que guardaría una dirección para empujar al personaje cuando sea necesario. (el personaje se mueve por el input del jugador pero ahora cuando las físicas lo requieran, cambio ese nuevo Vector3 para añadir un nuevo movimiento además del que tenía). Ese Pushdir lo actualizo en varios casos, uno de ellos es la función OnControllerCollisionHit, el problema es que no sé como encaja esa función en el tinglado general, es como si fuera una co-rutina, una función en un nuevo thread, a veces puedo ejecutar mi algoritmo pero no llamar esa función, (puede que se active antes o después, depende de la colisión de las físicas), por eso, como no tengo control sobre ella, lo que hago es que cuando se active (cuando sea), guarde la información que me interesa en Pushdir, y ahí si puedo reclamarla cuando mi algoritmo principal la necesite. Así, en la función CheckGravity, cojo esos dato y los paso al ExtraMoveDir, esta variable se resetea en cada frame así que si el jugador "aterriza" ExtraMoveDir es cero en el siguiente frame, dejaría de afectar el movimiento del GameObject y no tengo que preocuparme por anular Pushdir dentro de la función OnControllerCollisionHit. Ya con ese valor de Extra MoveDir, lo paso al valor de la función .Move (en mi caso lo tengo en OnAnimationMove). Como extra, he actualizado la gravedad, en vez de modificar el moveDirection (que se modifica con el input del jugador), he puesto la gravedad en la Y de este ExtraMoveDir, reduciendo algunas líneas así en las funciones OnAnimationMove y Update. Y bueno, ese error ya no se me da, una cosa menos y problema resuelto :D (Ahora a esperar al siguiente @_@) Dejo el código con las modificaciones.
  9. La vagueritis XD tengo que acostumbrarme a los pastebins y a los githubs (que a veces aún me pierdo buscando el botón para descargar las cosas de ahí @_@) Pero bueno, probé con el spoiler, tuve un problema con él, parece que el spoiler se comía todo lo que había en el mensaje desde el tag [ spoiler] que lo abría hasta el final. Como si ignorase el tag [ / spoiler]. O_ò Pero bueno, aún así me ha servido bien en este caso :) Y sobre el problema del tema en sí, hoy estoy dándole otro intento, leyendo otros códigos, he visto uno que utiliza la función "OnControllerColliderHit" que efectivamente es de Unity: https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnControllerColliderHit.html No la había visto, ( Ahora no paro de verla en todas partes por la documentación x_x ) pero si esta función/evento efectivamente registra el punto de impacto hit que se produce cuando el character controller está en movimiento, quizás debería poder usar esa información como... Mientras esté en el estado de caída, si hay alguna colisión (que no sea la que detecta el centro de personaje, porque esa es la del suelo) entonces si hay una colisión más como la del bordillo, entonces empezar a mover al personaje en dirección opuesta (la dirección desde el punto de impacto y el origen del personaje). La idea ¿podría funcionar? En fin, voy a ver si logro realizarla.
  10. Tengo un problema recurrente, varias veces he hecho algún código para mover el jugador utilizando el Character Controller pero a la hora de aplicar gravedad, doy con un problema. A diferencia del controlador de rigid body, el character controller no tiene physic materials, así que cuando este colisiona no hay deslizamiento, eso hace que mi personaje, al pasar por algún bordillo se quede atascado en el aire (a menos que vaya corriendo, entonces la velocidad de desplazamiento es tan alta que al caer está más alejado del borde y no colisiona). Pero aunque parezca un caso raro, resulta que ocurre mucho cuando lo pruebo, jugando a escalar y bajar, muchas veces se me queda el personaje congelado ahí por esto mismo. (Como no puede bajar hasta el suelo, se queda congelado con la animación de caida en el estado de caida). En el Update, para el movimiento había intentado esto: //Move if ((AllowControls) && (GravState == GravityState.Land)) { moveDirection = vertical * (Vector3.Scale(cam.forward, new Vector3(1, 0, 1)).normalized) + horizontal * cam.right; IsMoving = (moveDirection.magnitude > 0.1f)? true : false; moveDirection.Normalize(); moveDirection = transform.InverseTransformDirection(moveDirection); } if ((GravState == GravityState.Falling) || (GravState == GravityState.FreeFalling)) { //moveDirection = transform.forward * 0.02f * Time.deltaTime; } moveDirection.y = moveDirection.y - verticalDirection; Esa línea que esta comentada, pretendía mover al jugador hacia delante (y después un poco hacia abajo) en caso de que estuviera cayendo, pero la cosa tampoco me funciona, al activarla, el personaje va haciendo glitches hasta llegar al suelo, (como si se saliese del estado de caída y volviese a entrar continuamente). También probé reducir el tamaño de la cápsula (está a 0.4 y la puse a 0.2) efectivamente reduce las veces en las que este problema se da, pero me causa otros problemas de clipping en la animación de esacalada (el personaje entra más de lo que está previsto y escala con las piernas hundidas en el bloque), así que lo he vuelto a poner a 0.4 para que haya más espacio entre la colisión y el origen del jugador. ¿Alguien se le ocurre alguna manera de como enfocar esto? No creo que sea algo que sólo me pase a mi, ¿como se suele solventar este problema con los bordillos? O_ò Pongo aquí el código del jugador que estoy escribiendo en spoiler porque es un poco largo.
  11. Hola Lucky-chan. El problema está en la función que estás usando para comprobar la pulsación de la tecla F. En Unity hay 3 funciones en lo que se refiere a colisiones, (3 para triggers y otras 3 para colisiones, pero centrándonos en los triggers). OnTriggerEnter OnTriggerStay OnTriggerExit Has puesto un código para comprobar la tecla F en el OnTriggerEnter, esta función sólo se activa en 1 frame, el frame en el que el objeto entra dentro del trigger, (Luego debe ser muy complicado pulsar la tecla F justo en ese pequeño momento). Utiliza OnTriggerEnter cuando tengas que inicializar cosas, (activar 1 enemigo, dar la orden de abrir una puerta, etc...) Pero tu necesitas colocar ese párrafo de la tecla F en el OnTriggerStay, esta función se activa en todos los frames mientras el objeto de turno está dentro del trigger, entonces sí se ejecutará el if que comprueba la pulsación de la tecla durante un tiempo más asequible para el usuario. (GetKeyDown se comporta igual que OnTriggerEnter, su contenido sólo se activará en el frame dónde la tecla pasa de no estar pulsada, a ser pulsada, así que no habrá problema en este caso, pero recuerda que las cosas de OnTriggerStay, funcionan como un "update" lo que esté ahí se ejecutará en varios frames, no podrías poner cosas como la activación de 1 enemigo ya que fácilmente se podrían activar 60 en 1 segundo). Por eso están las 3 variantes. :)
  12. Eso suena incluso mejor Jardem. me alegro que te haya salido el efecto.
  13. Como ha dicho Pioj, los colliders de unity no se pueden llevar a Blender. Lo que puedes hacer, es abrir el tractor en Blender (imagino que el tractor, tendrás un prefab, pero en algún lugar tiene que estar el modelo también, puede que un .obj o un .fbx, ambos archivos se pueden importar directamente en blender), y una vez tengas el tractor ahí crear polígonos para que hagan colliders, y luego exportar ese modelo de vuelta a Unity y usarlo como colliders poniéndole el componente Mesh Collider. Aunque ¡ojo!, los colliders y las físicas son partes que más rendimiento consume en los motores de videojuegos, mientras los colliders sean más complejos (más vértices, es decir, más caras y más polígonos) pues más tiempo necesita para comprobarlos. A B En el caso A, requiere menos pasos para verificar si el cuadrado azul está tocando el cuadrado rojo. Mientras que en el caso B, se requieren muchos más pasos para ver si el cuadro azul está tocando la figura roja. Esto quiere decir, que si vas a hacer algún polígono de colisiones para el tractor, este polígono debe ser tan low poly como se pueda. Si puedes usar cubos de Unity para ello, perfecto, si necesitas algo más preciso (un shooter, o si es importante la forma para las físicas, etc...) entonces crea un mesh para el tractor en blender, lo importas a unity y lo usas con el mesh collider (que para eso está). No hace falta que te preocupes de la textura, puedes literalmente borrar el componente del "Mesh Renderer" puesto que no necesitas que el objeto se dibuje durante el juego. Pero eso, para colliders "low poly".
  14. La cámara esa sencilla del CamaraPlayer public class CamaraPlayer : MonoBehaviour { public float mouseSensitivity = 10f; public float dstFromTarget = 2f; public Vector2 pitchMininMax = new Vector2(-40, 85); public float rotationSmoothTime = .12f; Vector3 rotationSmoothVelocity; Vector3 currentRotation; float yaw; float pitch; public GameObject PLAYER; public Transform target; private void Awake() { PLAYER = GameObject.FindGameObjectWithTag("Player"); target = PLAYER.transform; } void LateUpdate() { yaw += Input.GetAxis("GiroHorizontalCamara") * mouseSensitivity; yaw += Input.GetAxis("Mouse X") * mouseSensitivity; pitch -= Input.GetAxis("MovVerticalCamara") * mouseSensitivity; pitch -= Input.GetAxis("Mouse Y") * mouseSensitivity; pitch = Mathf.Clamp(pitch, pitchMininMax.x, pitchMininMax.y); currentRotation = Vector3.SmoothDamp(currentRotation, new Vector3(pitch, yaw), ref rotationSmoothVelocity, rotationSmoothTime); transform.eulerAngles = currentRotation; transform.position = target.position - transform.forward * dstFromTarget; } } Está usando el valor yaw (que irá desde -infinito hacia +infinito aunque en la práctica, es de -360 a +360), es un ángulo que usas después para ponérselo a la Y en el transform.eulerAngles. En este código, ese ángulo se modifica moviendo el ratón, pero si tuvieras un enemigo, o un objetivo específico al que apuntar la cámara, lo que necesitas es hallar el ángulo para que apunte a ese punto. De modo que si tienes la X y Z de la posición del enemigo... En ese código que tienes después de hacer la rotación, simplemente mueve la cámara a la posición del jugador y da unos pasos hacia atrás, luego según veo yo no haría falta hacer más modificaciones para el asunto de la rotación. Para el pitch, la idea es igual, pero usando la distancia y la altura (Y) en lugar del X y Z. (Si haces algún enemigo volador pues puede que lo necesites, pero ten cuidado de aplicar también la línea del clamp o puede que la cámara empiece a dar vueltas raras y a ponerse bocabajo). Otra cosa sería cuando hallar el yaw mediante trigonometría y cuando mover el yaw mediante el ratón, se puede hacer dos cámaras, o también podrías poner alguna variable Transform para el "objetivo" de la cámara, si es igual a null, moverla con el ratón, si es distinto de null, hallar el yaw con la fórmula.
  15. Hola Jardem. No tengo ningún script así a mano, pero sin duda veo seguro la necesidad de programar un poco para que ese efecto ocurra. La idea que me viene a la cabeza es la siguiente: - Creas un trigger, un cubo o un cilindro y lo pones donde esté el tornado. Este objeto le creas un script, para que cuando la bola entre ahí, pues empiece el efecto. - En el script, al ser un trigger, puedes usar las funciones de trigger en vez de la Start y Update de siempre. Las funciones de trigger que me refiero son las siguientes: OnTriggerEnter: https://docs.unity3d.com/ScriptReference/Collider.OnTriggerEnter.html (Se dispara cuando el collider de la bola entra en el trigger) OnTriggerExit: https://docs.unity3d.com/ScriptReference/Collider.OnTriggerExit.html (Se dispara cuando el collider de la bola sale del trigger) OnTriggerStay: https://docs.unity3d.com/ScriptReference/Collider.OnTriggerStay.html (Se dispara en cada frame mientras el collider de la bola esté dentro del trigger) Depende de como sea el script de control de la bola, puede que tengas que hacer contrarrestar más cosas o menos, pero con esas funciones deberías poder tener algo más de control. - Si por ejemplo, el controlador de la bola es el rigidbody estándar de Unity, pues podrías hacer que en el OnTriggerStay, la bola recibiera una fuerza que la mueva. (El vector de dirección de la fuerza, podría variar con el tiempo, quizás la Y sea siempre hacia arriba, pero la X,Z podría estar cambiando dependiendo del ángulo para que la bola vaya recorriendo un círculos mientras está dentro del tornado , las fórmulas trigonométricas creo que serían las siguientes: Dado el ángulo "A" y el radio "r" X = cos (A) * r Z = seno(A) * r La función para mover la bola debería ser AddForce en el OnTriggerStay, aunque no recuerdo qué modalidad habría que ponerle en el "ForceMode" (A penas uso el Rigidbody :( ) https://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html https://docs.unity3d.com/ScriptReference/ForceMode.html (Yo creo que "Force" debería valer, pero prueba con los 4 por si acaso).
UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...