Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Igor

#16
Scripting / 3 objetos random
Febrero 11, 2020, 11:29:13 AM
solo tres elementos?
 
quizas hacerlo con "random" y con "if"
 
para casos con mas elementos suelo hacer una "list" con todos los elementos y hago un bucle "for"... entonces, en el bucle, con "random" elijo uno delos elementos y asigno donde sea y le hago "remove" de la list...entonces ese elemento ya no esta en la list...  y sigue el bucle escojiendo al azar elementos de la lista y quitandolos de ella...
 
pero solo para tres seria mejor hacer algo asi;
 

int seleccion1 = Random.Range(0,3);
int seleccion2 = Random.Range(0,2);
if (seleccion2 >= seleccion1)  {
    seleccion2 += 1;
}
int seleccion3 = 0;
if (seleccion3 >= seleccion2) {
    seleccion2 += 1;
}
if (seleccion3 >= seleccion1) {
    seleccion3 += 1;
}

 
....
 
aunque no se si esto era una duda tuya real o era un ejercicio para nosotros... o para los noobs...
 
si quieres borro mi respuesta para que la gente haga el ejercicio
#17
Offtopic / Documentación (html) online a offline
Febrero 09, 2020, 02:27:08 PM
muy pro la documentacion, no esperaba menos de @lightbug (no esperaba menos de 200 paginas XD)
 
no sabia que habias continuado con tu character controler (conocia la version 2d) ...pero ahora has completado tu complemento con un completo y funcional 3D...
 
muy pro todo....
 
...este @lightbug es muy pro...
 
dan ganas de secuestrarle y encerrarle en una habitacion a teclear codigo... digo... estaria guai colaborar con el en algun proyecto...
#18
Eventos / Global Game Jam 2020
Febrero 01, 2020, 10:01:48 PM
jejej
 
XD
 
pues nosotros estamos haciendo un "bullet hell" 2d por turnos, donde puedes corregir las decisiones (reparar)... con estilo un poco tipo "art deco" y "noir" ambientado en un hotel tipo años 40... donde eres un detective que tiene que detener una invasion espectral.... (reparar la realidad)...
 
el tema de reparar lo tenemos en realida un poco cojido con pinzas porque en reañidad hay poco de eso en nuestro juego... pero valla... asi ha ido saliendo...
#19
Eventos / Global Game Jam 2020
Febrero 01, 2020, 04:34:51 PM
si, el tema de este año era "reparar"...
 
ha salido varias ideas de reparar tipo puzle... pero tambien del alzheimer (de recordar)  ...de viruses (curar) ... y alguna otra cosa rara...
#20
Eventos / Global Game Jam 2020
Enero 31, 2020, 05:49:10 PM
 
 
Cita de: iRobb date=1580489161Na de na. Nadie ha respondido. Mucha suerte @Igor
   


gracias!
 
XD
#21
Eventos / Global Game Jam 2020
Enero 31, 2020, 05:29:13 PM
hola!
 
al final si que habia Global Jam en Pamplona.
 
me he apubtado... estoy ya dentro... esperando que empiece... a ver con quien hago equipo.... que nervios!
 
alguno mas se ha apuntado al evento en algun sitio?
#22
para solucionarlo bien bien tendria que tener mucha mas informacion....
 
cual es el eje que mira hacia adelante en la cabeza.... porque si dices que estan mal los ejes signnifica que el Z no apunta hacia adelante... y entonces seguro que el Y no apunta hacia arriba y el X no apunta hacia la derecha....
 
porque lo suyo seria hacerlo usando los ejes y calcular cuanto tiene que rotar con respecto a como esta rotada "dentro" de la animacion... porque la animacion supongo que movera un poco la cabeza (suavemente)..
 
 lo suyo seria calcular el angulo usando los vectores de direccion de la cabeza... usando Vector3.Dot para obtener seno y coseno del angulo que forma la cabeza respecto al vector al que llamas "Direccion_Cabeza"(*)... y luego usar Mathf.ATan2 para hayar el angulo que debes girar.
 
si me das los ejes, si me dices hacia donde apuntan los ejes x,y,z de la cabeza puedo intentar hacertelo, ...pero al final no se si funcionara bien... lo suyo seria que pudiera acceder a tu proyecto y asi te lo podria "arreglar" en un momento... unas unityCloud? tienes el proyecto en la "nube" de unity? si quieres te paso mi correo para que me des acceso (momentaneo) a tu proyecto y le hecho un ojo... aunque este finde me pilla un poco mal... estare viernes, sabado y domingo fuera... pero el lunes te lo puedo mirar si quieres
 
 
 
