Noticias

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

Enemigos que cruzan paredes...

Iniciado por ramunda, Julio 24, 2015, 10:41:24 PM

Tema anterior - Siguiente tema
Hola muy buenas , tengo una duda y no encuentro la solución , tengo una serie de enemigos, varios en general todos tienen sphere collither para que las balas los maten , no estan en trigguer, tienen rigidbody, y todo ok . Pero por ejemplo edificios con un mesh collither , lo cruzan cuando vienen a mi a atacarme o ***guirme etc.alguna solución para que no crucen los mesh?, mi personaje no los cruza ellos si.... Gracias  

Julio 25, 2015, 02:02:03 AM #1 Ultima modificación: Enero 01, 1970, 01:00:00 AM por Antonio
¿Con qué función los estás moviendo? (Si estás usando Transform.translate, esa función no calcula físicas por lo que puede hacer que los colliders se traspasen).

Si es eso, prueba otra función como el Move del Character Controller ( http://docs.unity3d.com/ScriptReference/CharacterController.Move.html ) o al AddForce del rigidbody ( http://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html ). Ambas permiten mover objetos que se detienen al chocar con otro collider, usa la que más te guste.

Si tu enemigo funciona con sistemas de navegacion, (NavMesh), tienes que aplicar un NavMesh a los objetos de tu escena, como al terreno y las paredes que no quieres que sean atravesables, en este caso deberias aplicar el navmesh a las paredes y seleccionando la opcion "no walkable", de esa forma tus enemigos detectaran los objetos que no son caminables y los evadiran, yo te lo digo por que tenia exactamente el mismo problema con mis enemigos.

Hay una norma básica en la que todos caemos alguna vez. Para que pueda efectuarse una colisión al menos 1 de los dos objetos tiene que ser un cuerpo rígido, aunque ambos tengan colider no haran colisión si no se cumple esta norma.

Compañeros antes que nada gracias por las respuestas.Empezare por @Adngel , este es el script que los muevo:
using UnityEngine;
using System.Collections;
public class skellyattack13 : MonoBehaviour {
   public GameObject player;
   public GameObject skelly6;
   public float distance;
   public PlayerInfo character;
   
   // Use this for initialization
   void Start () {
   }
   
   // Update is called once per frame
   void Update () {
      
   player = GameObject.FindWithTag("jugador");
   skelly6 = gameObject;
   distance = Vector3.Distance(player.transform.position,skelly6.transform.position);
      
      if (distance <= 4) {
      skelly6.GetComponent<Animation>().CrossFadeQueued("Walk", 0.3f, QueueMode.PlayNow);
      skelly6.GetComponent<Animation>().CrossFade("Attack");
      character.ApplyDamage(1);
      character.playerInCombat(1);
      }
      else if (distance < 50 && distance > 4.0f) {
      ///GetComponent<FollowPath>().enabled = false;
      skelly6.GetComponent<Animation>().CrossFadeQueued("Attack", 0.3f, QueueMode.PlayNow);
      skelly6.GetComponent<Animation>().CrossFade("Walk");
      skelly6.transform.LookAt(player.transform.position);
         transform.position = Vector3.MoveTowards(transform.position, player.transform.position, 0.30f);
         //character.playerInCombat(1);
         
      }   
      else
      {
      skelly6.GetComponent<Animation>().CrossFadeQueued("Walk", 0.3f, QueueMode.PlayNow);
      skelly6.GetComponent<Animation>().CrossFade("Idle");
      ///GetComponent<FollowPath>().enabled = true;
      character.playerInCombat(1);
      }
   }
   
   
}
@DanielVZ , no no funcionan con nav mesh.@Howling Wolf , efectivamente estoy con tigo , todos los enemigos tienen un rigid body puesto pero siguen cruzando los muros.Alguna idea? 
Adngel, me suena a misa lo que he visto en los links que me has mandado...alguna forma de no cargarme todo el curro echo ? en el script que he puesto ? es facil la alteración? sino me muero tengo 35 esqueletos como ese....arf  

Julio 25, 2015, 11:51:43 PM #5 Ultima modificación: Julio 25, 2015, 11:53:11 PM por Howling Wolf
Te recomiendo que trabajes con navmesh, así no tendrás tantos problemas, te lo digo por experiencia.

Julio 25, 2015, 11:53:43 PM #6 Ultima modificación: Julio 25, 2015, 11:59:33 PM por Antonio
Los códigos se pueden crear o copiar, pero siempre es importante leerlos y saber lo que se tiene, así se va aprendiendo cómo funcionan las cosas y sobretodo, sabrás cómo o por donde meterle mano cuando quieras cambiar o arreglar alguna parte. Un juego puede tener muchísimos scripts para su varios sistemas, pero como siempre, mientras menos "cajas negras", mejor.

En este caso, el script que has colgado es una IA simple para un enemigo. A primer paso, tienes 3 áreas.

Variables
Las variables son públicas, básicamente lo que estás haciendo ahí es cogiendo cosas que hay fuera del código (el jugador, una distancia, el modelo del enemigo, etc..)
Función Start
Esta función está vacía, de modo que no hace nada de momento, (podrías borrarla y no notar ninguna diferencia, no obstante, creo que vendría bien mantenerla un momento).
Función update
Aquí es donde se está cociendo todo el meollo, recuerda que el contenido de la función update, son instrucciones que se repiten en cada ciclo (por ejemplo, imagínate que cada ciclo es 1 frame, y tu juego va a 60 frames por segundo, pues la función update se repetiría 60 veces por segundo).

Ahora vamos a mirar más detenidamente esa función Update.
- Lo primero que hace, es llenar las variables automáticamente.
  1. En el caso de player, al empezar el juego se busca al objeto del jugador (el que usa el tag "jugador", para ponerlo en dicha variable.
  2. En el caso de skelly, le dice que pongan el mismo objeto donde se está ejecutando el código, es decir, si le has puesto el código al "fantasma 23" que hay en tu escena, pues en esta variable se pondrá dicho "fantasma 23". (Nosequé = gameobject; podría ser "fulanito.gameobject", "zutanito.gameobject", pero no, es gamebject a secas, así que se refiere a sí mismo).
Así que bien, se llenan las variables, pero hay un par de detalles aquí:
  • 1º, si se llena automáticamente, realmente no hace falta que la veamos en el Inspector, por lo que el "public" podría omitirse.
  • 2º, Estas línea estarán repitiéndose constantemente durante el juego, pero ¿es necesario?, el player seguirá siendo el mismo objeto en este frame, que en los siguientes, y lo mismo para el Skelly, ("Skelly = yo", va a ser "Skelly = yo" ahora y después)  por eso, hacer la búsqueda constante de un objeto ya encontrado pues es algo redundante, (en una versión de PC no deberías tener problemas al hacerlo, pero no lo veo óptimo) por lo que mi consejo, es que pongas esas 2 líneas en la función Start, donde se ejecutará una vez, en su primer ciclo, y listo. (Las variables una vez modificadas, se mantienen durante los demás ciclos, por lo que una vez le ha dicho a player que el jugador es tal objeto, eso se va a quedar así hasta quites el juego o el objeto se pierda por otro motivo).

- Después de llenar las variables, calcula la distancia entre el jugador y el enemigo que estamos trabajando. Esto es importante por que en base a la distancia, puede tomar los distintos comportamientos:
  1. Si la distancia es menor o igual a 4, el enemigo ataca.  (Trabajando funciones propias y ajustando las animaciones)
  2. Si la distancia es mayor que 4 y menor que 50, el enemigo mira al jugador y se mueve hacia él. (Ajusta animaciones, Hace que el fantasma mire al jugador y lo mueve acercando los puntos espaciales de las posiciones.
  3. Si la distancia es mayor que 50, el enemigo se queda quieto. (Ajusta las animaciones y llama esa función propia)
Aquí si es importante que hagamos esto en la función update, si lo miras, en cada frame, el jugador puede estar en un sitio distinto, por lo que su distancia varía, por eso la calculamos constantemente.Y con eso termina tu código.

/--------------------------------------/

Ahora, sabiendo lo que tienes en tú código, verás que para encontrar el movimiento del fantasma, tienes que mirar en la función Update, en su 2º caso. El problema de que ignore las colisiones, está como dije, en la manera en que estás aplicando el movimiento. 
transform.position = Vector3.MoveTowards(transform.position, player.transform.position, 0.30f);
Esta línea, transform position, efectivamente es la posición del objeto, y moviéndola pues estás arrastrando el objeto, pero esto así, es algo tosco, (es obligar al objeto a ir a tal posición, sin importar lo que haya ni con quien se choque). Para mover este objeto, habrá que usar otras maneras que sí calculen las colisiones.

Por ejemplo, ya que el fantasma tiene puesto el componente rigidbody, vamos a mirar lo que tiene la clase: http://docs.unity3d.com/ScriptReference/Rigidbody.html">http://docs.unity3d.com/ScriptReference/Rigidbody.html
Ahí, vemos que una de sus funciones se llama MovePosition, creo que te será más útil que el AddForce porque es una más parecida a lo que ya tienes.

Echando un vistanzo al ejemplo:
 
using UnityEngine;
using System.Collections;

public class ExampleClass : http://docs.unity3d.com/ScriptReference/MonoBehaviour.html">MonoBehaviour {
    public http://docs.unity3d.com/ScriptReference/Vector3.html">Vector3 teleportPoint;
    public http://docs.unity3d.com/ScriptReference/Rigidbody.html">Rigidbody rb;
    void Start() {
        rb = GetComponent<Rigidbody>();
    }
    void FixedUpdate() {
        rb.MovePosition(transform.position + transform.forward * http://docs.unity3d.com/ScriptReference/Time-deltaTime.html">Time.deltaTime);
    }
}
Ahí hay nuevamente 2 partes.
- Creación de variables
- Función Start (que sólo se ejectuaba 1 vez al principio)
- Función FixedUpdated (una variable de la función Update)Ya estarás viendo las similitudes con tu código. Así que puedes mirar como implementarlo. Aqui, la función MovePosition (que está en el FixedUpdate) es la que nos interesa.

Para usarla, necesita tener acceso a un componente rigidbody, por eso es rb.Moveposition... ¿Qué es ese rb?, pues no es más que otra variable de tipo Rigidbody creada al principio, e inicializada en la función Start con el GetComponent. (GetComponent <Rigidbody> () ; a secas, no "Fulanito.GetComponent..." ni "Zutanito.GetComponent..." así que significa que cogerá el componente que ya tiene el propio objeto).

Una vez tengas eso, el resto de la línea, es igual para tu programa. (Como el fantasma, mira hacia el jugado, al moverlo hacia delante (forward), lo estamos moviendo hacia el jugador. Puestos a cambiar algo, quizás sea la velocidad, puedes hacerlo fácilmente multiplicando lo que hay entre paréntesis, por algún número, (si lo multiplicas por 2, pues irá el doble de rápido...).

Y bueno, una vez puesta esa línea, puedes borrar o comentar la antigua para probarlo.

/-------------------------/

Mucha palabrería, pero realmente pienso que hay que intentar saber lo que se tiene, o si no las barreras van a ser mucho más frecuentes.
 

@Adngel, macho de verdad, tu de donde has salido?, eres un ser de otro planeta que viene a enseñarnos o algo asi?, estoy flipando, pero en colores, eres una enciclopedia andante!!, pero cuantos años llevas en esto?, te lo sabes como la santa biblia!!!, estoy anomalado, que envidia me das!!!!!, y encima aprendo mas con 7 lineas tuyas que en una mañana de tutoriales....La super detallada explicación es de lo mas, lo único que puedo decir a mi favor(que ya es mucho), es que la mitad la entendia porque este script no lo copie sin mas , lo fui fabricando a base de palos...pero como tu bien dices, cajas negras....Lo genial es que ahora lo entiendo aun mas....pero...(simpre hay un pero), lo del rb:(rigidbody lo tengo en el fantasma), veo el concepto que me quieres decir que lo llame y lo use en el lugar de decirle al fantasma que venga de sopetón hacia mi y asi se salte lo que tenga delante.Eso lo he entendido pero del dicho al echo....hay programación y en eso fallo.Lo del  void start...si lo reconozco esta de adorno supongo que pense que me serviria aqui algun dia...y asi es ya le has encontrado utilidad, pero repito,soy tonto y no se aplicar lo que me has explicado.Pero me arriesgare....seria poner esto aqui?
using UnityEngine;
using System.Collections;
public class skellyattack13 : MonoBehaviour {
   public GameObject player;
   public GameObject skelly6;
   public float distance;
   public PlayerInfo character;
   
   // Use this for initialization
     public Vector3 teleportPoint;
         public Rigidbody rb;
         void Start() {
         rb = GetComponent<Rigidbody>();
    }
    void FixedUpdate() {
        rb.MovePosition(transform.position + transform.forward * Time.deltaTime);
    }
}  
   }
   
   // Update is called once per frame
   void Update () {
      
   player = GameObject.FindWithTag("jugador");
   skelly6 = gameObject;
   distance = Vector3.Distance(player.transform.position,skelly6.transform.position);
      
      if (distance <= 4) {
      skelly6.GetComponent<Animation>().CrossFadeQueued("Walk", 0.3f, QueueMode.PlayNow);
      skelly6.GetComponent<Animation>().CrossFade("Attack");
      character.ApplyDamage(1);
      character.playerInCombat(1);
      }
      else if (distance < 50 && distance > 4.0f) {
      ///GetComponent<FollowPath>().enabled = false;
      skelly6.GetComponent<Animation>().CrossFadeQueued("Attack", 0.3f, QueueMode.PlayNow);
      skelly6.GetComponent<Animation>().CrossFade("Walk");
      skelly6.transform.LookAt(player.transform.position);
         transform.position = Vector3.MoveTowards(transform.position, player.transform.position, 0.30f);
         //character.playerInCombat(1);
         
      }   
      else
      {
      skelly6.GetComponent<Animation>().CrossFadeQueued("Walk", 0.3f, QueueMode.PlayNow);
      skelly6.GetComponent<Animation>().CrossFade("Idle");
      ///GetComponent<FollowPath>().enabled = true;
      character.playerInCombat(1);
      }
   }
   
   
}
pero entonces esto? sobra???....hay madre....necesito verlo para encajarlo :(....algun dia llevame con tu nave a tu mundo que seguro que alli me metes un chip....y lo aprendo todo.Esto:
distance = Vector3.Distance(player.transform.position,skelly6.transform.position);

Por cierto @Howling Wolf, gracias a ti tambien por la respuesta cuando me ponga las pilas me mirare el tema de Navmesh, aver si me entero ya de una vez :(

Julio 26, 2015, 08:12:18 AM #8 Ultima modificación: Julio 26, 2015, 08:12:58 AM por Antonio
Hoy trabajo y no me queda mucho tiempo @_@, vas por buen camino, aunque esta línea
rb.MovePosition(transform.position + transform.forward * Time.deltaTime);
Que es la que mueve el objeto, no va sola, (si no se estará ejecutando en todos los ciclos, es decir, si el enemigo esta atacando, también estará moviéndose, si el enemigo esta con la animación de estar parado, a la vez también estará moviéndose, no queremos eso). Es necesario que pongas esa línea dentro de la función, en la parte donde el enemigo se esta moviendo.

Es decir, dentro del update, después de calcular la distancia, preguntas por 3 casos (el de atacar, el de moverse y el de estar quieto), tienes que poner la línea final del 2º caso, el de estar moviéndose. Sustituyendo la antigua que no queremos:
 
transform.position = Vector3.MoveTowards(transform.position, player.transform.position, 0.30f);
 

@ramunda, supongo que las animaciones "walk" y "attack" tienen claves de posición, es decir, que cambia de posición mientras realizar la animación. Pues según tengo entendido, el componente Animation no tiene la opción 'Apply Root Motion' en las físicas, y seguirá traspasando objetos y otros personajes. Utiliza el componente Animator, o traza un rayo para detectar un obstáculo antes de aplicar las animaciones en base a una distancia, entre 50-4.

@Adngel, de nuevo gracias por tu tiempo y conocimientos, espero que te sea leve el trabajo :).Estudiando tus palabras:
using UnityEngine;
using System.Collections;
public class skellyattack13 : MonoBehaviour {
   public GameObject player;
   public GameObject skelly6;
   public float distance;
   public PlayerInfo character;
    public Vector3 teleportPoint;
    public Rigidbody rb;
   // Use this for initialization
   void Start () {
   rb = GetComponent<Rigidbody>();
   }
   
   // Update is called once per frame
   void Update () {
      
   player = GameObject.FindWithTag("jugador");
   skelly6 = gameObject;
   distance = Vector3.Distance(player.transform.position,skelly6.transform.position);
      
      if (distance <= 4) {
      skelly6.GetComponent<Animation>().CrossFadeQueued("Walk", 0.3f, QueueMode.PlayNow);
      skelly6.GetComponent<Animation>().CrossFade("Attack");
      character.ApplyDamage(1);
      character.playerInCombat(1);
      }
      else if (distance < 50 && distance > 4.0f) {
      ///GetComponent<FollowPath>().enabled = false;
      skelly6.GetComponent<Animation>().CrossFadeQueued("Attack", 0.3f, QueueMode.PlayNow);
      skelly6.GetComponent<Animation>().CrossFade("Walk");
      skelly6.transform.LookAt(player.transform.position);
      //transform.position = Vector3.MoveTowards(transform.position, player.transform.position, 0.30f);
      rb.MovePosition(transform.position + transform.forward * Time.deltaTime);
         
      }   
      else
      {
      skelly6.GetComponent<Animation>().CrossFadeQueued("Walk", 0.3f, QueueMode.PlayNow);
      skelly6.GetComponent<Animation>().CrossFade("Idle");
      ///GetComponent<FollowPath>().enabled = true;
      character.playerInCombat(1);
      }
   }
   
   
}
La linea substituida:
//transform.position = Vector3.MoveTowards(transform.position, player.transform.position, 0.30f);
por esta:
rb.MovePosition(transform.position + transform.forward * Time.deltaTime);
Bien , sin errores, pero(ya esta el pero transform.position, 0.30f);
le decia lo rapido que venia hacia mi...que era probablemente el echo de que se saltara todo, pero ahora se lo sigue saltando....Y me queda una sola cosa mas:
void FixedUpdate() {
Esto es lo mismo que el void Update?? , es un fixed pero no veo la dierencia.Espero que termines tu laburo y por aquí nos vemos , un abrazo!!   
[quote author=kaito" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15796" data-ipsquote-contentcommentid="100771 date=1437904678]@ramunda, supongo que las animaciones "walk" y "attack" tienen claves de posición, es decir, que cambia de posición mientras realizar la animación. Pues según tengo entendido, el componente Animation no tiene la opción 'Apply Root Motion' en las físicas, y seguirá traspasando objetos y otros personajes. Utiliza el componente Animator, o traza un rayo para detectar un obstáculo antes de aplicar las animaciones en base a una distancia, entre 50-4.[/quote]@Kaito, gracias por el aporte, si eso creo que si porque cuando ataca si te giras el se gira tambien hacia mi y sigu atacando....con el animator...ufff, y lo del rayo que supongo que te refieres al Raycast....esa cosa me odia nunca la super hacer funcionar :(. un abrazo amigo, 

Julio 26, 2015, 06:51:12 PM #11 Ultima modificación: Julio 26, 2015, 06:51:52 PM por Antonio
Pues sí, ha sido un buen día. XD

Bueno, cierto que irá a paso de tortuga, hay que multiplicarle la velocidad, es lo que me refería cuando dije por ahí arriba: 

 [quote author=Adngel" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15796" data-ipsquote-contentcommentid="100759">.
..
...Puestos a cambiar algo, quizás sea la velocidad, puedes hacerlo fácilmente multiplicando lo que hay entre paréntesis, por algún número, (si lo multiplicas por 2, pues irá el doble de rápido...).

...[/quote]Es decir, si la línea es esta:

 
rb.MovePosition(transform.position + transform.forward * Time.deltaTime);
Le añadimos un pequeño bufo al final:
rb.MovePosition(transform.position + transform.forward * Time.deltaTime * 2);
Ese * 2, hará que vaya el doble de rápido, que aún así va despacio, pues le pones algo más grande. *5, *10, *3542, etc..., (aunque si le pones algo muy alto, lo más probable es que el fantasma acabe teletransportándose al estilo Goku).


Lo que me ha sorprendido es que siga traspasando colisiones. Eso ya no es problema del código, es que le faltará algo más. A ver.
El fantasma debe tener:
- El Transform como todos los gameobjects
- Este código que controla la IA.
- El componente Rigidbody que controla sus físicas
Algún collider, que le diga cómo es su objeto de colisión, (un Sphere collider, o capsule collider, o algo así). 
- El mesh renderer que gestiona la apariecia y materiales del modelo.
- El animation que gestiona las animaciones de Legacy.

Los muros deben tener como mínimo:
- El Transform.
- El renderer
- Algún otro collider que delimite su forma. Cuando los objetos chocan, no lo hacen con el objeto en sí, todos ellos son como hologramas, traspasables, la física de los objetos chocan contra los colliders, que normalmente no suelen ser similares a los objetos que enlazan. (

Julio 27, 2015, 12:12:58 AM #12 Ultima modificación: Julio 27, 2015, 12:37:15 AM por ramunda
Me alegro compi que el curro te se de provecho

Julio 27, 2015, 12:57:29 AM #13 Ultima modificación: Julio 27, 2015, 12:58:48 AM por Antonio
El gusano de cuerva está puesto como que es cinemático (Is Kinematic), ¿Puede ser esa la razón?.

Cuando un objeto, tiene un collider físico, pero se pretende que no afecte a la física de los otros colliders, se le pone esa opción (Y, ¿para qué podriamos necesitar algo así?, pues por ejemplo, para cuando al enemigo le pongo un collider en la cabeza, que reciba los disparos del jugador y multiplique el daño x2. Ese objeto, tendrá que ser un collider, y además, tendrá que tener el rigidbody para poder detectar las colisiones recibidas por los raycast de la pistola del jugador, pero no queremos, que ese collider que tiene el monstruo clavado en la cabeza, le resulte un obstáculo para su movimiento,  (Podría, yo que sé, empezár a arrastrarse por el escenario o salir volando sin Redbull), para esos casos, le decimos que esos colliders son cinemáticos a través de sus Rigidbodies, y el asunto pues queda más o menos solucionado. (quien dice cabeza, también dice corazón, escudo, espada, etc...)

El rigidbody del gusano de cueva, está gestionando el objeto del monstruo en general, necesitamos que se mueva y trabaje, así que el IsKinematic debería estar desactivado.

En cuanto a la "detección de colisión", bueno, en continua funcionará, pero cuando lo pruebes, verás que en Discreta debería ir bien también, en teoría consume menos, pero en fin, eso no está mal, es un poco percepción de cada uno.


He visto que a la cueva, le has puesto también un Rigidbody, yo no lo pondría porque no se mueve, (no tiene gravedad, ni se gira, ni se traslada), Eso quiere decir que realmente, no tiene que estar alerta en todo momento comprobando físicas dinámicas. Tenerlo ahí no es un crimen, quizás más adelante quieras implementar algo que haga uso del componente, por ejemplo, si fuera un barco que se mueve y se vuelca por el oleaje, pues sí, tendría más sentido. Pero en fin, lo que quiero decir es que no es un requisito para que el enemigo choque con los muros, con el MeshCollider es suficiente.

Hola @ramunda. una pregunta por simple curiosidad, a nivel personal te sera gratificante programar un videojuego asi ? no es ninguna critica, pero creo que la gente programa en su mayoria por tres razones: con la esperanza de ganar un dinero y poder vivir de esto, como reto personal y trabajo de investigacion para adquirir nuevos conocimientos, o para satisfaccion personal al ver un trabajo finalizado (el segundo y el tercer motivo van muy ligados el uno al otro).la primera razon, la economica, a nuestro nivel esta casi descartado y lo consiguen el 0.1%la segunda razon, trabajo de investigacion, en tu caso esta claro que tambien se puede descartarpor eso te preguntaba si te sera muy gratificante programar un videojuego como lo estas haciendo, porque si no es asi es un problema (no hay ninguna razon para rom*** la cabeza en realizar un curro como este). como consejo yo te diria que trataras de hacer un poco mas de trabajo de investigacion, puede resultar un poco tedioso pero si te gusta esto, no esta tan mal y encima te resultara mucho mas gratificante al lograrlo.no es muy normal exponer una duda, y cuando te dan una orientacion seguir sacando mas dudas sobre el mismo tema varias veces al dia. con la primera orientacion tienes una base para investigar. hay personas que "investigar" sobre un mismo tema les lleva varios dias a base de buscar informacion, probar y reprobar, es la mejor manera de aprender. si te responden una duda y tu investigacion a partir de esa orientacion es de 5 minutos, sinceramente no creo que aprendas nada, y menos aun (si cabe) que termines un proyecto.todo esto no es mas que un consejo de buen rollo, un saludo

Etiquetas: