Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Poder o no poder Construir Ayuda!

Iniciado por NicoProner, Enero 12, 2016, 06:00:21 AM

Tema anterior - Siguiente tema
Enero 12, 2016, 06:00:21 AM Ultima modificación: Enero 12, 2016, 06:01:26 AM por NicoProner
Hola amigos Bueno, tengo un problema que no se me ocurre nada, como que estoy en blanco quizas sea comprobar con tags o no se como bueno.. El tema es que cuando fundation que tengo con el raycast cuando no toque nada por ejemplo un palo o otro fundation, que si se pueda, y tambien que este tocando el terreno, que si se pueda construir, pero claro si toca o colisiona con algo de eso que no toque.
pensaba añadir algo que compruebe pero no se me ocurre nada porque el raycast no funcionaria porque si por ejemplo el borde solo este colisionando el rayo no lo detectaria. seria añadiendole un colision al fundation y que detecte si toca algun gameobject?...
Fotos...Bueno las fotos quedaron ahi...La primera es cuando si puedo, la segunda es cuando no puedo, y lo mismo con la tercera quiero que no se pueda...Creo que me entendieron.Pido porfavor que el script sea c# porque se me va a mezclar todo. aca el script con el que hago esto asi de paso ayudo a alguien y me lo modifican a ver que lineas le tengo que añadir para que esto compruebe DESDE YA GRACIAS...
using UnityEngine;
using System.Collections;

public class Construir : MonoBehaviour {
RaycastHit hit;
public Transform Prefab;
public Transform Piso;


// Use this for initialization
void Start () {

}

// Update is called once per frame
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;
      if(Input.GetButtonDown("Fire1")){
         if(){
/*aca pensaba añadir algo que compruebe pero no se me ocurre nada porque el raycast no funcionaria porque si por ejemplo el borde solo este colisionando el rayo no lo detectaria.*/

         }
         Instantiate (Piso, Prefab.position, Prefab.rotation);

      }
      //Instantiate (clon, objeto, Quaternion.identity);
      print (hit.point);

   }

}
}
 

Con lo poco que entendi, utiliza la variable hit para obtener con que esta colisionando el rayo.
if(hit.gameObject.tag ==...)

Enero 12, 2016, 07:59:58 AM #2 Ultima modificación: Enero 12, 2016, 08:04:43 AM por NicoProner
[quote author=GSG3D" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34891" data-ipsquote-contentcommentid="125945 date=1452577995]Con lo poco que entendi, utiliza la variable hit para obtener con que esta colisionando el rayo. if(hit.gameObject.tag ==...)[/quote]Sisi eso si se, pero el problema es que como la imagen de arriba muestra cuando apenas el fundation "VERDE" toca la con la punta al cubo yo quiero que no se pueda construir, en cambio si es con hit, solo va a hacer en un punto osea si toca el hit al cubo no se va a poder construir pero si el fundation toca la punta del cubo el hit no lo detectara ya que esta en el terrain no se si logras comprender :c  el ray no lo detectara me entiendes? igual gracias.

No entendi mucho lo que explicas pero con la variable 'hit' como te propone GSG3D y usando mascaras (LayerMask), creo que podras hacer lo que necesitas si entendí bien.

La solución más rápida y fácil sería poner los colliders más anchos, pero seguro que hay otras formas.
Pero para estos casos creo que se suele usar una malla o Tilemap, una matriz [][] que cubra todo el terreno y detecte las zonas ocupadas y libres.

[quote author=juanma_teso" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34891" data-ipsquote-contentcommentid="125968 date=1452605520]La solución más rápida y fácil sería poner los colliders más anchos, pero seguro que hay otras formas.Pero para estos casos creo que se suele usar una malla o Tilemap, una matriz [][] que cubra todo el terreno y detecte las zonas ocupadas y libres.[/quote]

Supongo que el prefab que mueves a los puntos tendrá un collider. Implementa la función OnColliderEnter(); en la que si colisiona con un objeto que no debe (porque con el suelo siempre tendrá colisiones) te ponga un booleano en false, un código a grosso modo sería el siguiente, para que te hagas una idea.
bool libre = true;

void OnCollisionEnter (Collision col)
{
    if(col.tag("Casa o construccion o el tag que quieras jeje"))
    {
        libre = false;
    }
    else
        libre = true;
}

void Update ()
{
    if(Physics.Raycast(--))
    {
        prefab.position = hit.poin;
        if(libre && Input.GetButton("Space"))
        {
            //Construir
        }
    }
}
Tengo que aclarar que solo funcionaría si el script lo lleva el objeto prefab, que es el que detectaría las colisiones con los otros objetos

[quote author=juanma_teso" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34891" data-ipsquote-contentcommentid="125988">Supongo que el prefab que mueves a los puntos tendrá un collider. Implementa la función OnColliderEnter(); en la que si colisiona con un objeto que no debe (porque con el suelo siempre tendrá colisiones) te ponga un booleano en false, un código a grosso modo sería el siguiente, para que te hagas una idea.
bool libre = true;void OnCollisionEnter (Collision col)
{
    if(col.tag("Casa o construccion o el tag que quieras jeje"))
    {
        libre = false;
    }
    else
        libre = true;
}

void Update ()
{
    if(Physics.Raycast(--))
    {
        prefab.position = hit.poin;
        if(libre && Input.GetButton("Space"))
        {
            //Construir
        }
    }
}
Tengo que aclarar que solo funcionaría si el script lo lleva el objeto prefab, que es el que detectaría las colisiones con los otros objetos[/quote]Amigo Lo intentare Gracias de verdad...

Etiquetas: