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 51,34€ de 150,00€

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

Acceder a componentes mediante if. C#.

Recommended Posts

Hola a todos, tengo una duda

Me gustaría hacer una cosa: cuando un objeto llegue hasta una posicion que suceda algo.

Lo he intentado hacer pero tengo error de sintaxis en la siguiente línea:

if (evento.position = new Vector3(-114.15f, 2.04f, -95.61f))


   

 private Transform evento;
     void objeto()
        {
            
            evento = GetComponent<Transform>();
            
            if (evento.position = new Vector3(-114.15f, 2.04f, -95.61f))
            {
                Debug.Log("Evento");
            }
        }

Muchas Gracias.

Share this post


Link to post
Share on other sites

Hola, algunas cositas:

  • Estás usando = en vez de == (no se si es así en tu código o pasa acá)  -->  Usar == para float's no es recomendable usá Mathf.Approximately  ---> Aun así verificar igualdad no queda lindo en este caso (aclaro que no se como es que el objeto se mueve), la matemática de punto flotante tiene errores, que un objeto se mueva libremente, tenga la posición <x,y,z> y que vos termines por verificar eso en un if y sea correcto es muy poco pobrable, ah no ser que antes hayas impuesto que ese valor sea <x,y,z> en un momento dado, cosa que no se si estás haciendo.
  • No es necesario hacer GetComponent<Transform>() para eso existe ".transform" que es mucho mejor en terminos de performance.
  • Te recomendaría no usar valores tan crudos en el código (si fue de prueba vaya y pase), usá más bien un "public Vector3 miValor;" y elegilo vos en el inspector. Ver cosas como -114.15f, 2.04f, -95.61f puede no ser tan descabellado en 5 líneas de código, probá tener 50 de estos datos crudos todos diferentes y distribuidos en 2000 líneas de código :63_astonished:, y ni hablemos si algun día alguien tiene que leer eso, colega o alguien de algún foro.
  • Te recomendaría usar nombres intuitivos, "objeto" es un método? porque por el nombre parecería que fuera un objeto o instancia de algo.

Osea, si querés verificar la posición asegurate que el objeto que vas a mover llegue a la posición (no más o menos, sino que lo haga --> =), para esto podés usar vector3.MoveTowards o verificar si está cerca de la posición con Vector3.Distance (la cercanía la elegís vos).

Está muy bien que lo hiciste con un Debug.Log, muchos a lo primero se tiran 500 líneas de código en vez de hacer un simple print ... :91_thumbsup:

Saludos

 

Share this post


Link to post
Share on other sites

Muchas gracias por la respuesta.

Esto era solamente de prueba, ya que tuve curiosidad (asi que al no ser un proyecto real no tuve cuidado con el orden). Llegué a la conclusión de que es mejor usar los colliders si quiero que al llegar a un sitio pase algo. Lo que he estado haciendo con el anterior código (el que escribi en el foro) es poner manualmente en Unity los valores x, y, z que especifico en el script.

Pero ahora probé otra vez hacerlo con if (evento.transform.position == new Vector3(-114.15f, 2.04f, -95.61f)) especificando otra vez los valores manualmente en Unity y en teoría siempre se cumple la condición pero no imprime el mensaje por la consola, dejo otra vez el código por aquí


 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{

    private Transform evento;

    // Use this for initialization.

    void Start()
    {
        objeto();

    }

    // Update is called once per frame
    void Update()
    {

    }

    void objeto()
    {
        evento = GetComponent<Transform>();


        if (evento.transform.position == new Vector3(-114.15f, 2.04f, -95.61f))
        {
            Debug.Log("Evento");
        }
    }

}


 

Share this post


Link to post
Share on other sites
58 minutes ago, samorente said:

y en teoría siempre se cumple la condición pero no imprime el mensaje por la consola,

Y como es que sabés que "en teoría" funciona si no te sale nada en consola (en realidad en teoría es poco probable que se cumpla). Yo tenía un amigo que cada vez que poniamos un break en código él quería hacer una variable para comprobar que en realidad X cosa pasara porque por alguna razón u otra sospecha que el lenguaje de programación lo podía estar traicionando :8_laughing:, como que era algo maleable y dependía del clima... aca pasa algo similar pero con el Debug.Log, el lenguaje es así y si no ves lo que imprime en memoria pasa una de las dos:

  1. No tenés habilitado la impresión o el log de mensajes (que ojo! puede ser, me ha pasado), lo habilitas con el boton dentro de la consola (al lado de los errores)
  2. No se  cumple la condición del if (probablemente sea esta).
1 hour ago, samorente said:

Pero ahora probé otra vez hacerlo con if (evento.transform.position == new Vector3(-114.15f, 2.04f, -95.61f)) especificando otra vez los valores manualmente en Unity

Osea que volviste al punto inicial :43_slight_frown:, Lee de vuelta esto:

Estás usando = en vez de == (no se si es así en tu código o pasa acá)  -->  Usar == para float's no es recomendable usá Mathf.Approximately  ---> Aun así verificar igualdad no queda lindo en este caso (aclaro que no se como es que el objeto se mueve), la matemática de punto flotante tiene errores, que un objeto se mueva libremente, tenga la posición <x,y,z> y que vos termines por verificar eso en un if y sea correcto es muy poco pobrable, ah no ser que antes hayas impuesto que ese valor sea <x,y,z> en un momento dado, cosa que no se si estás haciendo.

