Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 15,00€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales

Igor

Registrados
  • Content Count

    687
  • Joined

  • Last visited

  • Days Won

    36

Igor last won the day on January 26

Igor had the most liked content!

Community Reputation

236 Excellent

4 Followers

About Igor

  • Rank
    Experto

Profile Information

  • Especialidad
    Coder

Recent Profile Visitors

1,282 profile views
  1. hola de nuevo. "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 } }
  2. 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....
  3. 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
  4. 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...
  5. 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"
  6. Igor

    YourCity Racing

    si, eso ya lo sabia, gracias. pero no queria subirlo a youtube porque era solo para mostrarle la lluvia... de todas formas las imagenes tampoco me suele dejar subir (y pesan menos de 8megas) ...me sale "error 200"... no se que sera...
  7. Igor

    YourCity Racing

    las bandadas de pajaros se pueden hacer con un sistema de particulas animadas (si estan en el aire) y dan el pego bastande bien.... le pones un script al sistema de particulas para que se comporte como una bandada (se mueva y cambie de direccion) y a las partculas les activas el "noise" (suave) y queda bien.... pero si quieres ver los pajaros posados a pie de calle y atendrias que usar modelos.... el sistema de dia/noche tengo varios hechos.... a veces con skybox... pero prefiero hacerlos con una esfera gigante (invertida y de pocos poligonos) ...con nuves.... y hasta tengo hecha una lluvia tipo "breath of the wild" las nuves las puede hacer muy "baratas" con un shader que mezcle barias texturas tipo ruido (perlin noise) se les puede hacer que calcules los normals si las quieres mas realista pero entonces ya consumen un pelin mas de recursos... la lluvia tipo "zelda" que tengo afecta a todos los materiales (que tengan el shader especial que he hecho) que genera ruido como de "drops" y ademas crea "olas" que van hacia abajo (sigiendo la superficie) usando en una parte del shader codigo de "triplanar shading" para que parezca que el agua se desliza hacia abajo.... y ademas tiene un efecto postProcesing que detecta los "bordes" (tipo edgeDetect) pero solo los bordes que miran hacia arriba, y en vez de poner un "edge" pone "chispitas" (como en breath of the wild) ....todo el efecto de lluvia responde a una variable global asi se puede hacer que llueva: nada, poco, mucho, o demasiado... estaba intentando subirte un video pa que lo vieras... pero no se que pasa que unitySpain nunca me deja subir (directamente) videos ni imagenes...
  8. hola, acabo de hacer esto probando 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; private float speed = 10; private float gravy = 0; private float gravyPower = 8.8f; public Transform cam; //camera private Vector3 oldPos = Vector3.zero; private Vector3 move = Vector3.zero; // Use this for initialization void Start () { } // 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 + (transform.up * 0.6f); transform.Rotate(0, camAngleY, 0); cam.rotation = transform.rotation; cam.Rotate(camAngleX, 0, 0); cam.position -= cam.forward * 5f; //move oldPos = transform.position; 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); Vector3 moveDir = ((move.x * transform.right) + (move.z * transform.forward)) * speed * dTime; //transform.position += moveDir; //physics Vector3 newUp = Vector3.zero; RaycastHit hit; float radius = 0.4f; bool inGround = false; //forward (move dir) if (Physics.SphereCast(transform.position, radius, moveDir.normalized, out hit, moveDir.magnitude+0.01f)) { transform.position += moveDir.normalized * hit.distance; //newUp = hit.normal; } else { transform.position += moveDir; } //down 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); newUp = hit.normal; gravy = 0; inGround = true; } else { transform.position -= transform.up * gravy * dTime; } } else {//jumping if (Physics.SphereCast(transform.position, radius, transform.up, out hit, -((gravy * dTime) + 0.2f))) { transform.position += transform.up * hit.distance; //newUp = hit.normal; gravy = 0; } else { transform.position -= transform.up * gravy * dTime; } } if (inGround) { if (Input.GetButtonDown("Fire1") || Input.GetButtonDown("Jump")) { gravy = -7f;//jump } } gravy += gravyPower * dTime; //rotation if (newUp.magnitude > 0.1f) { Vector3 left = Vector3.Cross(transform.forward, newUp); Vector3 newForward = Vector3.Cross(newUp, left); Quaternion oldRot = transform.rotation; Quaternion newRot = Quaternion.LookRotation(newForward, newUp); transform.rotation = Quaternion.Lerp(oldRot, newRot, 0.15f); } } } es andar por las paredes al estilo mario galaxy. en tercera persona. lo he provado con una Sphere de tamaño 1 (la que sale por defecto) poniendole un rigidBody al que le he desactivado la gravedad y le he "freezeado" los tres angulos de rotacion (los tres "freeze rotation") tiene algun problema como que caes hacia abajo (del transform) en vez de hacia al "suelo" mas cercano... habria que ponerle un "Physics.OverlapSphere" que fuera creciendo para buscar el "suelo" mas cercano cuando estas en el aire... ya le pondre luego, ahora me tengo que ir a hacer unos recados... espero que te sirva... luego (o mañana) ya lo mejorare... lo he hecho en 5 minutos... y tiene "fallos"
  9. muy "pro". cuando tenga un ratillo lo seguire paso por paso
  10. Igor

    YourCity Racing

    seria lo suyo, si... habria que separar el proyecto en dos, uno tipo "racing" y otro tipo simulador de autoescuelas... para el de racing ponerle mas detalle a los graficos y buscar unas mecanicas de persecucion, o de ir llegando a checkpoints repartidos por la ciudad... o incluso algo tipo "crazytaxi" o repartidor..... y en el de simulador, mas que centrarse en los graficos habria que centrarse en las señales, el trafico y todo eso... hacer que fuera "realista" en ese aspecto... pero vaya, que el proyecto es de @J Montes, que haga el lo que quiera, como si quiere hacer un juego de atropellar peatones en tu ciudad...
  11. Igor

    YourCity Racing

    wow.... ...pero tendrias que hacer que apareciesen las señales de trafico, semaforos, pasos de cebra... esa informacion aparece en OpenStreetMaps?
  12. la bala da dolor de cabeza.... si le disparas en la cabeza? y si disparas a la pierna da cojera? jeje ahora en serio: seguramente es que la variable "player" que "buscas" en la funcion "Start", despues del cambio de "tag" es "null", osea, que la funcion "FindGameObjectaWithTag no encuentra el objeto en cuestion. asegurate que despues del respawn el player recupera su tag correctamente. puedes poner esto despues del FindGameObjectWithTag para ver si el gameObject es "null" if (player == null) { Debug.Log("objeto nulo"); } si sale el mensaje en la consola significa que el objeto no ha sido encontrado, y segurente es por el cambio de tag
  13. hola no he usado nunca TileMap pero he mirado la documentacion y lo que porejemplo puedes hacer si quieres saber encima de que tipo de Tile estas: "TileMap" tiene una funcion "getTile(posicion)" te devuelve el "tile". "Tile" tiene la variable "Sprite" y "sprite" tiene la variable "Texture" y "texture tiene la variable "name" que te dice el nombre de la textura luego haces lo que sea dependiendo del nombre de la textura. tambien desde el "renderer" puedes acceder al sprite y a la texture y entonces a su nombre.... ..pero como te he dicho al principio nunca he usado tileMap y no se si estos metodos funcionaran realmente como yo supongo... ...y no se si te servira saber el nombre para lo que quieres
  14. el del museo ya conocia... pero algunas partes como las de los portales no las habia visto. el portal de Prey muy chulo. en el video del post lo de capturar la geometria (dependiendo de la camara) y luego "proyectarla" sobre la geometria existente usando algun tipo de CSG (constructive solid geometry) me parece demasiado "Pro"... aunque como dice @pioj "la tecnologia no hace al juego"... ...y con dicha tecnologia no se que juego se podria crear... como mucho algo tipo el del museo, tipo puzles, que enseguida se vuelve monotono. ...pero tecnologicamente esta genial.
  15. Igor

    YourCity Racing

    muy bien lo de los puentes y tuneles, como dices quedan problemillas que solucionar pero va quedando bien. ah, sobre el final del video se ven unos edificion como que parpadean... puede ser que este duplicando la geometria? y que se produzca por ello "z-fighting"? animo!
×
×
  • Create New...