Noticias

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

comprobar 2 tags a la vez

Iniciado por Abramelin, Septiembre 21, 2016, 09:52:58 PM

Tema anterior - Siguiente tema
estoy haciendo un comprobador-trigger que chequee si 2 objetos (tags distintos) estan dentro. Tengo esto pero no me funciona, con un tag solo va perfecto, pero no se como hacerlo con los 2 tags a la vez.
 

var obj : GameObject;
function OnTriggerStay(other:Collider){
if (other.gameObject.tag == "polopositivo"){
if (other.gameObject.tag == "polonegativo"){
obj.SetActive(true);
}
}
}

 
¿como seria para añadir los 2  tags a la vez?

Añadelos a una lista (objecto), y comprueba todos los respectivos tag al ingresar, y quitalos al salir (objecto), asi sabras si estan tales objectos dentro del collider.

Busca OnTriggerEnter, OnTriggerStay, y List.

he hecho esto, no se si era a lo que te referias, tampoco he conseguido que funcione
 

var objetoact : GameObject;
public var objectos1 : GameObject[];
public var objectos2 : GameObject[];

function OnTriggerStay (other:Collider){   
if (other.gameObject == objectos1){
if (other.gameObject == objectos2){
objetoact.SetActive(true);
}
}
}
function OnTriggerExit (other:Collider){   
if (other.gameObject == objectos1){
objetoact.SetActive(false);
}
if (other.gameObject == objectos2){
objetoact.SetActive(false);
}
}
function Update (){
objectos1 = GameObject.FindGameObjectsWithTag("polopositivo");
objectos2 = GameObject.FindGameObjectsWithTag("polonegativo");
}

 
 

A ver si he entendido bien lo que quieres preguntar, si no corrígeme. Tu quieres detectar cuando dos objetos (polopositivo y polonegativo) colisionan con otro objeto (el que contiene el script), el objeto como es normal no puede ser a la vez polopositivo y polonegativo. Por lo que pones en el segundo post  entiendo que quieres que la acción (en este caso que se active un tercer objeto) se realiza cuando están los dos objetos colisionando, de la forma que lo estas haciendo es imposible que funcione, cuando se llama OnTriggerStay el objeto que contiene el collider "other" va a ser polopositivo o polonegativo nunca los dos a la vez, por eso entrara como mucho en uno de los if. Para ello tendrás que utilizar dos variables booleanas globales a la clase. Te pongo el código, si tengo alguna errata perdonar pero no suelo programar con JavaScript:
 

var isEnterPositivo = false;
var isEnterNegativo = false;
var objetoact : GameObject;
function OnTriggerEnter(other:Collider)
{
if (other.gameObject.tag == "polopositivo")
    {
   isEnterPositivo = true;
    }
else if (other.gameObject.tag == "polonegativo")
    {
   isEnterNegativo = true;
    }
if(isEnterNegativo && isEnterPositivo)
{
   obj.SetActive(true);
    }
}
function OnTriggerExit (other:Collider)
{
if (other.gameObject.tag == "polopositivo")
    {
   isEnterPositivo = false;
   objetoact.SetActive(false);
    }
else if (other.gameObject.tag == "polonegativo")
    {
   isEnterNegativo = true;
   objetoact.SetActive(false);
    }
}

 
 
 
Un pequeño apunte, cuando utilices FindGameObjectsWithTag, no lo pongas en el update en términos de eficiencia es mejor ponerlo en el evento start.

Septiembre 22, 2016, 12:17:35 AM #4 Ultima modificación: Septiembre 22, 2016, 12:59:16 AM por Abramelin
Si, es eso exactamente. En parte parece que el problema esta corregido, digo en parte porque hay algo que no funciona como esperaba, ya no se si es problema de la forma de organizar los triggers o de otra cosa. lo he marcado con un circulo naranja.
 
Los triggers que llevan lo scripts son iguales (misma posicion y dimensiones) a las rayas amarillas pero con el mesh renderer desactivado, las rayas amarillas son el objetoact de cada trigger con el script y se activan cuando ambos colliders estan dentro, y los colliders con tags polopositivo y polonegativo son los cuadritos azules y rojos. Para girarlos 90º e intercambiar las ruedas uso otro script pero con ese no hay problema.
 
No se donde estara ahora el fallo, voy a seguir indagando. Tendre en cuenta de no usar FindGameObjectsWithTag en update, gracias por la aclaracion.
 

 
 
 
*Edito: ya esta corregido el ultimo
 

isEnterNegativo = true;

 
lo he cambiado a false, con OnTriggerEnter no va bien no se porque, lo he cambiado a OnTriggerStay y ya va fino, asi que muchas gracias :)

Para utilizar los eventos de físicas necesitas que alguno de los GameObjects tenga un Rigidbody.
 
Y tener un Rigidbody en un GameObject estático, no creo que sea la mejor solución.
 
Existen alternativas a los eventos del motor de físicas de Unity, con las funciones Overlap de la clase Physics, que no necesitan un Rigidbody, e incluso tampoco necesitan un collider Trigger, tan solo basta con que le pases los datos del área.
 
En este caso he utilizado un BoxCollider en la escena para simplificar el código:
 

using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
    public BoxCollider boxCollider;
    public LayerMask layerMask;

void Update () {
        Collider[] colliders = Physics.OverlapBox(this.boxCollider.center, this.boxCollider.bounds.extents, this.transform.rotation, this.layerMask);
        if (ExisteTag("Player", colliders) && ExisteTag("Finish", colliders))
        {
            Debug.Log("Player y Finish encontrados");
        }

}
    bool ExisteTag(string tag, Collider[] colliders)
    {
        foreach(Collider collider in colliders)
        {
            if (collider.tag.Equals(tag))
            {
                return true;
            }
        }
        return false;
    }
}

 
 

Todos los colliders polopositivo y polonegativo llevan su riggidbody, solo entran en colision con los triggers que llevan el script, los demas objetos del puzzle no llevan colliders. Lo tendre en cuenta para otra ocasión y asi voy practicando nuevas formas, en este caso funciona bastante bien asi como esta.

Etiquetas: