Jump to content
UnitySpain

Search the Community

Showing results for tags 'raycast'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Inicio
    • Proyectos
    • Offtopic
    • Unity Feeds
    • Website
  • Mesa de ayuda
    • Unity
    • Arte
    • Otras Especialidades
    • Builds & Dispositivos
  • Aportes de la Comunidad
    • Recursos
    • Eventos
    • Buenas Prácticas
  • Bolsa de trabajo & Colaboraciones
    • Ofertas y Demandas
  • Post Antiguos
    • General (Antiguo)

Blogs

  • byGui
  • El Blog de Pioj

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Especialidad

Found 26 results

  1. Hola buenas noches. Estoy haciendo un proyecto donde mi personaje se mueve por medio de navmesh agent con ayuda del raycast sobre una superficie; resulta que necesito crear unos botones "GUI" para activar algunas acciones pero al presionarlos me ejecuta la acción de mover mi personaje, necesito bloquear la acción de mover cuando se presione los botones. de antemano gracias. algun Tip a tener en cuenta.
  2. Hola, buenas a todos, sobre la duda que tengo es un poco “rara” de explicar, así que lo haré por guiones para que quede más esquemático: 1) Tengo en la escena un UI image, que está situado en el punto A de la foto adjunta 1 y 2 2) De donde he pulsado con el ratón en la UI image (punto A), a donde se encuentre el ratón manteniendo pulsado (punto B), me forma un vector. Este vector juntamente con el horizontal (AC), forman un ángulo, que es el que yo busco. 3) Hay que tener en cuenta que la UI image puede tener diferentes ángulos, y por eso el vector horizontal AC es respecto a la UI image y no respecto al escenario 2D (ejemplo foto 1 y 2) He hecho varios intentos, y con el que me he acercado más ha sido con que adjunto. Lo que he hecho ha sido crear una variable “coordRaton” que es el punto B de la foto. La variable “coordRatonPulsado” pretende guardar las coordenadas de donde se ha pulsado encima de la UI image (punto A). Para que me calcule el ángulo una vez he pulsado encima de la UI image estando encima de esta o no, he creado la variable “pulsado”. Para finalizar, dentro del condicional pulsado == 1, he cargado a la consola el valor del ángulo entre el vector AB (vectRadio) y AC (vectHorizontal). Pero no da el resultado deseado. Como se ve en la tercera imagen, cuando estoy en la izquierda marca 0º y a medida que voy trazando un semicírculo hacia arriba llego a 90º y después a 180º. El problema está en que cuando empiezo a descender el ratón, me marca los valores que están en rojo, y no los que están en negro que son los que quiero. Así pues, ¿cómo puedo hacer que me vaya de 0º hasta 360º, en vez de 0º a 180º y de 180º a 0º? Adjunto también un pequeño gif para acabar de aclarar la idea de la foto 3. Por favor, si alguien puede ayudarme se lo agradecería mucho, he hecho muchas pruebas y he buscado en muchos sitios, pero no he dado con la solución. Y si me he complicado mucho la vida con la idea o con el script proponedme otra alternativa más sencilla por favor. Muchas gracias por su tiempo y ayuda Vector2 coordRaton; Vector2 coordRatonPulsado; int pulsado; // 0 no pulsado y 1 sí pulsado void Update() { coordRaton = Input.mousePosition; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Debug.DrawRay(ray.origin, ray.direction * 100, Color.green); RaycastHit hit; if (Input.GetMouseButton(0) && Physics.Raycast(ray, out hit) == true) { if (hit.collider.name == "Image") { coordRatonPulsado = Input.mousePosition; pulsado = 1; } } if (Input.GetMouseButtonUp(0)) { pulsado = 0; } if (pulsado == 1) { Vector2 vectRadio = new Vector2(coordRatonPulsado.x - coordRaton.x, coordRatonPulsado.y - coordRaton.y); Vector2 vectHorizontal = new Vector2(coordRatonPulsado.x, 0); float grados = Vector2.Angle(vectRadio, vectHorizontal); Debug.Log(grados); } }
  3. La intro: Hola, he realizado una prueba que me ha sido útil en el proyecto que estoy haciendo y ya que estaba muy ocupado quería compartir los resultados obtenidos . La cuestión es así, hace ya un tiempo que estoy diseñando un Character Controller 2D 100% kinemático (osea sin rigidbodies dinámicos, puede operar también sin rigidbody, el componente está ahí por si se quieren usar triggers y demás... pero NO es "necesario"), es decir que la detección de colisiones se realiza a mano, mediante disparar rays, spheres, boxs, o lo que sea que ayude a determinar que objeto se interpondrá en el camino del personaje, y en base a ello desplazarlo. Dentro de la parte de CollisionDetection tengo la opción (desde que lo arranqué) de elegir por RayCast (con rays horizontales y verticales) o por BoxCast (con la opción del grosor de la caja a disparar). La ventaja clara de la caja es que barre en toda su longitud (osea no quedan agujeros), un boxcast equivale a hacer un sweep de rays (refiriendome al resultado , NO al método!!), entonces te permite muchisima más precisión (que sea o no necesaria es otra cuestión). -> De aquí la pregunta que me hice, por que sigo incluyendo el raycast? será que el rayCast es "performance-friendly" cuando la caja, a expensas de su precision/resultado te asesina?... La demo: La demo consiste en instanciar una cantidad X de cubitos (los personajes de prueba que estoy usando) inmóviles (para esta demo) que solo están "Casteando" sin sentido a los 4 lados (Norte sur este oeste), la idea principal es medir de alguna manera quien gana en precisión (obviamente el boxcast) y en performance (suprise motherf...) . El otro propósito de esta demo es la de demostrar que no hay que tenerle miedo al raycast, mucha gente piensa que podés tirar maximo diez, en las pruebas que realicé con esos cubo/personajes logré alrededor de 60 fps disparando algo así como 15000 rays! en una PC de gama media/baja (mas baja que media ), y por supuesto sacando de lado que para cada resultado de la colision se calculan/aplican otras cosas más, senos, cosenos, tangentes, arcotanges, y demás (útiles para el character controller). Claro que eso no justifica tirar rays o de más, sobre todo si estás en dispositivos moviles, pero tampoco hay que temerles tanto. De acá se puede descargar por si quieren probar ustedes mismos: https://drive.google.com/open?id=1_YgnuT3NEWFoLJVPSskXwbRekLpmSjpT E, R y T cambian de método Click : instanciar 1 Personaje M : Instanciar 100 personajes Enter : Full reset Escape : Salir Puede existir algun que otro bug, sobre todo porque estoy remodelando el tema del controller y las colisiones, pero para el objetivo de este test son irrelevantes. Los Resultados (FPS): - Obviamente sin Vsync y usando la Build, en Editor los valores grandes bajan mucho más, los valores mayores a 50 se mantienen parecidos, lo cual es lógico por el mismo overhead del Editor - Sacar de lado que se usa OnGUI para redibujar la GUI (FPS + instrucciones) y que además las strings se concatenan con el "+=" (estaba muy pancho), todo en conjunto forma el asignador de GC allocations por preferencia de Unity (6.2 KB ), así que no se que tan mejor pueda ir la cosa si se hace bien, pero tampoco es que sea crucial esto para esta prueba en específico. - Los valores extremos que se ven de 1 a 50 personajes son totalmente lógicos, quieren decir que la parte de colision del método no influye en nada frente a otros posibles factores: networking, gráficos, AI, luces, físicas, FX's, ---> intencionalmente no hay ninguno de estos , tener en cuenta que la escena es 2D, sin nada, solamente el raycast/boxcast afecta el rendimiento: Al agregar de a 100 de golpe (naranja = Physics , celeste = Scripts , verdoso (?) = GC) Como se puede ver el BoxCast funciona mejor a nivel fps y además se comporta mejor para casos extremos como el siguiente (no que sea útil en un juego real, pero andar va a andar bien): La Conclusión: Es muy probable que tire la opción del Raycast a la basura ya que: Se comporta peor en todo sentido. Está bien que no tiene sentido tener 400 jugadores, pero debería ser mejor que el boxcast (por lo menos en performance) para , no se, 10 jugadores en pantalla? (un escenario bastante real player + npc's por ej), y no lo hace. Programar la caja es mucho más rápido y fácil. No conozco otros Character Controllers basados en BoxCast.
  4. Buenas a tod@s, tengo un par de dudas que no consigo dar con la tecla y bueno agradecería una ayudita :) una de ellas y mas simple es por que me pone sombras en un skinnedmeshrender, este skinnedmeshrender se ilumina con una luz externa (light directional) y tiene las propiedades castshadows y light probes desactivadas pero sin embargo siguen saliendo sombras. Por otro lado estoy tratando de realizar un movimiento mediante un minimapa el cual es una imagen de tipo Render Texture (imagen proyectada por una cámara) y esta imagen la asocio a una rawimage de la ui pero resulta que al hacer click sobre esta imagen el raycast no detecta la ui y en la propia ui tengo activada la opción Raycasttarget pero nada se ve que el rayo atraviesa la ui y me detecta lo de atrás, el código es el siguiente: if (Input.GetKey(KeyCode.Mouse1)){ var ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, hit,100)){ Debug.Log(hit.transform.gameObject.name + hit.transform.gameObject.layer); if (hit.collider.gameObject.layer == 16){ // este layer se lo he asignado a la rawimagen del minimapa (sólo tiene este layer la imagen esta) ray = camaraMapa.ViewportPointToRay(new Vector3(hit.textureCoord)); if (Physics.Raycast(ray, hit)){ vPosicion=hit.point; } } else{ vPosicion=hit.point; } }
  5. Buenas, alguien sabe alguna utilidad (funcion) especifica para convertir las coordenas (mousePosition) dentro de un miniMap (RenderTexture) a las coordenadas reales del mundo. Lo que busco es el clasico "MoveCameraFromMiniMap". Ya investigue pero ninguno da una solución solida y mis pruebas no dieron resultado. Lo ultimo que estaba viendo es ScreenPointToLocalPointInRectangle, pero no se muy bien su implementacion. Saludos!
  6. Buenas tardes, Tengo un pequeño dilema y no se porque no funciona, seguramente es una tontería pero llevo 2 horas comiéndome la cabeza y no logro encontrar el porque! Tengo un script desde donde controlo las cosas."GameControl"; using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.SceneManagement; public class GameControl : MonoBehaviour { public static GameControl instance; //referencia del gamee control script que podemos acceder instantaneamente. public Text scoreText; private int puntos = ; public bool gameOver = false; public float scrollSpeed = -1.5f; public GameObject gameoverr; public int vidas =; public Text vidasText; void Awake() { //si no tenemos el control... if (instance == null) //...lo llamamos... instance = this; //...de lo contrario... else if(instance != this) //...destruye este porque esta duplicado. Destroy (gameObject); } void Start() { gameoverr.SetActive (false); PlayerPrefs.SetInt ("MyScore",); //PlayerPrefs.SetInt ("vidas",0); vidasText.text = "Lives: " + vidas.ToString(); } void Update() { if (vidas <= ) BirdDied (); } public void BirdScored() { // //si el player no puede hacer mas puntos y acabo la partida. if (gameOver) return; //si el juego no ha terminado, aumentamos el score... puntos += 1; //...i lo mostramos en el score. PlayerPrefs.SetInt ("MyScore", puntos); scoreText.text = "Score: " + puntos.ToString(); vidasText.text = "Lives: " + vidas.ToString(); } public void BirdDied() { //Activa el gameover. gameOver = true; gameoverr.SetActive (true); PlayerPrefs.GetInt ("MyScore"); } public void quitavida() { vidas -= 1; } } y tengo este otro que registra un raycast que si no colisiona con el gametag granjero hace una animación y después destruye el GO. Hasta aqui bien la cosa viene cuando le quiero decir que si no has clickado encima de el GO,con el tag " granjero", que se active el sistema de quitar una vida pasados 6 segundos, para eso llamo a la coorutina quitavida, la cual espera 6 segundos e instancia el void quitavid que se encuentra en el script anterior.Pero no hace tal cosa! este es el script ; using System.Collections; using System.Collections.Generic; using UnityEngine; public class tocagranjero : MonoBehaviour { private Animator anim; private Rigidbody2D rb2d; private GameObject gamecontrol; public AudioSource audio2; AudioSource audio; void Start() { anim = GetComponent<Animator> (); rb2d = GetComponent<Rigidbody2D>(); audio = GetComponent<AudioSource> (); gamecontrol = GameObject.Find ("GameControl"); } IEnumerator quitavida() { yield return new WaitForSeconds(6); GameControl.instance.quitavida (); Debug.Log ("te quito una vida"); } void Update () { if (Input.GetMouseButtonDown ()) { Vector3 mousePos = Camera.main.ScreenToWorldPoint (Input.mousePosition); Vector2 mousePos2D = new Vector2 (mousePos.x, mousePos.y); RaycastHit2D hit = Physics2D.Raycast (mousePos2D, Vector2.zero); if (hit.collider != null) { Debug.Log (hit.collider.gameObject.name); if (hit.collider.tag == "granjero") { anim.SetTrigger ("tocado"); GameControl.instance.BirdScored (); Destroy (hit.transform.gameObject, 2); audio2.Play (); } } } else { StartCoroutine ("quitavida"); } } } Espero que sea lo que digo una tontería....y que alguno de ustedes pueda decírmela, muchas gracias de antemano.
  7. Hola! Os dejo por aquí el último post en mi blog sobre "Optimización en Unity". En él hablo sobre algunas técnicas básicas para hacer nuestro juego más óptimo. Espero que os guste! LINK: https://histeriagamedev.wordpress.com/2017/06/16/optimizacion-en-unity/ Saludos!
  8. Hola, bueno voy al grano me canse de hacer post, haber tengo mi codigo hago algo, pasa lo que programe, lo hago en otro gameobject el mismo codigo, todo exactamente igual, no pasa nada.... que pasa????????????????????????????? Miren... en el video no mostre, pero son dos gameobject completamente IGUALES (los platforms con el raycast azul son iguales mismo script todo menos el nombre pero no afecta..) No le den Bola al Debug "StopSlow" es otra cosa aparte. ... La puta madre.... Codigo maldito: using System.Collections; using System.Collections.Generic; using UnityEngine; public class FinishSlow : MonoBehaviour { public enum RaycastState {Left, Right, Forward, Back, stopSlow}; public RaycastState m_state; private GameObject target; private Player_Movement m_target; private const float lenghtRay = 0.45f; private const float rayDistance = 0.3f; private const float slowMovePeriod = 2.5f; private void Start () { target = GameObject.Find("Player"); m_target = target.GetComponent<Player_Movement>(); } private void Update () { DrawRaycast(); } private void DrawRaycast() { switch (m_state) { case RaycastState.Right: if (Physics.Raycast(new Ray( transform.position + Vector3.right * lenghtRay, Vector3.up), rayDistance)) { if (m_target.Ratio == 1) { if (m_target.X == -1) StartCoroutine("_SlowX"); else if (m_target.X == 1) m_target.MovePeriod = 0.31f; } } break; case RaycastState.Left: if (Physics.Raycast(new Ray( transform.position + Vector3.left * lenghtRay, Vector3.up), rayDistance)) { if (m_target.Ratio == 1) { if (m_target.X == 1) StartCoroutine("_SlowX"); else if (m_target.X == -1) m_target.MovePeriod = 0.31f; } } break; default: break; } } private IEnumerator _SlowX() { m_target.MovePeriod = slowMovePeriod; yield return m_target.MovePeriod; m_state = RaycastState.stopSlow; } private void OnDrawGizmos() { Gizmos.color = Color.blue; switch (m_state) { case RaycastState.Right: Gizmos.DrawRay(transform.position + Vector3.right * 0.45f, Vector3.up * 0.3f); break; case RaycastState.Left: Gizmos.DrawRay(transform.position + Vector3.left * 0.45f, Vector3.up * 0.3f); break; } } En mi ejemplo del video, uso este script en los dos gameobject que muestro(los que emiten el raycast azul) uso el enum Left, igualito igualitoo, pero como pueden ver uno me hace caso... y otro no....... que pasa???????????? Alguna solucion? algo que estoy haciendo mal, que esta pasando? Se sobreescribe algo? nose nose estoy hace 4 horas con este codigo y no le encuentro la vuelta..... funciona, no funciona... que pasa? Saludos..
  9. Hola! espero que esten bien. Bueno, estube dandole vueltas y vueltas a los RayCast y todabia nose manejarlos bien, es decir, entiendo toda su mecanica a la perfeccion, pero en le codigo me hace cosas raras... y la verdad que me frustra bastante estos raycastsitos.... Bueno la cuestion es que necesito simplificar este despelote asqueroso, o nose si es asqueroso, por ahi es la unica forma de hacerlo, pero miren... public bool castHitForward; public bool castHitBack; public bool castHitLeft; public bool castHitRight; private void Update() { RaycastHit hitForward; RaycastHit hitBack; RaycastHit hitLeft; RaycastHit hitRight; castHitForward = Physics.Raycast(new Ray(transform.position, Vector3.forward), out hitForward, 0.2f); castHitBack = Physics.Raycast(new Ray(transform.position, Vector3.back), out hitBack, 0.2f); castHitRight = Physics.Raycast(new Ray(transform.position,Vector3.right), out hitRight,0.2f); castHitLeft = Physics.Raycast(new Ray(transform.position, Vector3.left), out hitLeft, 0.2f); if (castHitForward) Debug.Log(hitForward.collider.name); if (castHitBack) Debug.Log(hitBack.collider.name); if (castHitRight) Debug.Log(hitRight.collider.name); if (castHitLeft) Debug.Log(hitLeft.collider.name); } private void OnDrawGizmos(){ Gizmos.DrawRay(transform.position, Vector3.forward * 0.2f); Gizmos.DrawRay(transform.position, Vector3.back * 0.2f); Gizmos.DrawRay(transform.position, Vector3.right * 0.2f); Gizmos.DrawRay(transform.position, Vector3.left * 0.2f); } Bueno, todo eso hace esto simplemente... Bueno, en el centro pueden ver lo que estoy haciendo... En el ejemplo 1 muestro lo que hace mi codigo lo cual no es eficiente... En el ejemplo 2 muestro lo que quiero, simplemente dos raycast, o linecast nose como mierda funiconan... La cuestion es que ya intente hacer los dos, y como que solamente me toma por ejemplo si largo el cast de A hasta B me toma los hit con direccion de B hasta A Osea... si creo un Cast desde a hasta b A-----B me toma el hit asi... A-----B<-----HIT El Physic es TRUE ....Pero si intento esto HIT----->A-----B El Physic es FALSE No me lo toma..... Entiendo que un Ray(rayo) dispara de su direccion hasta la otra direccion entonces es razonable que solo tome el hit de B... peero tambien intente con LineCast y pasa lo mismo, en una linea no tiene sentido... Ahi ya mi logica se rompe y sobre pasa mis leyes naturales que conosco jajaja Tambien pense en un BoxCast pero no tengo ni puta idea como usarlo, y no me vengan con la API de unity que no especifica nada sobre eso :/ Entonces como genero un Cast que me lo tome en ambas direcciones? HIT----->A-----B<-----HIT TRUE Ambos(como en el ejemplo 2, donde usaria simplemente 2 hits)... como lo hago? es posible?, en el caso de no ser posible... como hago mas eficiente el codigo?.... Espero que hayan entendido mis ejemplos(sino pruebenlo ustedes mismos y me van a entender)... Saludos.
  10. Hola de nuevo (Perdon por hacer tantos post pero tengo muchas dudas, y no son cualquier inquietud, la verdad son dificiles tanto para mi siendo novato, como para encontrar respuestas concretas en la red) En este caso me encuentro en un problema grave, y es que ahora mismo me esta costando mucho entender el sistema Booleano de Phisycs.Raycast Lo que me pueden preguntar: Porque??, no es tan complicado enelmenu, no seas boludo cheee, da valor verdadero y falso!! e.e no me digas u.u, basicamente me cuesta porque no entiendo su logica, miren este mini script (si tiene errores avisen) que hice: public bool phyRay; public bool phyRayF; void Update () { Debug.DrawRay (transform.position, Vector3.down * 0.8f, Color.yellow); Debug.DrawRay (transform.position, Vector3.right * 0.8f, Color.red); RaycastHit hit; Ray ray = new Ray (transform.position, Vector3.down * 0.8f); Ray rayF = new Ray (transform.position, Vector3.right * 0.8f); phyRay = Physics.Raycast (ray, out hit, 0.8f); phyRayF = Physics.Raycast (rayF, out hit, 0.8f); if (phyRay = true) { Debug.Log ("opa"); } else if (phyRayF = true) { Debug.Log ("aita"); } } PhyRay = ¿No deberia ser false mientras mi raycast down no toque nada abajo? PhyRayF = ¿No deberia ser false mientras mi raycast right no toque nada a su derecha? Sin embargo mi cuando inicio el script (situando mi centro en una pocision que no toca ningun trigger collider en ningun lado) inicia como bugeado, inicia phyRay true y phyRayF false.... Alguien me puede explicar que pasa? que estoy haciendo mal, o como se hace?
  11. Tengo un problema con raycaster, basicamente queria conseguir que el personaje principal, (un conejito), no pudiera saltar hasta que no tocara el suelo , para evitar algo parecido al juego flappy bird donde encadenabas saltos, pero nada, que no lo consigo, y le he dado mil vueltas y no sé que hacer, os dejo el codigo a ver si me podeis echar una mano using System.Collections; using System.Collections.Generic; using UnityEngine; public class playerController:MonoBehaviour { public float jumpForce = 6.0f; public float runningspeed = 1.0f; private Rigidbody2D rigidBody;//para poder acceder al modulo de fisica del conejito public LayerMask groundLayerMask; public Animator animator; void awake () { } // Use this for initialization void Start () { rigidBody = GetComponent<Rigidbody2D> (); animator.SetBool ("isAlive", true); } // Update is called once per frame void Update () { //el es el boton izquierdo,buttondown es apretarlo hacia abajo if (Input.GetMouseButtonDown ()) { Jump (); } animator.SetBool ("isGrounded", IsOnTheFloor ()); } void FixedUpdate(){//se llama a este metodo, cada tiempo fijo, no a cada frame if (rigidBody.velocity.x <runningspeed){ rigidBody.velocity = new Vector2 (runningspeed, rigidBody.velocity.y); } } void Jump() { if (IsOnTheFloor ()) { //Se le aplica la fuerza a un cuerpo rigido, como es un salto, el vector 2(que es el Y, que va para arriba)y up xq es un salto,despues se usa el otro parametro forcemode2d para añadir impulso al salto rigidBody.AddForce (Vector2.up * jumpForce, ForceMode2D.Impulse); } } //sirve para ver si el conejo toca el suelo, lo explico a continuación: //a la física 2D le pido que me lance un rayo(Raycast),Raycast tira un rayo a this.transform.position(Eso es la posición del conejo en ese momento) //hacia el suelo(Vector2.down) de longitud 1.0f y comprueba si toca el SUELO(groundLayerMask) bool IsOnTheFloor(){ if (Physics2D.Raycast(this.transform.position,Vector2.down,1.0f,groundLayerMask.value)){ return true; } else { return false; } } }
  12. Un saludo a todos... veamos, quizás alguien pueda echarme un cable, tengo un script que me está dando quebraderos de cabeza. Básicamente se trata de lo siguiente: Objeto con etiqueta "Agarrable" es atraído hacia Puntogravity (colocado frente al arma) con la intención de que quede frente al jugador, el problema es que es atraído pero luego cae, no se queda en suspendido junto al gameobject Puntogravity. Tengo que decir que es una mezcla de diferentes scripts que he visto para poder conseguir lo que quería. //(variables instadas) var Camara : Transform; var Puntogravity : Transform; private var hit2 : RaycastHit; //(cuerpo dentro del sistema de armas, obviamente se trata de la Gravitygun del HL2) if(apuntarModo == apuntarModo.Agarrar) //no hacer caso a esto, está dentro de los diferentes modos de las armas y hasta aquí funciona bien. { var fwd:Vector3; aiming = false; fwd =transform.TransformDirection(Vector3.forward); Debug.DrawRay (Camara.transform.position, fwd * 5, Color.red); if (Physics.Raycast (Camara.transform.position, fwd, hit2, 15)) { if (hit2.collider.tag == "Agarrable") { if (hit2.rigidbody.useGravity == true) //si no está siendo agarrado, cogerlo { hit2.rigidbody.useGravity = false; //Gravedad off hit2.rigidbody.transform.position = Puntogravity.position; //Ir a <==== AQUÍ FALLA coge pero no retiene en la posición } else if (hit2.rigidbody.useGravity == false) //Si ya está siendo agarrado, soltarlo. { hit2.rigidbody.useGravity = true; //Gravedad on } } } } Gracias de antemano.
  13. Hola a tod@s! Bueno, he trabajado sobre un sistema de click&drag, y la verdad es que con OnMouseDown ha funcionado bastante bien. La duda que tengo ahora es si habría sido mejor hacerlo en Physics.Raycast. Pensándolo bien, el método OnMouseDown es un evento que detecta si se hace clic sobre el objeto o no, ¿no? Por lo que llevaría a más procesamiento que el Physics.Raycast. Explicándome mejor: si tienes 5 objetos con un script el cual tenga OnMouseDown, será como crear 5 condicionales. Sin embargo, al crear un Physics.Raycast, sería como crear 2 condicionales (saber si se ha pulsado un objeto, y saber cual se ha pulsado). Así, ¿cual creéis/sabéis que es mejor? ¡Gracias de antemano!
  14. Buenas Tengo un problema, estoy haciendo un juego en tercera persona en 2D, y resulta que el personaje se me resbala al caminar ( el personaje tiene puesto el Box Collider2D y el rigidbody2d ), ya sea al caminar por el piso o por las plataformas (que dibuje), las plataformas y el piso tienen de Layer: Ground, y estuve mirando videos en youtube que puede ser que sea algo relacionado con el RayCast y Physics ( no tengo ni la mas palida idea como funciona, o como se escribe en el script ). Mucho no se programar, solo un poco en JavaScript. Quisiera mi personaje se mueva por el piso u plataformas de esta manera Unity 2D Platform Physics Test Podrian ayudarme? Gracias
  15. RaycastHit hit; if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100)) Gracias. Resulta un poco confuso de entender.
  16. OK, esto esta complejo, así que me tomare mi tiempo para explicar ... Estoy haciendo un Script para construir dinamicamente, ya tengo la mayor parte hecha, pero tengo un problema. Necesito que la "Estructuras nuevas" se instancien en el lugar hacia donde mi personaje dirige la mirada. Pero no me sale, porque la estructura siempre se instancia en mis pies. Asumo que el problema esta a la hora de hacer el "Physics.Raycast", Tengo lo siguiente; using UnityEngine; using System.Collections; public class Build : MonoBehaviour { private GameObject EstructuraMuestra; public GameObject Estructura; RaycastHit myhit = new RaycasaRRRtHit (); Ray myray = new Ray (); bool EstructuraActiva; void Star(){ EstructuraMuestra = Estructura; Renderer[] R = EstructuraMuestra.GetComponentsInChildren<Renderer> (); Collider[] C = EstructuraMuestra.GetComponentsInChildren<Collider> (); if (EstructuraMuestra.GetComponent<Renderer> ()) EstructuraMuestra.GetComponent<Renderer> ().material.color = new Color32 (0, 200, 0, 155); if (EstructuraMuestra.GetComponent<Collider> ()) EstructuraMuestra.GetComponent<Collider> ().eneable = false; for (int i=0; i<R.Length; i++) R [i].material = new Color32 (0, 200, 0, 155); for (int i=0; i<C.Length; i++) C [i].eneable = false; EstructuraMuestra.name = "Estructura-Ejemplo"; EstructuraActiva = true; } void Update () { myray = Camera.main.ScreenPointToRay (new Vector3 ((Screen.width / 2), (Screen.height / 2), 0)); if(EstructuraActiva == true){ if (Physics.Raycast (myray, out myhit, 1000.0f)) { EstructuraMuestra.transform.position = myhit.collider.transform.localPosition; } } if(Input.GetBottonMouse(0)){ GameObject tempo = (GameObject)Instantiate (Estructura, EstructuraMuestra.transform.localPosition, EstructuraMuestra.transform.localRotation); tempo.transform.SetParent (GameObject.Find ("Terreno").transform); tempo.name = "Estructura"; DestroyObject (EstructuraMuestra); EstructuraMuestra = new GameObject (); EstructuraActiva = false; } } } ¿Alguien podría ayudarme?... Pdata; Mi personaje esta en 3° persona, ¿Creen que eso afecte?....
  17. oridar

    raycast

    buenas, alguien podría indicarme un poco como funciona el raycast? lo he estado mirando en la guía de unity pero no me aclaro, estoy intentando que aleatoriamente se cree un gameobject que caerá desde cierta altura solo si debajo esta otro objeto concreto. no se como utilizar el raycast para que detecte si existe ese objeto debajo con cierto tag i instancia el gameobject que cae. gracias .
  18. Hola comunidad, es la primera vez que escribo en el foro, estudio diseño de videojuegos y soy de los que hacen las cosas solos, tocando y rompiendo, y volviendo a romper. Pero ahora estoy con un problema que la verdad no se me ocurre como solucionarlo. La cosa es asi, tengo un enemigo al que al dispararle con raycast, resta vida y muere perfecto, ahora bien, para detectar la colision estoy usando CompareTag, el problema es que cuando duplico este enemigo ("zorro"), al dispararle a uno, le estoy restando vida al otro tambien, y al volver a dispararle, muere el otro enemigo al que no le dispare. probe varias cosas, pero ninguna me resulto. Les paso mis scripts del player y el de la vida del enemigo. Espero alguno me pueda ayudar! SCRIPT PLAYER MANAGER: http://hastebin.com/oqaqiremas.avrasm Desde ya mil gracias!
  19. PRE FUNDATION... Hola amigos y amigas Vengo a preguntarles un problema que tengo, seguro es alguna pavada pero se me hace difícil pensar como hacerlo. El tema es el siguiente... Vieron como en los juegos de supervivencia donde se puede construir?... Unos de los ejemplo es rust, donde tu tienen un fundation lo colocas y cuando miras el fundation te "AUTOACOMODA" el siguiente fundation alado y si moves el mause se cruza a otro angulo y así, depende donde mires te lo autoacomoda listo para hacer click y construir... Entonces resumiendo seria que: cuando en rust se mira el fundation(Piso donde desde ahí se empieza a poner paredes etc) te autoacomoda o te lleva el prefundation (El fundation transparente que muestra a donde se va a poner) a un costado del fundation osea el fundation tiene 4 lados vos miras cierta parte del fundation y te lleva a un costado acomodando la facibilidad de construiccion porque te acomoda el prefundation alado pegado. Creo que con esta "explicacion" van a entender... Este es el Script... void Update () { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //Vector3 fwd = transform.TransformDirection (Vector3.forward); if(Physics.Raycast(ray,out hit, 10)){ Prefab.position = hit.point; //aca busca con el hit del rayo busca un tag llamado cubo if(hit.transform.tag==("Cubo")){ //si encuentra el rayo esto: entonces print, me lleva el prefundation a una nueva posicion. y esa posicion es un pl un prefab que esta alado del fundation . todo esto prefabricado... print ("hit LookAt"); Prefab.position = new Vector3 (p1.transform.position.x,p1.transform.position.y,p1.transform.position.z); } if (Input.GetButtonDown ("Fire1")&&(Libre)) { Instantiate (Piso, Prefab.position, Prefab.rotation); } //print (hit.point); } } } Bien como ven, el problema de el script es que el prefab donde se instancia el prefundation, es que ahi un solo prefab por lo tanto una sola posicion. Osea que en un fundation puede andar bien, pero en otro al mirarlo va a llevar el prefundation a donde estaba el otro fundation. Bueno eso necesito una solucion o script para poder autoacomodar el fundation al mirar un fundation, seria con rays pero como? Gracias...
  20. ¡Buenas, compañer@s! Me paso por el foro para dejar un aporte: no es un script complejo para nada, pero puede seros útil para maquetar proyectos o incluso lo poidéis adaptar a vuestro juego en el caso de que queráis y os venga bien. Se trata de un Pathfinder que funciona lanzando Raycasts (de arriba a abajo) alrededor del objeto que queramos que se mueva conforme a un objetivo (inteligencia artificial). Hace un mes aproximadamente vi que en el foro alguien había subido un script de las mismas características, sin embargo, los enlaces estaban caídos y decidí desarrollarlo un poco por mi cuenta. Tengo la costumbre de programar en inglés, supongo que no tendréis problemas con el idioma... xD Y por si acaso quedaran dudas con respecto al funcionamiento del script, dejo comentarios sobre todas y cada una de las funciones y las variables principales (en ESPAÑOL). Es bastante intuitivo a la hora de usarlo, pero repito: es una solución simple, lo he programado porque necesitaba YA un pathfinder que funcionara a grosso modo en un mundo generado de forma procedural. Sin más, os dejo el archivo en adjuntos, está programado en C#. Espero que sirva de utilidad, y si se os ocurre cualquier cosa, comentadlo, a ver qué podemos hacer. PD: Si esta no es la sección apropiada, por favor, moved el tema a la sección correspondiente. Gracias. Kace. PathCalculator.cs
  21. Hola, buenas. Estoy metido en un proyecto universitario en el cual soy el encargado de hacer el menú de un juego de VR mediante una GUI, con varios canvas. El caso es que necesito un script para que, mediante un Raycast, salga un rayo de la cámara siguiendo el mouse. Vamos, que el rayo me indique sobre qué botón estoy ahora mismo situado. Espero lo entiendan y me puedan responder. Saludos.
  22. Buenas a todos de nuevo. Ya tengo el rayo del RayCast que me sale fuera del menú de juego, ahora, lo que necesito, es que desde la cámara de juego, en el menú, desde el centro de la cámara, me salga un puntito de luz que me indique dónde está ahora el centro de la pantalla y poder mover el ratón desde ahí; ya que es realidad virtual y quiero tener una mínima idea de por dónde va mi vista, para elegir uno u otro botón; espero explicarme y a ver si podéis ayudarme. Saludos.
  23. Buenas noches a todos. ¿Es posible habilitar o deshabilitar por medio de código (script) un raycast que estoy generando desde un cubo?.¿Como seria el script o las lineas de código que me solucionarían esto?.Por favor ayúdenme con esta inquietud. Muchas gracias.
  24. Hola a todos!!! de nuevo yo por aquí verán, siempre veo como en la mayoría de juegos android, se puede hacer "drag" con un dedo y "scale" con dos... verán he investigado ( y por esto me refiero a preguntarle a alguien mas XD), pero no he encontrado lo que busco... mi intencion no es pasar las coordenadas de la pantalla a las coordenadas del espacio 3D, eso me daria resultados, incorrectos, por ejemplo De ahí que lo que busco, es disparar un rayo que 1.- encuentre el objeto que deseo mover 2.- encuentre sus coordenadas (las del rayo) en el plano X-Z cuando Y=0 es decir en el suelo y al mover el dedo... 1.- encuentre la diferencia con respecto al punto anterior en el plano X-Z cuando Y=0 2.- sume eso a la posición inicial del objeto haciendo que el mismo, se mueva con mi dedo. Espero haberme hecho entender de la mejor manera alguna idea? recursos de investigacion? sugerencias? aprecio mucho su ayuda....
  25. Estoy intentando modificar un sistema de notas de un tutorial para adaptarlo a tercera persona, lo que quiero hacer es sustituir el raycast solo cuando third este activo, por colision al tag "Note", o la funcion OnTriggerStay o OnCollisionStay... pero si con js me lio, con c# ya me resulta jodidisimo... Bueno esto es lo que tengo puesto en el player, he probado a aumentar el raycast en third (sin exito) y no se como sustituir el raycast por alguna de las funciones que he comentado. El script este seria el del player para ambos estados (fist y third), el de la nota ya lo tengo resuelto. La funcion CheckForNote esta dividida en 2 partes: en la parte if first ActiveSelf... no hay problema y se ve la nota al acercarte y pulsar el boton en la parte if third ActiveSelf... es donde quiero sustituir el raycast por colision o por ontriggerenter, pero no se como hacerlo. using UnityEngine; using System.Collections; public class PickupNote : MonoBehaviour { //Maximum Distance you Can Pick Up A Book public float maxDistance = 1.5F; public GameObject first; public GameObject third; //Your Custom GUI Skin with the Margins, Padding, Align, And Texture all up to you private GUISkin mySkin; //Are we currently reading a note? private bool readingNote = false; //The text of the note we last read private string noteText; void Start () { //Start the input check loop StartCoroutine ( CheckForInput () ); } private IEnumerator CheckForInput () { //Keep Updating while (true) { //If the 'E' was pressed and not reading a note check for a note, else stop reading if (Input.GetButtonDown("accion")) { if (!readingNote) CheckForNote (); else readingNote = false; } //Wait One Frame Before Continuing Loop yield return null; } } private void CheckForNote () { if (first.activeSelf == true) { //A ray from the center of the screen maxDistance = 2.3f; Ray ray = Camera.main.ViewportPointToRay (new Vector3 (0.5F, 0.5F, 0)); RaycastHit data; //Did we hit something? if (Physics.Raycast (ray, out data, maxDistance)) { //Was the object we hit a note? if (data.transform.name == "Note") { //Get text of note, destroy the note, and set reading to true noteText = data.transform.GetComponent <Note> ().Text; mySkin = data.transform.GetComponent <Note> ().mycustomSkin; readingNote = true; } } } //HASTA AQUI TODO BIEN, ESTA ES LA PARTE DONDE EL RAYCAST PODRIA SUSTITUIRLO POR ONTRIGGERSTAY?¿QUE FUNCION SERIA MAS ADECUADA??? if (third.activeSelf == true) { maxDistance = 5000f; //pense que aumentando la distancia leeria la nota Ray ray = Camera.main.ViewportPointToRay (new Vector3 (0.5F, 0.5F, 0)); RaycastHit data; if (Physics.Raycast (ray, out data, maxDistance)) { if (data.transform.name == "Note") { noteText = data.transform.GetComponent <Note> ().Text; mySkin = data.transform.GetComponent <Note> ().mycustomSkin; readingNote = true; } } } } // A PARTIR DE AQUI TODO BIEN void OnGUI () { if (mySkin) GUI.skin = mySkin; //Are we reading a note? If so draw it. if (readingNote) { //Draw the note on screen, Set And Change the GUI Style To Make the Text Appear The Way you Like (Even on an image background like paper) GUI.Box (new Rect (Screen.width / 4F, Screen.height / 16F, Screen.width / 2F, Screen.height * 0.75F), noteText); } } }
×
×
  • Create New...