Osea, si querés verificar la posición asegurate que el objeto que vas a mover llegue a la posición (no más o menos, sino que lo haga --> =), para esto podés usar vector3.MoveTowards o verificar si está cerca de la posición con Vector3.Distance (la cercanía la elegís vos).

---> Un error que tuve anteriormente, puse que uses Mathf.Aproximately, para floats está bien, pero para vectores el mismo operador "==" hace uso de esto! (Vector3.Equals no lo hace)... ups!

https://docs.unity3d.com/ScriptReference/Vector3-operator_eq.html

 

No cometas el típico error de la soberbia de programación, lo digo porque es extremadamente común si arrancás a programar pensar de la siguiente manera "No importa lo que haga, esto tiene que andar y si no anda el problema no es lo que yo hice, el problema tiene que ser esto otro (Debug.Log en tu caso)". Trata de evitar esos valores super exactos de posición que nunca se van a dar, probá métodos como Vector3.distance, incluso si  desde afuera del script especificas la posición exacta para el objeto en cuestión "Vector3(-114.15f, 2.04f, -95.61f)" intenta reemplazar eso por un transform que haga de posicion objetivo (por supuesto asegurandote que al final al objeto lo movés a esa posición objetivo), el if te quedaría así:

if (evento.transform.position == objetivo.transform.position )
        {
            Debug.Log("Evento");
        }

 

Saludos!

Share this post


Link to post
Share on other sites
On 5/23/2019 at 4:34 PM, lightbug said:

Y como es que sabés que "en teoría" funciona si no te sale nada en consola (en realidad en teoría es poco probable que se cumpla). Yo tenía un amigo que cada vez que poniamos un break en código él quería hacer una variable para comprobar que en realidad X cosa pasara porque por alguna razón u otra sospecha que el lenguaje de programación lo podía estar traicionando :8_laughing:, como que era algo maleable y dependía del clima... aca pasa algo similar pero con el Debug.Log, el lenguaje es así y si no ves lo que imprime en memoria pasa una de las dos:

  1. No tenés habilitado la impresión o el log de mensajes (que ojo! puede ser, me ha pasado), lo habilitas con el boton dentro de la consola (al lado de los errores)
  2. No se  cumple la condición del if (probablemente sea esta).

Osea que volviste al punto inicial :43_slight_frown:, Lee de vuelta esto:

Estás usando = en vez de == (no se si es así en tu código o pasa acá)  -->  Usar == para float's no es recomendable usá Mathf.Approximately  ---> Aun así verificar igualdad no queda lindo en este caso (aclaro que no se como es que el objeto se mueve), la matemática de punto flotante tiene errores, que un objeto se mueva libremente, tenga la posición <x,y,z> y que vos termines por verificar eso en un if y sea correcto es muy poco pobrable, ah no ser que antes hayas impuesto que ese valor sea <x,y,z> en un momento dado, cosa que no se si estás haciendo.

Osea, si querés verificar la posición asegurate que el objeto que vas a mover llegue a la posición (no más o menos, sino que lo haga --> =), para esto podés usar vector3.MoveTowards o verificar si está cerca de la posición con Vector3.Distance (la cercanía la elegís vos).

---> Un error que tuve anteriormente, puse que uses Mathf.Aproximately, para floats está bien, pero para vectores el mismo operador "==" hace uso de esto! (Vector3.Equals no lo hace)... ups!

https://docs.unity3d.com/ScriptReference/Vector3-operator_eq.html

 

No cometas el típico error de la soberbia de programación, lo digo porque es extremadamente común si arrancás a programar pensar de la siguiente manera "No importa lo que haga, esto tiene que andar y si no anda el problema no es lo que yo hice, el problema tiene que ser esto otro (Debug.Log en tu caso)". Trata de evitar esos valores super exactos de posición que nunca se van a dar, probá métodos como Vector3.distance, incluso si  desde afuera del script especificas la posición exacta para el objeto en cuestión "Vector3(-114.15f, 2.04f, -95.61f)" intenta reemplazar eso por un transform que haga de posicion objetivo (por supuesto asegurandote que al final al objeto lo movés a esa posición objetivo), el if te quedaría así:


if (evento.transform.position == objetivo.transform.position )
        {
            Debug.Log("Evento");
        }

 

Saludos!

Hola perdón por la espera xD, ya lo solucioné para que se cumpliera la condición si o si lo que hice fué establecer la posición del objeto con anterioridad. 

Pero gracias de todas formas ahora entiendo que si quiero que pase algo (por ejemplo: si el personaje llega a un sitio que salte una cinemática) es mejor seleccionar un rango que poner medidas exactas, lo que no se si es mejor hacerlo como me dijistes con vector3.Distance o que si el personaje entra en contacto con un collider que salte la cinemática.

Share this post


Link to post
Share on other sites
3 hours ago, samorente said:

lo que no se si es mejor hacerlo como me dijistes con vector3.Distance o que si el personaje entra en contacto con un collider que salte la cinemática.

Depende la situación, sobretodo del diseño del escenario, si buscás que se dispare cuando el personaje va a un punto en concreto (detección de forma esférica) la distancia va bien (además el calculo es mucho más sencillo), ahora si querés que el personaje llegue a una "zona" (de cualquier forma) el trigger queda mejor.

Saludos

Share this post


Link to post
Share on other sites

×