Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Ele

#1
Primero que nada debes saber que esto no es una característica o función de Unity en realidad se trata de una TÉCNICA de optimización.

En que consiste?

Esta técnica consiste en instanciar un numero determinado de objetos al iniciar o cargar el nivel, luego desactivarlos para activarlos parcial o totalmente. Y esto tiene un impacto positivo en el rendimiento del videojuego ya que es mas barato en recursos activar y desactivar un objeto ya instanciado, que instanciar un objeto nuevo y destruirlo posteriormente.OJO que sea mas barato en recursos no quiere decir que deba usarse sin medida, ya que al activar el objeto el motor debe renderizar nuevamente el objeto como si de un objeto nuevo se tratase, pero con esto nos ahorramos la carga del objeto en memoria.Veamos un poco de código para aplicar esta técnica...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#2
Saludos colegas y entusiastas de la programación, quiero iniciar este articulo diciéndoles de entrada que no voy a tocar todos los aspectos de la inteligencia artificial ni tampoco haré ejemplos extensos ya que si lo hiciera podría escribir un libro de al menos unas 500 paginas, al menos con mi conocimiento, estoy seguro que otros podrían escribir de mas paginas, ya que es un tema bastante extenso.Lo primero que debemos hacer (se aplica a todo en programación) es establecer el o los problemas, les recomiendo que busquen unahttp://wwwhatsnew.com/2014/03/28/herramientas-crear-mapas-mentales-internet/">herramienta* para crear mapas mentales o tener un pizarron  o mas simple un lápiz y un papel porque esto requerirá de unaLÓGICA ACERTADA, recuerden que lo que pretendemos hacer es crear una simulación de inteligencia, analicemos el siguiente mapa mental:https://eleazarcelis.files.wordpress.com/2015/10/captura__09_10_2015__224407.jpg">Lo que primero debemos saber es que nuestro actor con AI deberá tener un comportamiento principal, este comportamiento definirá sus acciones y movilidad. Este actor también deberá tener varios estados por ejemplo "en ***cucion" "default"(viene dado por el comportamiento, ejem.:  patrullando, explorando,...),"bajo ataque", "en alerta" y los que uds. consideren que pudiera aplicar, estos estados serán importante para informar a otros componentes que esta haciendo el actor.Lo segundo que deberemos definir es un área de acción en los casos de patrullaje y de defensa, esto sera necesario para definir la movilidad del actor.La movilidad de un actor puede gestionarse perfectamente a través de un navmesh, esto nos ahorrara mucho calculo. El navagent se encargara de encontrar una ruta hacia un punto este punto se puede definir en cualquier momento al igual que la velocidad a la que se dirigirá hacia él, y también la distancia de frenado, estos son 3 aspectos que nos harán la vida mas fácil. Ahora que tengamos esto listo podremos resolver nuestro siguiente problema y es quizás el punto mas importante en AI para videojuegos la percepción.La Percepción
La percepción se podría definir como "el primer conocimiento de una cosa por medio de las impresiones que comunican los sentidos". La percepción disparara comportamientos y acciones en nuestro actor con AI de allí su importancia en programarla. Lo primero que debemos definir son lossentidos que tendrá nuestro actor, como vieron en la imagen yo solo he definido la vista, el tacto y la audición, aunque pudieran definirse otros, inclusive sentidos de fantasía como la habilidad de percibir enemigos que estén detrás de las paredes por ejemplo.Empecemos por el menos complejo, el tacto. Digo que este sentido es el menos complejo ya que este ya viene preparado por uniti con los colliders, un simple OnCollisionEnter podrá notificar que algo o un enemigo ha sido detectado. Y esto nos llevara a un punto importante, ladireccion de dicha interacción, para ello podemos recurrir a la propiedad "contacts[0].point"http://docs.unity3d.com/ScriptReference/ContactPoint-point.html">* del objeto "Collision" que nos da OnCollisionEnter, con ello podemos calcular la dirección de dicha interaccion, por ejemplo:
1
2
3
void OnCollisionEnter(Collision other) {
    touchDirection = (other.contacts[0].point - transform.position);
}
y como pasaría en la vida real, dicha interacción provocaría una reacción motora inmediata la cual seria un giro y evasión. Con la información recogida por el sentido ya podríamos ser capaces de rotar hacia la dirección nuestro actor y moverlo en sentido opuesto al contacto con algo como esto:
1
2
3
4
5
void Update() {
    transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(touchDirection ), Time.deltaTime * turnSpeed);
    float step = speed * Time.deltaTime;
    transform.position = Vector3.MoveTowards(transform.position, touchDirection, step);
}
Ya tenemos la 'información recogida por el sentido' y la respuesta motora correspondiente, si por ejemplo estamos programando un shooter deberemos disparar o no en dirección al contacto o tomar alguna acción en consecuencia, y para ello nos apoyaríamos seguramente en otro sentido como la vista por ejemplo para poder apuntar o captar donde esta nuestro enemigo pero eso lo trataremos mas adelante, pasemos al siguiente sentido.La Audición
Para este sentido pudiéramos usar un SphereCollider y activar isTrigger, de manera de usar su radio como radio de detección, es decir el actor podrá "escuchar" todo lo con este dentro de este radio, para ello podríamos usar la función OnTriggerStay(Collider other) para gestionar la información, por ejemplo:
1
2
3
4
5
6
public void OnTriggerStay(Collider other) {
    AudioSource audioSource = other.transform.root.GetComponent<AudioSource>(); // asumiendo que el componente audiosource estara siempre en la raiz del enemigo
    if(audioSource != null && audioSource.isPlaying){
            // implementacion...
    }
#3
Quizás ya te ha pasado antes que al hacer algún tipo de cambio general en el código de tus scripts, bien sea cambiar el namespace o como en mi caso en particular que traslade mis clases del Assets folder a un proyecto aparte para importarlos como plugins, luego me encontré que los prefabs y demás gameobjects que tenia en escena todos perdieron la referencia al script.Si esto te pasa con un proyecto recién creado no es problema, solo un poco de trabajo adicional. Pero cuando tienes un proyecto avanzado sientes que la sangre te hierve en las venas.Tranquilo... no todo esta perdido!He encontrado este plugin en internet, francamente no sé el origen ni el autor, pero si alguno lo conoce por favor deje su nombre en este post para darle el debido credito por ello les dejo el link mas abajo.Solo coloquen el contenido del zip dentro de la carpeta Assets/Editorhttps://mega.nz/#!7h5yiIyL!AbsWdGxePPheHc_YT02l7tKsXiiBbL6SHBOJ970hSnsEl funcionamiento es bastante sencillo, pero cualquier duda comenten y con gusto les ayudare.fuente: https://eleazarcelis.wordpress.com/
#4
Que son las Co-Rutinas?Las Co-Rutinas (Coroutines) son métodos que tienen la capacidad de pausarse y reiniciarse exactamente donde se quedo en el frame anterior. Para entenderlo mejor, consideremos el siguiente ejemplo de la documentación oficial :
1
2
3
4
5
6
7
void Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
    }
}
Si quisiéramos hacer una función como la anterior y la colocamos en el Update no tendría ningún efecto fade debido a que la funcion se ejecutara toda en el mismo frame y por ello no se renderizara los estados intermedios entre 1 y 0.En cambio si la colocáramos dentro de una Co-Rutina de la siguiente manera:
1
2
3
4
5
6
7
8
IEnumerator Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return null;
    }
}
La función se pausara en la linea donde esta el yield y el bucle for continuara en el siguiente frame sin perder el valor de la variable f de esta manera en cada frame se renderizara el cambio entre el valor de c.a y c.a -0.1.Adicionalmente las Co-Rutinas se pueden pausar cada n segundos con la clase WaitForSeconds como vemos en el siguiente ejemplo:
#5
Saludos colegas! hoy quiero compartirles un método para crear un pre-loader de niveles en Unity, es bastante sencillo. El método que vamos a usar es http://docs.unity3d.com/ScriptReference/Application.LoadLevelAsync.html">Application.LoadLevelAsync(int|string) básicamente este método lo que hace es cargar el nivel en segundo plano lo que permite ir mostrando un progreso con su propiedad "progress".Hay que tener en cuenta que la propiedad "progress" por alguna razón que desconozco solo va de 0.0f a 0.9f por lo que debemos multiplicar su valor por 100 si queremos mostrar el porcentaje, esto también implica que no podemos usarlo en algún condicional para saber si el nivel se cargo completamente o no, esto es algo que Unity debe solucionar ya que nunca llegara a 1f (o 100 si lo estas multiplicando), para ello deberemos usar la propiedad "isDone" cuyo valor sera false mientras se este cargando el nivel y true al completarse la carga.También es importante tener presente que una vez se cargue completamente el nivel, dicho nivel se activara automáticamente a menos que se le indique a la propiedad "allowSceneActivation" que no, esto es bastante útil si queremos mostrar o hacer "algo" antes de que se active el nivel, activar un efecto en la cámara, etc...https://eleazarcelis.files.wordpress.com/2015/09/captura__15_09_2015__112554.jpg">Acá les comparto el código fuente de una clase que ya yo he creado:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#6
General (Antiguo) / Control DropDownList para Unity
Septiembre 13, 2015, 09:30:16 PM
Desde hace una semana he estado diseñando un menú de opciones para mi juego, como sabemos antes de la llegada de Unity 5.2 no existía un control tipo Dropdown entre el UI de Unity de manera que me había dedicado a diseñarlo. Luego de que el progreso de mi control estaba a un 80% Unity saca su versión 5.2 con el control así que me había apartado un poco del proyecto del mi control.Una noche decidí anexar el control Dropdown de Unity a mi proyecto y el control se comporto excelente, el control realmente hace lo que uno pudiera esperar de un Dropdown control, pero hay una limitación en el control de unity. Ahora imaginen este escenario: estas desarrollando un menú de opciones para tu juego y quieres que haya una opción para configurar los controles de tu jugador, para lograr esto deberemos ser capaz de pasarle un objeto de tipo KeyCode al evento controlador, por ejemplo:Input.GetKeyDown(KeyCode.E)es decir el cada item del dropdown debería ser capaz de almacenar cada KeyCode (KeyCode.A, KeyCode.B, etc...) para pasarselo directamente a Input.GetKeyDown, pero la limitante es que el control de Unity solo permite asignar dos propiedades "texto" y "sprite", aunque si bien es cierto que pudiéramos hacer algún cast del string "texto" al enum esto se complicaría si el objeto que deseáramos asignar no es enum sino una clase mas compleja.Por esto decidí retomar mi diseño original de un componente Dropdown, el cual si implementa una propiedad llamada "value" de tipo object a la cual se le puede asignar cualquier tipo de valores.Para el ejemplo que les comente del listado con los KeyCodes la implementacion seria la siguiente:
DropDownList dpComponent = dropdown.GetComponent<DropDownList>();
dpComponent.source = Enum.GetValues(typeof(KeyCode)).
    Cast<KeyCode>().Select(x => new DropDownListItem()
{
    id = x.ToString(),
    text = x.ToString().CamelBreakup(),
    value = x,
    selected = x==KeyCode.E
}).ToList();
  La propiedad "source" del DropDownList permite definir el listado que se mostrara, cada item es un objeto de tipo DropDownListItemLes dejo el código fuente a continuación: para preguntas o sugerencias no se olviden comentar, espero les sea de utilidad.fuente: https://eleazarcelis.wordpress.com/2015/09/13/control-dropdownlist-para-unity/