Jump to content
UnitySpain

Leaderboard


Popular Content

Showing most liked content since 01/17/2019 in all areas

  1. 3 likes
    Te recomiendo algo para que lo tomes muy encerio y lo apliques desde el momento que lees este comentario. 1 - No deberias usar UnityScripts, ya se encuentra descontinuado y es un pseudo lenguaje donde confunde muchas características de la programación orientada a objeto. Desde este momento empieza por utilizar C#, todo te sera mucho mas simple y a medida que avances podrás resolver problemáticas complejas que UnityScripts no puede. 2 - El foro recomiendo una versión estable de Unity y esta es la que deberias de tener, con más razón si estás aprendiendo. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Cuando empieces a programar con C# necesitarás practicar la abstracción de los problemas para poder reflejarlos dentro del código. Te dejo el código que publicaste en C# y comentado- //Using sirve para incluir [NameSpace (Nombres de espacio)] al codigo librerias de tercero, por ejemplo, //System contiene clases como Action que se utiliza para representar un evento. UnityEngine contiene a MonoBeahviour, Transform, Vector3,2, etc. using System; using System.Collections; // NameSpace que contiene IEnumerator. using UnityEngine; [RequireComponent(typeof(NavMeshAgent))] // Atributo que indica que el componente NombreScripts requiere que el Objeto donde esta asignado contenga NavMeshAgent, Si no lo contiene lo agrega automaticamente. public class NombreScripts : MonoBehaviour // <<< Todos los componente en Unity requiere Heredar de esta clase para que funcionen. Existen otros tipos de componentes que mas adelante podras ir descubriendo. { private NavMeshAgent m_navMeshAgent {get; set;} // Componente NavMeshAgent usado como CACHE private Transform m_meta {get; set;} // Variable Transform usado como CACHE [SerializeField] private int m_salud = 100; // Variable de Tipo Entero, utilizada para la SALUD [SerializeField] private bool m_patrullar = false; // Variable de Tipo Booleano, ¿utilizada como BANDERA (Flag)? [SerializeField] private Transform[] Puntos = null; // Variable de Tipo Arreglo de Transform, ¿Utilizada para el recorrido (WayPoints)? [SerializeField] private Action m_eventDead; // Evento, al ser invocado se llaman todos los delegados (Funciones) asignado. public bool IsAvailableMeta { get { return m_meta != null; } } // Propiedad que nos returna con un Booleano si la Variable m_meta es NULL. private void Awake() { m_navMeshAgent = GetComponent<NavMeshAgent>(); // Obtenemos el componente NavMeshAgent y lo asignamos a m_navMeshAgent. m_eventDead += () => //Asignamos un delegado Anonimo al evento m_eventDead, este delegedo Destruye el objeto cuando muere. { Destroy(gameObject); }; StartCorrutine(YieldUpdate()); // Iniciamos una corrutina para evitar buscar en cada ciclo del Update. Esto lo hago para que entiendas como funcionan estas cosas en C#. } private IEnumarator YieldUpdate() // Las Corrutinas son delegados que retornan un object IEnumerator, no es complejo de comprender pero en este momento te podria complicar bastante. { while(true) // Ciclo infinito { if(IsAvailableMeta) // Comprobar si m_meta esta asignado, si es asi, entonces que espere 1 segundo y vuelva a repetir el bucle. { yield return new WaitForSeconds(1); continue; } // si la condición anterior es falsa, entonces se llama a la función FindMeta, si se encuentra una meta se vuelve a dar 5 segundo antes de repetir el ciclo nuevamente, de lo contrario solo 1 segundo. if(FindMeta()) yield return new WaitForSeconds(5); else yield return new WaitForSeconds(1); } } private void Update() { if(IsAvailableMeta) // Si m_meta esta asignado entonces creas la logica requerida. { } } private bool FindMeta() // Metodo que nos devuelve un booleano para saber si se entontro o no una meta { GameObject go = GameObject.FindGameObjectWithTag("Enemigo"); // Buscamos un GameObject que contenga el TAg Enemigo y lo asignamos a go (Variable Local) if(go != null) // Si go es diferente a NULL tomamos el componente transform y lo asignamos a m_meta, a la misma vez cortamos la ejecución de la función retornando un valor verdadero. { m_meta = go.transform; return true; } else // Si go es NULL entonces se cota la ejecución de la función retornando un valor falso. { return false; } } private void OnTriggerEnter(Collider col) { if(col.gameObject.CompareTag("Enemigo")) // Utiliza CompareTag para verificar si el objeto colisionado tiene como TAG "Enemigo" TakeDamage(1); // Si es asi aplicar Daño de 1. } public void TakeDamage(int amount) // Función que aplica daño modificando la variable m_salud con el valor enviado a través del parametro amount. { m_salud -= amount; // se decrementa m_salud con el valor de amount. if(m_salud <= 0 && m_eventDead != null) // se comprueba si m_salud es menor o igual a cero y si m_eventDead es diferente a null. m_eventDead es null cuando no se le asigna ningun delegado. m_eventDead.Invoke(); // si la condición anterior se cumple entonces invocamos m_eventDead. } }
  2. 2 likes
    ¿Que qué es? enlace aquí Road map aquí Docu aquí Estoy aprendiendo a desarrollar con el modo Tiny... por ahora ya he logrado salida pixel perfect, animaciones, multiplayer... Ahora mismo desarrollando servidor autoritativo con la física. El resultado actual de la build es un archivo único en texto plano html que una vez pasado por el gzip del servidor supone un peso de solo 500KBs para el navegador... y es compatible con móviles. Probar en https://debug64.com AWSD SPACE PD: iré actualizando con lo que vaya logrando/aprendiendo.
  3. 2 likes
    Hola ¿Como están? ¿Eres amante de las letras? Aprende palabras en inglés jugando y de forma divertida. Navy Crush es un juego puzzle de letras orientado al aprendizaje de palabras en inglés con su traducción para incrementar tu vocabulario de inglés. Reedbed les invita a testear "Navy Crush English" y formar parte de nuestro proyecto para mejorarlo, gracias y un buen saludo a todos. Envianos tu correo a: reedbed.mx@gmail.com y menciona que quieres ser parte de la versión beta de "Navy crush English" ¡Combina, juega y aprende vocabulario en inglés con Navy Crush English! Nuestro sitio web: http://reedbed.mx/
  4. 2 likes
    Ese debería ser el mensaje de bienvenida al foro cuando te registrás ... Bienvenido a la comunidad nuevo usuario! ... Primero dejanos decirte alto muy importante: No deberias usar UnityScript, ya se encuentra descontinuado y es un pseudo lenguaje donde confunde muchas características de la programación orientada a objeto. Desde este momento empieza por utilizar C#, todo te sera mucho mas simple y a medida que avances podrás resolver problemáticas complejas que UnityScript no puede ... en fin, bienvenido a la comunidad ! El Admin :) Ningun "find" en update, es la regla de oro de la programación en Unity. Tampoco ningun Camera.main (que es similar) y evitar a toda costa reiterados GetComponent's. Seguramente exista una forma de arreglarlo, siempre la hay (o casi siempre). Por ejemplo, podrías primero (en start por ej) buscar las referencias a todos los enemigos para luego (en update) empezar a laburar sobre el transform y definir la "meta", algo muy distinto que andar frame a frame buscando a todos los enemigos.
  5. 2 likes
    Para el multiplayer en el cliente estoy desarrollando mi propio Tiny módulo... namespace module { export class multiJugador { static WebSocket: WebSocket; static conecta() { multiJugador.WebSocket = new WebSocket("wss://" + module.multiJugador.servidor.url); multiJugador.WebSocket.onopen = function() { .................. En el lado del servidor node con ws. Para hacerlo seguro/autoritativo la física se ejecuta en el servidor con matter.js Hoy he aprendido a usar el módulo Tweens de Tiny... ahora todas entidades van interpoladas. Esto me ha permitido darle un avance de modo que ahora la física se reproduce a 60 ticks por segundo en el servidor mientras que la escena es enviada al cliente a 15 ticks por segundo e interpolada con Tweens. Siguen siendo 500kbs de descarga para el navegador, se puede probar en https://debug64.com AWSD SPACE Ejemplo de código usando Tweens (sin optimizar) ut.Tweens.TweenService.addTween(module.multiJugador.World, game.jugador.cachea.Entidad, // on which entity ut.Core2D.TransformLocalPosition.position, // what component + field multiJugador.World.getComponentData(game.jugador.cachea.Entidad, ut.Core2D.TransformLocalPosition).position, posicion.position, // from -> to 1/multiJugador.redFrames, // duration 0, // start time offset ut.Core2D.LoopMode.Once, ut.Tweens.TweenFunc.Linear, true // remove tween when done (ignored when looping) );
  6. 1 like
    primero definir que es destruir para vos, podrías tener un conjunto de funcionalidades que definen al proceso de destrucción (en absolutamente todo juego, incluso el más pedorro ocurre esto), un ejemplo: se inicia el proceso de "Destrucción" (con la llamada de DestroySprite() ponele, la inventé ) se agrega un script, típico del KillMe y le ponés unos segundos (o usas la instrucción Destroy(gameObject , tiempo) ) se instancian unas particulas de efecto se reproduce un sonido Se reproduce una animación etc luego en el Ontrigger lo unico que hacés es obtener la referencia del objeto desafortunado, y llamás al método DestroySprite() ... obviamente podrías haber llamado a Destroy (de unity), de nuevo nadie hace esto pero para probar está bien ... o hacer todo lo de arriba en el mismo trigger para cada objeto , pero queda poco práctico , y además porqué el destructr debe conocer esa información ??. Para encontrar la referencia del objeto y llamar al método es: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Colisionador : MonoBehaviour { public void OnTriggerEnter2D(Collider2D trigger) { // tenés trigger arriba, usalo, con ".gameObject" accedés al GameObject del objeto que colisiona GameObject target = trigger.gameObject; // 1 - ------------------- Si solamente vas a llamar a Destroy (de unity) ----------- // una vez que colisiones ya lo llamás, (o aplicá antes los if's que creas necesarios) Destroy( target ); // 2 - --------- Si vas a usar el método de arriba (DestroySprite) ----------- // vamos a suponer que el método para destruir es público y está en el componente "Health" // se define la referencia para luego verificar que exista, se podría dar que colisiones con algo que no tenga "Health" Health targetHealth = target; if(target != null) { // con el super método descripto arriba target.DestroySprite(); } } } lo escribí así nomas, puede haber errores. Saludos
  7. 1 like
    Más ejemplo de código, una muestra de referencia en el proceso de aprendizaje... Estoy creando una serie de helpers... que estoy organizando por módulos. Por ejemplo... para la consola de texto en pantalla del módulo multiJugador que estoy desarrollando... A partir de una entidad llamada consola a la que he añadido un componente UI Text2D, con... var consola = new Texto2D(this.world, "nombre entidad"); ...busca la entidad usando el nombre, guarda la referencia, lee el componente, y después con: consola.Texto2D("una cadena"); Saca el texto al UI Text2D de la entidad consola. Resulta algo laborioso ahora partiendo de cero... un buen conjunto de módulos helpers agilizará mucho tiempos de desarrollo posteriores de este u otros proyectos ya que son reutilizables.
  8. 1 like
    Que se cumplan las dos... if ( (A >= 1) && Input.GetMouseButtonDown(0) ) que se cumpla alguna... if ( (A >= 1) || Input.GetMouseButtonDown(0) ) Puedes encadenar y combinar las que quieras... Más info... https://www.aulafacil.com/cursos/programacion/en-c/operadores-logicos-condicionales-l17109
  9. 1 like
    Meta = GameObject.FindGameObjectWithTag("Enemigo").transform; Pásalo al Start, de todas maneras no le veo sentido a que se cierre, ¿tienes buena máquina? Y sino reinstalate el unity. Por cierto, que unity es? Veo que utiliza unityscript
  10. 1 like
    Por supuesto, quizás los números nunca llaman la atención, podrías pasar de tener 400,000 a 800,000 triangulos y quizás te ande como si nada pasó, el gpu maneja muy bien mucha cantidad de triangulos (de vertices vas a terminar en triangulos seguramente), pero cuando al gpu no le da para más (ej el mio) es una tortura, por ej los modelos con tesselation lo matan pobre, por eso se usa mucho los LODs para reducir el detalle extra poco visible (segun la distancia al objeto). "lo contrario" a esto sería usar adaptative tesselation para incrementar detalle de la misma manera. Si el mapa fuera de 10 km x 10 km con (15 millones de triangulos) y tu distancia de renderizado es de 100 unidades (vamos a decir metros) en donde se ven 100,000 triangulos es probable que no notes nada en el rendimiento, todo va en lo que se tiene sobre el hombro, seguramente te afecte el uso de ram si el terreno fuera inmenso, o la carga del juego, pero a nivel gráfico importa lo que se ve, por así decirlo, y modifiquen y adapten a sus proyectos las opciones gráficas disponibles, eso es mucho muy importante: o simplemente lo más fácil de todo, metete en blender, hacé un terreno inmenso de 10 millones de triangulos, llevalo a Unity -> prueba 1 ... luego de blender le ponés el modificador decimate (creo) y lo reducís a 1 millón o menos, llevalo a Unity -> prueba 2 , y sacá tus concluciones. EL material, postFX e iluminación también te pueden llegar a afectar de manera considerable, a tenerlos en cuenta, más triangulos implica más carga sobre estos también de alguna manera. Saludos
  11. 1 like
    podés usar el canvas en modo "camera space" o en modo "world space" y posicionar el sprite adelante (en overlay tenés que hacer otras cosas). Si te vas al overlay (el default) tendrás que renderizar sprites en una cámara y elementos UI en otra, y acomodar el order de renderizado de la forma que quieras, por supuesto es más rebuscada, me parece que de otra forma no podés, quizás me olvide de algo.
  12. 1 like
    Mira, UNET vino para irse, ya esta bastante muerto y descontinuado ¿la razón?, no es práctico para el desarrollo de un Juego, sirve para prototipar de manera acelerada pero pasando por alto muchas cosas. Te recomiendo utilizar la siguiente librería https://github.com/francoe1/LiteNetLib
  13. 1 like
    Las múltiples variables (primer parámetro del for) la use muy pocas veces para la resolución de algunos problemas matematicos, solo como modo de resumen de código, al final queda bastante ilegible la lógica. Las múltiples acciones (ultimo parámetro del for) si lo uso bastante, ya que este permite trabajar con diferentes tipos de datos. Nunca lo use para programar Juegos, ya que la implementación de estas técnicas son bastante dañinas para la lectura y el entendimiento, desde mi punto de vista es mejor no usarlas, pero, puede surgir la necesidad.
  14. 1 like
    Separa el caso en tareas mucho más pequeñas, para depurar y controlar errores. Si no recibe datos en el servidor, es que la conexión ha caído o no es interpretada correctamente. Empieza por ahí, a ver qué le estás mandando de mensaje simple y qué recibe el servidor. Como si fuera el juego del "teléfono"...
  15. 1 like
    Probablemente es un bug de Unity. A partir de la 2018.3 han empezado a meter cosas nuevas. En UnitySpain recomendamos no pasar de la 2018.1.9. A medida que vayamos testeando versiones, os iremos recomendando una u otra...
  16. 1 like
    Lo primero que te toca hacer es documentarte todo lo que puedas sobre ese juego del que quieres hacer mods. Busca cómo están dispuestos los archivos del juego, qué hacen, para qué sirve cada variable, etc.. Empieza con pruebas pequeñitas, cambiando algún valor patatero del xml, para subirte más vida, o cambiando de valor un texto que aparezca en algún diálogo, etc. Así es cómo se empieza, de hecho... Más adelante, ya tendrás una base mínima para saber qué quieres cambiar exactamente, si es algo de código que cambia el comportamiento o condiciones del juego, o es meramente visual o aportas más contenido, etc...
  17. 1 like
    Hola @DerKaiser . En nuestra Comunidad no enseñamos Introducción a la Programación, somos un foro de soporte. Te corresponde a ti buscarte un poco la vida y aprender unas bases mínimas para programar. Por supuesto, te echaremos una mano con dudas sobre Unity3D y videojuegos que vayas teniendo. Pero no podemos ir resolviéndote la vida y arreglando trozos de código que no has sabido escribir correctamente. Te recomiendo que busques ayuda externa o en otras comunidades para ello, antes que venir aquí con el problema, sin haber mirado el código, apenas... Por favor, recuerda formatear el código que pegas usando el editor de texto que tienes disponible al responder en el foro. Usa los botones de ' " ' , o de '< >' que tienes arriba para ello. Otra petición: Por favor, aclara siempre los títulos de los Topics que hayas creado, para que la gente que visita el foro y que quiere ayudarte pueda saber de qué se trata tu problema. No, "STE UNITY" no es un buen título para un topic en el que pides ayuda. No queda nada claro qué querías... Explicamos todo ésto en el foro de Primeros Pasos.
  18. 1 like
    PasteBin? Solo copio del compilador al foro xD.
  19. 1 like
    @DerKaiser qué usas para postear código? es algo embebido? pasteBin ?
  20. 1 like
    Si tiene eso no creo que te ande on collision, (quizás sí OnTrigger) fijate del manual: https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnCollisionEnter.html Dice: OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider. [Hasta aca bien] In contrast to OnTriggerEnter, OnCollisionEnter is passed the Collision class and not a Collider. The Collision class contains information about contact points, impact velocity etc. If you don't use collisionInfo in the function, leave out the collisionInfo parameter as this avoids unneccessary calculations. ---> Note: Collision events are only sent if one of the colliders also has a non-kinematic rigidbody attached. Collision events will be sent to disabled MonoBehaviours, to allow enabling Behaviours in response to collisions. Notar que de la misma tabla, no es posible disparar el mensaje entre kinematic rigidbodies, solo un kinematico vs un NO kinemático, me olvide de mencionarlo anteriormente. el tag no hace nada, tampoco las capas por si mismas, vos podés decir que capa choca con cual (via Layermask o matriz de colisiones), pero el tag ni pincha ni corta.
  21. 1 like
    siempre probá las cosas por separado (siempre que tengas un problema, claro está), si no estás seguro meter todo de golpe solo te va a confundir. Por ej corre en una instrucción solo el LoadScene, para el onCollisionEnter hace un Debug.Log o print que diga "anda el on collision" , que se yo. Si el nombre de la escena es exactamente así, debería estar bien. Lo del OnCollisionEnter quizás sea, porque uno (por lo menos) de los dos debe tener un rigidbody, fijate la tabla de colisiones del manual. https://docs.unity3d.com/Manual/CollidersOverview.html También verificá que: 1 - las capas que tengan los objetos estén preparadas para colisionar entre ellas y 2 - que el objeto que tenga el mensaje OnCollisionEnter tenga el boxCollider2d (y que no sea un padre vacío o cosas así).
  22. 1 like
    con el codigo sin los comentarios pertinentes no se si lo estoy entendiendo bien, pero lo que puedes hacer es generar primero una matriz con lo que va en cada posicion y despues leer la matriz e ir posicionando los objetos leyendo en la matriz, asi te aseguras que no superponga objetos.
  23. 1 like
    Jajaja comparto, ese cuadro molesto es la razón por la que tantos y tantos programamos. Bueno, si se quiere desactivar lo primero será que especifiques el programa editor de código / Ide , supongo que es VS(?), así que probá en las opciones del autocomplete/intellisense de C#: VS > Tools > Options > Text Editor > C# > IntelliSense (busqué por ahí, no estoy seguro)
  24. 1 like
    @pioj Si, se puede declarar múltiples variables y múltiples acciones. suponiendo que la estructura de un for es (variables, condición, acciones). Lo que no se puede hacer es declarar múltiples tipos de datos hasta la versión 4.5 .NET. El error está en las variables, (int alfa = 0, int beta = 9). Si trabajas con el mismo tipo de datos entonces no es necesario redeclarar. Para que el bucle funcione solo debes eliminar la declaración de tipo. for (int alfa = 0, beta = 9; alfa < 10; ++alfa, --beta ) { Console.WriteLine("Alfa:" + alfa + " Beta:" + beta); } Saludos.
  25. 1 like
    ¡Muchas gracias! Es información muy interesante y con la que puede empezar a trabajar. Saludos :)
×