(*) las variables deberian comenzar con minusculas ("direccion_Cabeza") y las "classes" y funciones en Mayuscula.
#23
Scripting / Deformidades_en_padre
Enero 30, 2020, 08:41:14 PM
puedes usar "falsos" padres
 



   
       
   
   
      objetoVacioConEscala_1
   
   
      (y dentro suya)
   
   
      -> padre
   
   
      -> objetoVacioConEscala_1
   
   
      (y dentro suya)
   
   
      -> -> hijo
   
   
      -> -> objetoVacioConEscala_1
   
   
      (y dentro suya)
   
   
      ->  -> -> siguienteHijo
   
   
       
   

[/quote]
 
cuando pongo "y dentro suya" me refiero a que van dentro del objetoVacioConEscala_1
 
y asi al tener esos objetos escala uno puedes rotar los hijos sin que se deformen.... sin que les hafecte las escala del padre
#24
nose si mira siempre a un sitio o es en determinados momentos o como lo usas... 
 
pero puedes hacer algo asi....
 
para que rote suave tienes que tener una variable private Quaternion oldRot; en el script.
 
y pones algo asi:
 

transform.LookAt(sitio)
transform.Rotate(0,-90,-90)
cabeza.rotation = Quaternion.Lerp(oldRot, cabeza.rotation, 0.1f);
oldRot = cabeza.rotation;

 
no se si eso ira bien porque no se como va tu script... si pones el codigo podre ayudarte mejor
 
igual hay que alterar el orden... o hacerlo diferente...
 
pero poderse se puede, todo se puede hacer en programacion
#25
hola
 
puedes usar el transform.LookAt y luego rotarlo manualmene para corregir con transform.Rotate(x,y,z)
 
por ejemplo pongamos que al rotarlo con LookAt la cabeza queda ladeada 90 en el eje Z pues luego le pones un Rotate(0, 0, -90) y solucionado.... o si queda mirando hacia arriba le pones un Rotate(90, 0, 0)... (pero despues del LookAt)
 
espero que te sirva.
 
sino, hay otras formas de hacerlo, puedes poner un objeto vacio (empty gameobject) dentro de la cabeza y que ese si este orientado correctamente, calculas el vector3 "normalizado" desde ese objeto al punto  donde debe mirar, y con vector3.dot entre ese vector y los vectores forward y right puedes calcular el seno y coseno de los angulo Y que forma, ...y con el vector y forward y up puedes calcular seno y coseno del angulo X... sabiendo los senos y cosenos puedes usar Mathf.ATan2 para saber el angulo y luego los usas en el eje apropiado con Rotate, rotando porejemplo el eje "Y" con el angulo "X" y el eje "Z" con el angulo "Y"... o lo que sea...
 
y aun hay mas maneras de solucionarlo..
 
porejemplo rotas la cabeza con LookAt, guardas los valores del transform.eulerAngles en un vector3 "angulosCabeza" y luego intercambias los valores de X por Y o lo que sea... osea pones los eulerAngles en otro orden... en vez de x,y,z luego le metes los valores en otro orden... z,x,y o lo que sea... aunque creo que hacer esto fallara porque primero tendrias que hayar el angulo entre el cuerpo y la cabeza (anguloY cabeza menos anguloY cuerpo) y eso son los valores que luego tendrias que intercambiar... 
 
y seguro que hay mas formas...
 
si no te funciona ninguna de estas puedo pensar otra... o si no logras hacer una de las que te he puesto (ya que lo he explicado a lo rapido) puedo intentar explicarlo mejor... o tambien si quieres te pongo ejemplos con codigo
#26
Scripting / Gravedad moldeable
Enero 27, 2020, 05:46:00 PM
hola de nuevo.
 
Cita de: nomoregames date=1579986152por que haces que la posición de cámara sea igual a oldPos (que bale cero) + transform.up * 0.6?
   


"oldPos" no vale cero porque coje el valor de la posicion del player (pero justo antes de moverlo en cada frame) ...lo que hago es colocar la camara en la posicion vieja del player para que la camara valla siempre como un paso por detras del player, si e player se mueve hacia la derecha la camara se quedara un poco atras a la izquierda del player ...super poco, pero suelo hacerlo siempre asi, da menos sensacion de "rigided" a la camara...  y lo de sumarle (transform.up*0.8f) es para que este un poco por encima del player, para que el player no quede en el centro de la pantall sino un poco mas abajo del centro....   despues de eso la roto en la direccion correcta y luego la muevo hacia atras para que quede detras de player, (y un poco por encima, porque la haviamos movido antes hacia arriba, ...que no hace falta que sea antes... pero lo suelo hacer asi)
 
he retocao un palin el script, añadiendo comentarios por todos los lados a ver si asi queda mas entendible... y le he añadido una parte en la que "lanzo" seis (6) sphereCast para buscar el suelo cuando estas en el aire... para que el player sepa hacia donde tiene que caer... con eso arreglo el mayor problema que habia de caer hacia el infinito
 
he cambiado tambien para que rote cuando choca "frontalmente" contra una "pared"... ahora se sube por la pared directamente (adaptandose, claro)
 
ahi va el codigo:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playerGalaxy : MonoBehaviour {
    private float camAngleX = 0;
    private float camAngleY = 0;
    private float sensitivity = 10f;//sensivilidad del raton para mirar
    private float speed = 10;//velocidad de mobvimiento
    private float gravy = 0;
    private float gravyPower = 8.8f;//fuerza de gravedad
    private Vector3 newUp = Vector3.up;//vector que marcara el "hacia arriba" del player
    public Transform cam; //camera
    private Vector3 oldPos = Vector3.zero;
    private Vector3 move = Vector3.zero;
   
    private float inAirSphereSize = 0;//para comprobar gravedad cuando estas en el aire (no estas en el suelo)
    private Rigidbody rb;
   
    // Use this for initialization
    void Start () {
        rb = GetComponent<Rigidbody>();
}

// Update is called once per frame
void Update () {
        float dTime = Time.deltaTime;
       
        //look
        camAngleY *= 0.8f;
        camAngleY += (Input.GetAxis("Mouse X")) * sensitivity * dTime;
        camAngleX -= (Input.GetAxis("Mouse Y")) * sensitivity * dTime;
        camAngleX = Mathf.Clamp(camAngleX, -80f, 80f);
        cam.position = oldPos;//pongo la camara en la poscion vieja
                              //para que valla como siguiendo al personaje en vez de esta justo en su posicion
        cam.position += (transform.up * 0.6f);//pongo la camara un poco mas arriba que la posicion del personaje
        transform.Rotate(0, camAngleY, 0);
        cam.rotation = transform.rotation;
        cam.Rotate(camAngleX, 0, 0);
        cam.position -= cam.forward * 5f;//muevo la camara hacia atras despues de rotarla, para que este detras del personaje
 
        //move
        oldPos = transform.position;//cojo la posicion anted de moverlo
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector3 mov = new Vector3(h, 0, v);
        if (mov.magnitude > 1) {
            mov.Normalize();
        }
        move = Vector3.Lerp(move, mov, 0.1f);//para suavizar la aceleracion y deceleracion
        Vector3 moveDir = ((move.x * transform.right) + (move.z * transform.forward)) * speed * dTime;//vector final de movimiento
        //transform.position += moveDir;
 
        //physics
        RaycastHit hit;
        float radius = 0.4f;//radio del la sphereCast
        bool inGround = false;//para luego saber si esta en el suelo
        //forward (move dir) (en direccion del movimiento)
        if (Physics.SphereCast(transform.position, radius, moveDir.normalized, out hit, moveDir.magnitude+0.01f)) {
            transform.position += moveDir.normalized * hit.distance;//parar al chocar
           
            newUp += hit.normal;
            //esto es para rotar tambien si choca hacia donde se mueve (adelante) (se puede quitar)
           
        } else {
            //si NO
            transform.position += moveDir;//mover normal
        }
        //down (en direccion de la gravedad) (hacia abajo del player)
        if (gravy > 0) {//falling
            if (Physics.SphereCast(transform.position, radius, -transform.up, out hit, (gravy * dTime) + 0.3f)) {
                transform.position -= transform.up * (hit.distance-0.1f);//poner al player en el suelo
                newUp += hit.normal;//esto es para rotar (collision con el suelo, el principal)
                gravy = 0;//parar gravedad (dejar de caer)
                inGround = true;//esta en el suelo
            } else {
                //si NO
                transform.position -= transform.up * gravy * dTime;//caer normal
            }
        } else {//jumping (hacia arriba del player)
            if (Physics.SphereCast(transform.position, radius, transform.up, out hit, -((gravy * dTime) + 0.2f))) {
                transform.position += transform.up * hit.distance;//chocar con "techo"                
               
                newUp += hit.normal;
                //esto es para rotar tambien si choca hacia donde se salta (hacia arriba, con el techo)
               
                gravy = 0;//parar de subir(parar el salto)
            } else {
                transform.position -= transform.up * gravy * dTime;//subir normal(salto)
            }
        }
        if (inGround) {//esta en el suelo
            inAirSphereSize = radius*0.5f;
            if (Input.GetButtonDown("Fire1") || Input.GetButtonDown("Jump")) {
                gravy = -7f;//jump saltar
            }
        } else {//NO esta en el suelo
            bool groundFound = false;
            //seis (6) sphereCast una en cada direccion (adelante, atras, izquierda, derecha, arriba, abajo)
            //los sphereCast van creciendo (en radio y distancia) hasta que encuentren un "suelo"
            //para intentar caer en la direccion del suelo mas cercano
            if (Physics.SphereCast(transform.position, inAirSphereSize, transform.forward, out hit, inAirSphereSize)) {
                newUp += hit.normal;
                groundFound = true;
            }
            if (Physics.SphereCast(transform.position, inAirSphereSize, -transform.forward, out hit, inAirSphereSize)) {
                newUp += hit.normal;
                groundFound = true;
            }
            if (Physics.SphereCast(transform.position, inAirSphereSize, -transform.right, out hit, inAirSphereSize)) {
                newUp += hit.normal;
                groundFound = true;
            }
            if (Physics.SphereCast(transform.position, inAirSphereSize, transform.forward, out hit, inAirSphereSize)) {
                newUp += hit.normal;
                groundFound = true;
            }
            if (Physics.SphereCast(transform.position, inAirSphereSize, transform.up, out hit, inAirSphereSize)) {
                newUp += hit.normal;
                groundFound = true;
            }
            if (Physics.SphereCast(transform.position, inAirSphereSize, -transform.up, out hit, inAirSphereSize)) {
                newUp += hit.normal;
                groundFound = true;
            }
            if (!groundFound) {
                //si NO ha encontrado suelo sigue creciendo la esfereCast
                inAirSphereSize += 0.1f;
            }
        }
 
        newUp.Normalize();//como he ido sumando los valores a "newUp" ahora toca normalizarlo (hacer que la longitud del vector sea 1)
        gravy += gravyPower * dTime;//aumentar greavedad (caer)
       
        //rotation
        if (newUp.magnitude > 0.1f) {
            //esto es para finalmente rotar el player para hacer que su "up" coincida con el "newUp"
            Vector3 left = Vector3.Cross(transform.forward, newUp);
            Vector3 newForward = Vector3.Cross(newUp, left);
            Quaternion oldRot = transform.rotation;
            Quaternion newRot = Quaternion.LookRotation(newForward, newUp);
            if (inGround) {
                //si esta en el suelo
                transform.rotation = Quaternion.Lerp(oldRot, newRot, 0.18f);//rotarlo lentamente
            } else {
                //si No esta en el suelo (esta en el aire)
                transform.rotation = Quaternion.Lerp(oldRot, newRot, 0.08f);//rotarlo MUY MUY lentamente
            }
        }
 
        rb.velocity *= 0.95f;//ir frenando el rigid body
        //porque a veces se queda con alguna fuerza moviendolo todo el rato
       
    }
}

 
 
#27
Scripting / Gravedad moldeable
Enero 25, 2020, 09:26:31 PM
ah, es verdad!
 
@lightbug tiene un asset muy bueno que hace eso (pero en 2d)
 
y como dice el, creo que nintendo utiliza "gravedad por zonas", por areas.... quizas usando triggers (colliders) que cambien la gracedad depende de donde estes.... no como lo que he hecho yo... pero el efecto se aproxima....
#28
si quieres hacer que la cabeza mire a un sitio en concreto debes hacerlo en "LateUpdate", ya que el orden seria:
 
-Update
 
-Animacion
 
-LateUpdate
 
entonces si mueves un "hueso" en Update, luego la animacion te lo "pisa", recoloca los huesos como manda la animacion... pero si lo haces en "void LateUpdate()" entonces tu "pisas" la animacion y recolocas el hueso como quieras
 
 
#29
Scripting / Gravedad moldeable
Enero 25, 2020, 08:28:32 PM
hola 
 
a "cam Angle X" le sumo lo que muevas el raton (arriba/abajo)... para que valla "disminullendo" poco a poco hasta cero lo que hago es multiplicarlo por 0.8f asi poco a poco frena.. y el movimiento de la camara queda mas suabe al detenerse.. en vez de parar de golpe es como que sigue un poco en la direccion que moviste el raton parando lentamente.... es algo que suelo hacer...
 
 
 
esfereCast tiene volume y rayCast no...
 
es un poco lio explicarlo...
 
porejemplo si justo esta el player en un el borde de dos planos con diferente inclinacio.... donde se juntan los dos planos.... en un pico, (en montecito)
 
imaginatelo en 2d...
 
algo asi: /\
 
pero menos inclinado
 
y el player justo en el medio, arriba
 
...si lo hago con rayCast, y el player esta un pelin a la derecha, muy muy poco, detectara que el suelo esta inclinado hacia la derecha.... y al rotar un poco el player para adaptarse al suelo, el rayo saldria justo hacia abajo suya (igual que si fuera el sphereCast) pero al ser fino, delgado, colisionara en el otro plano, en el de la izquierda, porque el player esta inclinado hacia la derecha, entonces como ha detectado el plano de la izquierda, se rotara para inclinarse a la izaquierda, pero entonces el rayCast (fino) colisionara con el plano de la derecha.... y entonces el player se inclinara a la derecha... y asi todo el rato... ira haciendo efecto pendulo, o mas bien efecto metronomo (el cacharro para medir el tiempo al tocar instrumentos musicales)...
 
pero si el rayo es gordo (sphereCast) eso no pasara, porque colisionara antes con el suelo que tenga debajo,  osea si esta inclinado a la derecha, en vez de colisionar el rayo (fino) con el plano de la izquierda, como el sphere es gordo colisionara con el plano de la derecha, y entonces el player se mantendra inclinado a la derecha correctamente
 
no se si me he explicado bien....
 
si te mando unos dibujos explicando igual sera mas facil de entender...
 

 
arriba seria con rayCast
 
1- lanza rayo (en rojo) hacia abajo, detecta que el suelo esta inclinado a la derecha (en verde)
 
2-al inclinarse a la derecha el rayCast detecta el suelo de la izquierda, que esta inclinado hacia el otro lado... y entonces el player rotara para inclinarse hacia el otro lado... 
 
3-al inclinarse hacia el otro lado, vuelve a detectar el suelo de la derecha....
 
y asi el player entraria en un bucle entre las imagenes 2 y 3.
 
pero si lo hacemos con sphere (imagenes de abajo) eso no pasa
 
 
 
PD: sorry por los dibujos tan cutres...
#30
Scripting / Gravedad moldeable
Enero 25, 2020, 03:08:48 PM
Cita de: nomoregames date=1579960259Wow, no entendi nada...
   


es un script que he hecho pa probar a hacer algo tipo mario galaxy... tiene algun fallo, ya lo arreglare....
 
la primera parte es para controlar la camara (y hacia donde mira el player)
 
la segunda parte es para mover el player.
 
la siguiente parte son dos "sphereCast", uno hacia donde te muevas y otro hacia abajo (segun este orientado el player)
 
y con ese ultimo "sphereCast" cojo el valor de como esta orientado el suelo "newUp"... y en la ultima parte roto el player para que su "up" coincida con el "newUp", osea para que se ponga "de pie" en la superficie inclinada/pared como en mario galaxy...
 
prueba a hacer una sphere (tamaño default) ponerle un rigidBody (sin gravity, y dandole a los tres "tick" de freeze rotation) ...y ponerle el script... y deveria medio bien.... falla alguna cosilla... y si el angulo entre una superficie y otras es demasiado, el player no cambiara de superficie, no se adaptara al nuevo suelo... osea de suelo liso a pared de 90 grados no va a funcionar.... aunque si quieres se puede hacer que si funcione... pero de momento pense que seria mejor que no... asi hay "paredes" y no todo es "suelo"