Noticias

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

Colisión al colocar edificio rts

Iniciado por aurelio, Agosto 18, 2015, 04:02:04 PM

Tema anterior - Siguiente tema
Agosto 18, 2015, 04:02:04 PM Ultima modificación: Agosto 19, 2015, 03:15:11 AM por aurelio
Hola a todos! estoy haciendo un sistema de construcción de edificios tipo trópico (seleccionarlo de un menú y colocarlo en el terreno) y aunque estoy nuevo en esto creo, va todo bien (no ha explotado la com***dora todavía XD).en la camara:
var rayo : Ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(rayo.origin, rayo.direction*Mathf.Infinity, Color.blue);

if(Physics.Raycast(rayo, hit, Mathf.Infinity, mascara)){
   if (hit.collider.gameObject) {
      if(obras){
         edificio=Instantiate(Resources.Load(objeto),Vector3(hit.point.x,hit.point.y,hit.point.z) ,Quaternion.identity) as GameObject;
         edificio.name="construir";
         GameObject.Find("construir").AddComponent.<construir>();
         obras=false;
   
         if(Input.GetMouseButtonDown(1)) {
            obras=false;
            Time.timeScale=1;
         }
      }
   }
}      
luego le pongo este script al objeto(edificio instanciado):
#pragma strict

var edificio: GameObject;

function Start () {

}

function Update () {
   
   transform.position.x=Obras.hit.point.x;
   transform.position.y=Obras.hit.point.y;
   transform.position.z=Obras.hit.point.z;

if(Input.GetAxis("Mouse ScrollWheel") <0) {
   transform.Rotate(Vector3(0,-30,0), Space.World);
}

if (Input.GetAxis("Mouse ScrollWheel") >0) {
   transform.Rotate(Vector3(0,30,0), Space.World);
}
      
if(Input.GetMouseButton(0)) {
   if(Controles.arcas_publicas>=edificios.costo){
      Destroy(this.gameObject);
      edificio=Instantiate(Resources.Load(Obras.objeto),Vector3(Obras.hit.point.x,Obras.hit.point.y,Obras.hit.point.z) , this.transform.rotation) as GameObject;
      Controles.arcas_publicas-=edificios.costo;
      Time.timeScale=1;
   }
   else{
   //provisional
      Debug.Log("no tienes plata");
   }
}
      
if(Input.GetMouseButton(1)) {
   Destroy(this.gameObject);
}   
}
function OnCollisionEnter(Collision){
    
    Debug.Log("Q");
    
}
 logro con esto captar las coordenadas del terreno donde pasa el mouse e instanciar el edificio previamente seleccionado en el gui en esas coordenadas.El problema esta en hacer que la instancia detecte colisiones con por ejemplo edificios ya colocados, arboles, piedras, etc. y que al detectar no permita instanciar.he probado con el ray y con el OnCollisionStay pero creo que no entiendo como funciona esto ultimo, no logro nada.oh grandes gurús del desarrollo independiente, iluminen me con sus conocimientos jajaja


hola! no se a cuales te refieres, estoy buscando y no las encuentro, son las de oncollisionenter, stay...? me pregunto, el hecho de que mueva la instancia con el transform.position interviene en la manera en como detecta las colisiones? el problema en si es que no las detecta. 

Si, exacto, OnCollisionStay y OnCollisionExit.
Agregale un rigibody(statico) y un boxCollider, y yo utilizo transform.position y me detecta las colisiones bien.

Por ley, estos juegos se basan en GRID osea, no es necesario detectar colisiones si lo implementas de esta manero, de lo contrario te sera mas dificil controlar todas las situaciones que se pueden presentar.

Agosto 24, 2015, 08:01:42 PM #5 Ultima modificación: Agosto 24, 2015, 08:05:25 PM por aurelio
gracias a todos por sus respuestas. no tengo idea como hacer un grid, es complicado?planeo usar el pathfinding project a* en el juego, se puede usar el grifo creado desde ese codigo como grid?

@aurelio Son grid's distintos, lo que se refiere @francoe1 es tener una matriz (x,y) para colocar alli tus edificios sean el tamaño que tuviesen, y a su vez comprobar los espacios disponible para tal fin.
Ejemplo:

Hola de nuevo! he resucitado de las cenizas jaja. Gracias a todos por sus respuestas me ayudaron muchísimo.Ya cree un grid con su clase y sus instancias donde puedo almacenar información individualmente. aquí el código por si alguien después le sirve.
#pragma strict
//creacion grid
var posicionX: int;
var posicionZ: float;
var x: int;
var z: int;
var tamanoGraficoCuadricula: float=10;
var graficoCuadricula: GameObject;
var plano: GameObject;
var cuadro = new Array();
var n: int=-1;

function Start () {

   for(z = 0; z < 50; z++){
   
      for(x = 0; x < 50; x++){
         n+=1;
          posicionX = x * tamanoGraficoCuadricula;
         posicionZ = z * tamanoGraficoCuadricula;
         plano=Instantiate(graficoCuadricula, Vector3(posicionX+5, 0.003, posicionZ+5), Quaternion.identity) as GameObject;
          plano.name="cuadro "+n;
          plano.tag="grid";
          plano.AddComponent.<rejilla>();
          plano.transform.parent= GameObject.Find("grid").transform;
          cuadro[n]=plano;
             
       }
      
   }
}
la clase generadora del grid (grid) va en un GameObject vacío, luego desde el inspector asigno a la variable graficoCuadricula el GameObject a instanciar (en este caso un objeto 3d "plano") y la asigno otra clase (rejilla).
#pragma strict

var ocupado: boolean=false;

function Start () {

}

function Update () {
   
   
}

function OnCollisionEnter(col: Collision) {

if(col){
   ocupado=true;
}
}
así desde el sistema de construccion que ya tenía, con un raycast puedo acceder a cada cuadro del plano y si esta ocupado no me deje instanciar el edificio.todavía esta primitivo, lo iré puliendo y agregando características. es esta la manera correcta de hacer un grid? o mas eficiente? además de poderla adaptar a un terreno un poco mas complejo? (este es plano por razones forzosas xd).

Etiquetas: