Jump to content
UnitySpain

lightbug

Registrados
  • Content count

    2,192
  • Joined

  • Last visited

  • Days Won

    170

lightbug last won the day on May 23

lightbug had the most liked content!

Community Reputation

691 Excellent

About lightbug

  • Rank
    Leyenda

Profile Information

  • Especialidad
    Coder

Recent Profile Visitors

2,131 profile views
  1. lightbug

    Acceder a componentes mediante if. C#.

    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 , 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: 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) No se cumple la condición del if (probablemente sea esta). Osea que volviste al punto inicial , 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!
  2. lightbug

    colisionar y baje valor de un slider constantemente

    La acción sería que baje de 1 en 1, pero de 1 en 1 no nos dice absolutamente nada, que es de 1 en 1, 60 veces por segundo? 200 veces por segundo? cada 1 segundo ? ... como te dice leocub con un "stay" podrías verificar una y otra vez, pero eso sí, va a bajar horriblemente rápido si no hacés algo al respecto, por ejemplo con un simple flag podés hacer algo así, con una corrutina: public float duracion = 1f; Coroutine perderVidaCoroutine; void OnCollisionStay( Collision col ) { if( personajeDisponible ) perderVidaCoroutine = StartCoroutine( PerderVida() ); } IEnumerator PerderVida() { vida--; personajeDisponible = false; //con esto no re-disparás la corrutina una y otra vez yield return new WaitForSeconds( duracion ); //termina en 1 segundo por defecto personajeDisponible = true; } Creo que podés ver si X corrutina se está reproduciendo, eso en este caso sería ideal, nunca lo usé.
  3. lightbug

    Problema de interaccion entre dos objetos

    No es tan sencillo de hacer, por lo menos a lo primero, yo lo veo así: Cuadro 1: BOLA: Movimiento Normal de la bola Situación: cayó sobre la plataforma (suelo = true) Registras los datos de la plataforma, transform sobretodo, con esto vas a poder sacar dos datos importantes en el cuadro que sigue (y en los que le siguen a este)-> diferencias de posiciones y diferencias de quaternions (ángulos!!) ... no te preocupes por la posición si querés, ignorala cada vez que la mencione. Calculas distancia desde bola hasta centro de la plataforma y la guardás. Yo siempre le pongo "deltaReference", es mi convención. Cuadro 2: PLATAFORMA: Se mueve y rota ponele, hace lo suyo BOLA: La plataforma ya se movió y rotó, ahora recalculas los datos anteriores (nueva posicion de esta y nuevo quaternion de esta ) Hacés la diferencia entre los datos de este cuadro y los datos anteriores -> tenés dif de pos y dif de ángulos Aplicás la dif de ángulos a "deltaReference", esto te da donde debería estar la bola con el efecto de rotación de la plataforma Aplicás la dif de posición a "deltaReference", esto te da donde debería estar la bola con el efecto de posición + rotación de la plataforma A todo esto todavía el movimiento normal de la bola no se aplicó, acá es donde seguís haciendo lo de siempre, el movimiento "Normal", (AddForce o MovePosition o Translate o lo que sea) Finalmente Actualizas/Pisás todos los datos anteriores, pos de plataforma, quaternion de plataforma, distancia bola-plataforma, esto es para reutilizarlos en el siguiente cuadro, los datos que en este cuadro eran "actuales" pasan a ser "previos", se van pasando la posta. Lo expliqué muy por arriba pero en general las famosas Moving/Rotating platforms funcionan algo así, si le querés dar toques vas a tener que meter algún que otro paso intermedio, como por ej que la orientación respecto al centro sea la misma (idéntico a enparentar) o que se mantenga la orientación con la que contactas con la bola, etc.
  4. lightbug

    Acceder a componentes mediante if. C#.

    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 , 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 ... Saludos
  5. lightbug

    Problema de interaccion entre dos objetos

    no pasa nada, vos primero registrás/aplicás el movimiento provocado por la plataforma, luego aplicás el movimiento propio del personaje. Saludos
  6. lightbug

    Problema de interaccion entre dos objetos

    Me pa que no ... pero podés hacer dos cosas: Medís el punto A (donde el pasajero estaba) y el punto B (donde el pasajero estaría, rotando ese vector con lo que rota la plataforma), finalmente podés usar MovePosition para trasladar al pasajero directametne al Punto B, esto te dá bastante precisión (por bastante me refiero al 100%). Esto no te permite hacer uso de la fricción peso etc. Aplicarle lo medido en 1, Usar ese delta (A->B) en forma de velocidad lineal/fuerza al pasajero (like ReAlLifE). 1) es exactamente lo que hago en un asset mio con las plataformas giratorias, no es 3D ni es la misma situación, es 2D (x e y), pero el principio es exactamente el mismo.
  7. lightbug

    Ayuda, select to move

    Hola, sí, es totalmente posible, aunque para eso no necesitas un objeto por planeta orbitando, con algebra vectorial lo podés lograr. Osea, si conocés la posición de todos los planetas (con tenerlos referenciados alcanza) podés crear un vector centro-órbita y de ahí rotar dicho vector. Podrías hacer (espero que funcione): //supongo que cada planeta tiene uno de estos [SerializeField] float orbitDistance = 10f; Vector3 targetOrbitPoint; //quien controle a la nave puede pedir este valor, no modifcarlo, es un getter public Vector3 TargetOrbitPoint{ get{ return targetOrbitPoint; } } Vector3 centerToOrbit; void Start() { centerToOrbit = Vector3.right * orbitDistance (por ej, a la derecha alejado lo que le pongas) } void Update() { //Para rotar un vector se hace lo siguiente (algebra matricial pura) //angle es tu angulo final, por ej con angular speed, en tu ejemplo sería = 360.0f / (timeAround / factor) angle = angularSpeed * Time.deltaTime; Quaternion rotation = Quaternion.AngleAxis( angle , Vector3.forward ); //le puse forward pero ponele el eje que quieras //rotás el vector centerToOrbit = rotation * centerToOrbit; // actualizar el dato de interés targetOrbitPoint = transform.position + centerToOrbit; //Para debuguear <--- Debug.DrawRay( transform.position , centerToOrbit , Color.Magenta ); } a lo que subiste lo toqué un poco, no arreglé ni vi mucho, solamente cambié que algunas variables se llamaban "___Pos" cuando eran GameObjects (difícil de leer, sobretodo si tenés cosas como "camPos.transform.position") y ese GetComponent<Camera> lo podés catchear antes, por lo menos para este caso, no es que haga mucho pero igual. public class controler : MonoBehaviour { public Camera cam; //<---MOD public Transform camTransform; //<---MOD public Transform camPos;//empty object associated with the camera to track public GameObject targetTransform; //por qué se llamaba "Pos" si era un GameObject? public GameObject eyeTransform; //IDem anterior public GameObject ostaculeTransform;//IDem anterior //Seguramente uses mucho más el transform que el gameObject, por eso son transforms Vector3 newpos; bool moving; void start() { moving = false; cam = camTransform.GetComponent<Camera>(); } void update() { if (Input.GetMouseButtonDown(0)) { RaycastHit hitplanet; RaycastHit hitsun; Ray ray = cam.ScreenPointToRay(Input.mousePosition); //<---MOD if (Physics.Raycast(ray, out hitplanet)) { if (hitplanet.collider.CompareTag("planetas")) { newpos = hitplanet.point; targetTransform.position = newpos; camTransform.SetParent(null); transform.LookAt(new Vector3(newpos.x, transform.position.y, newpos.z)); camTransform.SetParent(transform); if (Physics.Raycast(eyeTransform.position, newpos - eyeTransform.position, out hitsun, Vector3.Distance(transform.position, newpos))) { if (hitsun.collider.CompareTag("sol")) { ostaculeTransform.position = hitsun.point; Debug.Log("Sun in the middle of the path"); } else { moving = true; } } else { moving = true; } } } } if (moving == true) { transform.Translate(new Vector3(0, 0, 100f)); if (Vector3.Distance(transform.position, newpos) < 50f) { moving = false; } } camTransform.position = Vector3.Lerp(camTransform.position, camTransform.position,0.1f); } } Saludos
  8. lightbug

    Problema con mi Órbita Camera

    Jajaj que guacho.
  9. lightbug

    Problema con mi Órbita Camera

    Hombre era una broma asociada al fiasco televisivo más grande de la historia ;). Un consejo, si decidís no volver más asegurate de igual postear el código, sea el sitio que sea, generalmente ayuda. Un saludo.
  10. lightbug

    Problema con mi Órbita Camera

    La ultima temporada de Game Of Thrones tiene más "script" que tu post...
  11. lightbug

    Me falla este script y no sé por qué

    no creo que en este caso en particular le resulte considerablemente más fluido ya que tiene un GetKeyDown y FixedUpdate para los "Get___Down" es bastante fiero a la hora de "detectar" las inputs directamente (a no ser de ir acumulando los flags como debe de ser), pero es cierto en una cosa, cualquier cosa relacionada con físicas de rigidbodies dinámicos debe ir en FixedUpdate. Algo así sería lo indicado: Rigidbody rb; bool inputFlag = false; void Awake() { rb = GetComponent<Rigidbody>(); } void Update() { inputFlag |= Input.GetKeyDown(...) ; ... } void FixedUpdate() { if(inputFlag) //podrías o no hacerlo, con esto te evitás de hacer el AddForce si rb es null rb.AddForce(Vector3.up*200); inputFlag = false; ... }
  12. lightbug

    problemas con unity

    Creo que esa oración lo deja bien en claro. ¿Qué errores estás teniendo?
  13. lightbug

    Me falla este script y no sé por qué

    Postea todos los errores, fijate en la consola, si se repiten varias veces usá la opcion "Collapse", aunque seguramente sea lo que dice pioj con las NullReference. 1) -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Si no encuentra el Collider te da NullReference, además hacer esto es horrible para el mundo del update, aplicá algo así: CapsuleCollider capsuleCollider; void Awake() { capsuleCollider = GetComponent <CapsuleCollider>(); } void Update() { //no es necesario usar "this", salvo que tengas otra variable local con el mismo nombre "transform", hacelo como quieras Vector3 physicsCentre = transform.position + capsuleCollider.center; ... } 2) -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Para los tags comparalos directamente por el valor, no recuerdo si el operador == lo hace, por las dudas siempre use CompareTag o si fuera una strings podés usar string.Equals( srtA , strB ); if( !m.Golpe.transform.gameObject.CompareTag( "Player" ) ) //Se mete si el tag no es "Player" 3) -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Lo mismo que en 1) Rigidbody rb; void Awake() { rb = GetComponent<Rigidbody>(); } void Update() { if(rb != null) //podrías o no hacerlo, con esto te evitás de hacer el AddForce si rb es null rb.AddForce(Vector3.up*200); ... }
  14. lightbug

    MovePosition/Rotation con AddForce

    Ah eso dalo por hecho, el movePosition toca directamente la posición del objeto, pero es ajeno (estoy casi seguro) de la parte de simulación (Fuerzas/velocidades), si querés que siga vas a tener que aplicar el ultimo movimiento realizado por el tanque al vector de fuerza/velocidad del misil, por ejemplo: // este es el "deltaPosition" Vector3 vectorMovimientoVertical = transform.forward * mV * velMov * Time.deltaTime; controlRB.MovePosition(transform.position + vectorMovimientoVertical); Quaternion quaternionHorizontal; quaternionHorizontal = Quaternion.Euler (new Vector3 (0, mH * velRot * Time.deltaTime, 0)); controlRB.MoveRotation(transform.rotation * quaternionHorizontal); Rigidbody disparo; disparo = Instantiate (Proyectil, transformInicioProyectil.position, transformInicioProyectil.rotation); // "factor" es algun valor que te guste y quede bien Vector3 misilForce = ransformInicioProyectil.forward * potenciaProyectil + factor * vectorMovimientoVertical; disparo.AddForce ( misilForce , ForceMode.Impulse );
  15. lightbug

    MovePosition/Rotation con AddForce

    perdon por la ignorancia pero que significa que el AddForce no "tiene en cuenta" el MovePosition y MoveRotation? osea que vos te movés con el tanque, disparás y el misil hace cualquiera? o sale disparado de cualquier posición? Esto puede ser así? (nunca lo usé así): Rigidbody disparo; disparo = Instantiate (Proyectil, transformInicioProyectil.position, transformInicioProyectil.rotation); Osea el razonamiento está bien, lo único que sirve del transform son los datos (pos y rot), vos tendrías que instanciar el prefab, óbtener su RB y darle la fuerza (asegurate que el RB sea dinámico).
×