Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

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

Mostrar Mensajes Menu

Mensajes - Ítizhor

#1
General Grafistas / Shaders en Unity 4.6
26 de Febrero de 2016, 12:14:14 AM
Hola:

Veréis, llevo ya varios días tratando de solucionar un problemilla con un shader pero no consigo averiguar cómo resolverlo. Además, como dificultad añadida tengo que por motivos de compatibilidad utilizo Unity en su versión 4.6, por lo que la documentación oficial, ya actualizada, no me sirve.

El caso es que quiero que, al finalizar el nivel de juego, la pantalla se cubra con un shader rojo oscuro y semitransparentado, sobre el que aparecen la puntuación obtenida y las opciones de volver a jugar o salir. El problema es que el shader se renderiza mucho más oscuro de lo normal (de como lo veo en Scene). Siguiendo un tutorial de YouTube, y a cuyo autor supongo que no le afectaba este "fallo" puesto que su shader era negro, elegí el tipo Transparent/Diffuse. He estado probando otros varios, entre ellos algunos pocos con los que pude dar en Unity Answers pero nada.

¿Alguien tiene alguna sugerencia? Lo cierto es que ya empiezo a desesperar, no sé dónde encontrar documentación y me parece un fallo muy, muy tonto pero que me fastidia bastante la presentación  :-[. Y si he venido a Stratos es precisamente por eso: vengo aquí cuando todo lo demás falla. Nunca me he ido del foro sin una solución sencilla y, sobre todo, rápida. Así que vuelvo implorando el consejo de los sabios que habitan tras estas pantallas. ¡Ayuda!

Gracias de antemano,
Ítizhor.
#2
¡Hola!

Disculpas por la extrema tardanza, pero no he vuelto por aquí antes. ¡Funcionó! De hecho, aquella misma noche ajusté el código y todo salió como tenía previsto. ¡Gracias! A ti por la respuesta y a Darago_malaga por la ayuda  :D.

Un saludo,
Ítizhor.
#3
¡Hola!

Veréis, desarrollando mi segundo videojuego para Android he llegado a la necesidad de repartir cuatro números (0, 1, 2 y 3, los cuatro primeros elementos de un array) de forma aleatoria y sin que ninguno se repita. Estuve mirando cómo hacerlo y finalmente me decanté por crear un array auxiliar que fuese guardando todos los valores que ya han salido para, al ir a obtener un nuevo número aleatorio, comprobar si el saliente ya ha aparecido y, en tal caso, repetir la búsqueda. Tras terminar, un bucle for se encarga de "vaciar" los elementos del array para el siguiente uso. Para ello he creado una función, que ha quedado tal que así:

int NonRepeatedRandomNumber ()
{
   do
   {
      randomCS = Random.Range (0, 3);
   }
   while (randomCS == positionedCCSS[0] || randomCS == positionedCCSS[1] || randomCS == positionedCCSS[2]);

   return randomCS;
}


Todas las variables, randomCS (el número aleatorio buscado en cada operación) y positionedCCSS[] (el array auxiliar) están declarados fuera de la propia función, al inicio del script. Huelga decir que ambas son de tipo int. También cabe comentar que el bucle for que vacía el array auxiliar tampoco está dentro de la función.

El caso es que he ido comprobando poco a poco el código, comentando distintas partes de forma secuencial para eliminar posibles fuentes de error y mi problema solo aparece cuando entra en juego la función: Unity se congela, como cuando entra en funcionamiento un bucle infinito (lo que me lleva a pensar que puede ser algo relacionado con el bucle do-while, aunque no consigo ver qué).

Un saludo y gracias de antemano.
#4
General Programadores / Problema al compilar
28 de Agosto de 2015, 01:29:46 PM
Hola, introduzco el tema en esta categoría porque no encuentro otra más apropiada, dado que el tema no es exactamente de programación. Aun así, creo que es donde mejor encaja.

Pues bien, tras 3-4 meses de intenso trabajo, mi primer videojuego (un casual 2D medianamente sencillo para Android) está por fin terminado. Ahora bien, a la hora de compilar me salta este error por consola, lo que me impide obtener la APK y poder publicar mi juego:

Error building player: Win32Exception: ApplicationName='javac.exe', CommandLine='-bootclasspath "D:/Android SDK Tools/platforms/android-22\android.jar" -d "C:\Users\Public\Documents\Unity Projects\[nombre del proyecto]\Temp\StagingArea\bin\classes" -source 1.6 -target 1.6 -encoding UTF-8 "com\google\android\gms\R.java" "com\google\example\games\basegame\utils\R.java" "com\google\example\games\mainlibproj\R.java" "com\[nombredelgrupo]\[nombredelproyecto]\R.java", CurrentDirectory='C:\Users\Public\Documents\Unity Projects\[nombre del proyecto]\Temp\StagingArea\gen'

Solo por si es de valor saberlo, he introducido funciones sociales del servicio de juegos de Google Play (un marcador y varios logros). En cuanto al SDK de Android y el Jar de Java, los he actualizado esta misma mañana a la última versión disponible. ¿Alguien tiene alguna idea de cómo solucionar mi problema? Ya he preguntado también en otro sitio pero no han sabido ayudarme, o no por ahora, al menos. Si acudo a Stratos es porque realmente lo necesito y tengo una muy buena experiencia con los consejos que recibo aquí. ¡Strateros, a mí!

Gracias de antemano ^-^,
Ítizhor.
#5
Bien, he conseguido que funcione, pero ahora tengo otro problema: cuando toco cualquier punto de la pantalla, se activa lo que correspondería a tocar el layer ButtonLM ("Shoot").

¿Por qué se detecta el toque fuera de los colliders? ¿He indicado bien las fases?

Gracias de antemano,
Ítizhor.
#6
Ostras, ¡es verdad! No había caído en ese detalle :O.

Pero con los Debug.Log va a haber un problema: dado que no puedo probarlo en el mismo Unity (es código para input táctil) y las apps de simulación no me van, tendré que compilarlo entero para probarlo, lo cual no deja de ser un fastidio (se aceptan ideas sobre cómo adaptarlo a que sea también testeable desde el propio PC, je, je).

¡Pero gracias! Es algo que ni se me había pasado por la cabeza ;).

Qué haría yo sin tus consejos, ja, ja, ja.
#7
¡Hola!

Veréis, llevo varias semanas desarrollando un juego para Android y una de las últimas funcionalidades que tengo que añadir es el multitouch, para poder arrastrar un objeto y pulsar un botón a la vez. El caso es que por más que corrijo y reviso el script, no consigo que funcione. Os dejo aquí el código entero:


using UnityEngine;
using System.Collections;

public class MultitouchController : MonoBehaviour
{
   public int touches = Input.touchCount;

   public LayerMask buttonLM;
   public LayerMask spaceshipLM;
   
   public Transform spaceship;
   public GameObject touchCircleExternal;
   public GameObject touchCircleInternal;

   // Update is called once per frame
   void Update ()
   {
      if (touches > 0)
      {
         for (int repetition = 0; repetition < touches; repetition++)
         {
            Touch touch = Input.GetTouch (repetition);

            Ray touchRay = camera.ScreenPointToRay (touch.position);
            RaycastHit hit;

            if (Physics.Raycast (touchRay, out hit, buttonLM))
            {
               if (touch.phase == TouchPhase.Began)
               {
                  NotificationCenter.DefaultCenter ().PostNotification (this, "Shoot");
               }
            }

            if (Physics.Raycast (touchRay, out hit, spaceshipLM))
            {
                if (touch.phase == TouchPhase.Began)
               {
                  touchCircleExternal.renderer.enabled = false;
                  touchCircleInternal.renderer.enabled = false;
                  touchCircleExternal.animation.enabled = false;
                  touchCircleInternal.animation.enabled = false;
               }

               if (touch.phase == TouchPhase.Moved || touch.phase == TouchPhase.Stationary)
               {
                  spaceship.position = new Vector2 (spaceship.position.x + touch.position.x, spaceship.position.y + touch.position.y);
               }

               if (touch.phase == TouchPhase.Ended)
               {
                  touchCircleExternal.renderer.enabled = true;
                  touchCircleInternal.renderer.enabled = true;
                  touchCircleExternal.animation.enabled = true;
                  touchCircleInternal.animation.enabled = true;
               }
            }
         }
      }
   }
}


Como información de interés decir solo que el script está colocado en la cámara, y que ambos colliders (de la capa buttonLM y de la spaceshipLM) son 3D, para poder ser afectados por el Ray.

Saludos y gracias de antemano,
Ítizhor.
#8
Madre mía, Darago... ¿Cómo lo haces? Ya son tres veces (si no me equivoco) las que me sacas sin despeinarte de un apuro que me tenía arrinconado contra el muro de la desesperación. De nuevo, tu sabio consejo ha disuelto mi problema como el agua el azúcar, ¡rápidamente y con un final dulce!

Pronto tendré que empezar a pagarte, lo sé. ¿Aceptas oros de Azeroth, rupias de Hyrule, favs en alguna red social...?  ;)

Otra vez, gracias.
Ítizhor.
#9
¡Hola!

Veréis, llevo ya varias semanas rompiéndome la cabeza con lo mismo, y por más que busco, nada. El caso es que tengo un objeto que empieza con una animación, y la idea es que al entrar en contacto con otro en particular salte (cambie) una variable booleana en el Animator y, suponiendo el estado "true" al que cambia la condición de transición, cambiar la animación.
Básicamente: colisión de trigger -> cambio de booleano -> transición de animación.

El script es el siquiente:

using UnityEngine;
using System.Collections;

public class Explosion : MonoBehaviour
{
   Animator explosion;

   // Connect to the animator
   void awake ()
   {
      explosion = GetComponent<Animator> ();
   }

   // Detect the impact
   void OnTriggerEnter2D (Collider2D other)
   {
      if (other.gameObject.tag == "Missile")
      {
         Debug.Log ("Set explosion");
         explosion.SetBool ("Impact", true);
         // Explosion sound
         Destroy (other.gameObject);
      }
   }
}


La consola reporta el "Set explosion" del Debug.Log, así que queda confirmado que sí se detecta la colisión con el trigger. Ahora bien, al ejecutar explosion.SetBool ("Impact", true); (siendo "Impact" la variable del Animator) me sale el error

NullReferenceException: Object reference not set to an instance of an object
Explosion.OnTriggerEnter2D (UnityEngine.Collider2D other) (at Assets/Scripts/Explosion.cs:20)
.

He buscado tanto sobre el error en concreto como sobre temas como el uso de animaciones, pero sigo igual de encasquillado. Se supone que estoy haciendo referencia a algo que no existe... pero no entiendo por qué  ^_^'.
¿Alguna sugerencia?

Muchas gracias de antemano,
Ítizhor.
#10
Buenas y gracias por la respuesta.

He estado buscando sitios de descarga de música bajo licencia pública y uno de los que he encontrado, claro, ha sido SoundCloud. Y, casualidad, he dado ahí con la canción que quería.

¿Significa eso que tengo vía libre? No lo creo, porque ahí también está la versión original de Lorde. Entonces, ¿qué portales son realmente de contenido bajo licencia pública?

Saludos,
Ítizhor.
#11
General Audio / Derechos de autor de canciones versionadas
14 de Mayo de 2015, 01:51:32 PM
Buenos días.

Tenía en mente producir un pequeño tráiler para un proyecto, y quería acompañarlo de una versión que he encontrado en YouTube de "Yellow Flicker Beat" de Lorde. (Tengo pensado vender el proyecto a bajo precio en alguna plataforma como Steam, pero el tráiler sería público y gratuito, obviamente; solo por dar más detalles).

El caso es que he estado mirando y, como siempre que busco sobre el tema, acabo casi con más dudas que al principio. Según he leído, al ser una cover técnicamente no se están violando los derechos del autor (siempre y cuando los sonidos no sean idénticos a los de la canción original, y bla, bla, bla), puesto que no es su producto. Eso sí, también he visto que se pueden buscar "puertas traseras" en la legislación que no concierne estrictamente a la autoría artística para sacar tajada al presunto infractor. Pero si la misma cover está en YouTube sin problemas, ¿no debería yo poder utilizarla igualmente sin trabas? Por si es necesario, si no me equivoco, la discográfica de Lorde es Universal Music Group.

¿Sabéis si podría utilizar la versión, o dónde buscar más información al respecto?

Gracias de antemano,
Ítizhor.
#12
Buenos días.

Estoy desarrollando un sencillo juego de plataformas en el que eres una nave espacial que ha de ir abriéndose paso a través de un traicionero mar de asteroides, Pues bien, necesito que la colisión mediante void OnTriggerEnter2D diferencie si el objeto colisionado es o no un asteroide. Así, el fragmento de código es el que sigue (siempre en C#):

// Detect collisions
void OnTriggerEnter2D (Collider2D other)
{
   if (other.gameObject.tag == "Asteroid")
   {
      Debug.Log ("if reproduces");
      currentLifes--;
      // Crash sound
      Destroy (other.gameObject);
   }
   else
   {
      Debug.Log ("else reproduces");
      NotificationCenter.DefaultCenter ().PostNotification (this, "RecoverAmmunition");
      Destroy (other.gameObject);
   }
}

Los asteroides están marcados con una etiqueta "Asteroid" (sí, he comprobado que la he indicado bien), y esos Debug son para revisiones de código. Así mismo, el NotificationCenter del else te redirige a otro script para regenerar un misil de munición.

Lo que ocurre es que todo se ejecuta correctamente sin reportar ningún tipo de error por consola, pero cuando la nave colisiona con otro objeto, sea o no sea este un asteroide, salta a ejecutar directamente el else.

Deduzco que si no da errores y ejecuta el else es porque no reconoce como verdadera la condición del if, lo que me lleva a la pregunta que tanto me trae de cabeza:
¿Estoy indicando bien la etiqueta?
Del mismo modo, ¿existe alguna otra forma de dar a entender al código la diferenciación de colisiones?

Gracias,
Ítizhor.
#13
Hola, veréis, estoy con un proyecto de desarrollo para Android y necesito introducir un input que me permita tocar y arrastrar el dedo sobre la pantalla para mover un objeto. El caso es que solo encuentro información sobre el pulso individual (un toque) y el multitouch, pero no sobre el arrastre.

He estado leyendo la sección correspondiente en el Scripting API de Unity y dando un par de vueltas por Google y YouTube pero nada, creo que ni siquiera sé cómo acercarme a la solución (¿será alguna clase de variación del toque individual, por ejemplo?).

Saludos y gracias.
#14
General Programadores / Re:Ayuda con un script en Unity 4.6
05 de Abril de 2015, 04:42:33 PM
¡Oh, gracias! De verdad, no sabes cuánto te lo agradezco. Mira que lo pensé, pero me pareció algo tan "de cuenta de la vieja" que no pensé que realmente el programa podría estar saltándose valores.

Finalmente quedó así, aplicado a la misma cámara para ahorrarme el GameObject:

using UnityEngine;
using System.Collections;

public class BaseGenerator : MonoBehaviour
{
   public GameObject terrain;

   float c = 0;

   // FixedUpdate is called once per time unit
   void FixedUpdate ()
   {
      Generate ();
   }

   // Generate the base terrain
   void Generate ()
   {
      if ((transform.position.x > c - 1) && (transform.position.x < c + 1))
      {
         Instantiate (terrain, new Vector2 (c + 13.35f, -4.56f), transform.rotation);
         c += 4.95f;
      }
   }
}

Y otra vez, ¡gracias!
#15
General Programadores / Ayuda con un script en Unity 4.6
05 de Abril de 2015, 02:26:16 PM
DUDA RESUELTA

¡Buenas!

Veréis, estoy envuelto en un proyecto de Unity desde hace algo más de un mes (el primero) y me he atascado con un script en concreto. Es un 2D runner, y estoy programando código para que una baldosa aparezca cada "x" espacio en la coordenada X para que genere un suelo continuo en el borde inferior de la pantalla.

Lo tengo así:

using UnityEngine;
using System.Collections;

public class BaseGenerator : MonoBehaviour
{
   public GameObject terrain;

   public Transform mainCamera;

   float i = 0;

   // Use this for initialization
   void Start ()
   {

   }
   
   // FixedUpdate is called once per time unit
   void FixedUpdate ()
   {
      Generate ();
   }

   // Generate the base terrain
   void Generate()
   {
      if (mainCamera.position.x == i)
      {
         Instantiate (terrain, new Vector2 (mainCamera.position.x + 13.35f, mainCamera.position.y - 4.56f), Quaternion.identity);
         i += 4.95f;
         Debug.Log (i);
      }
   }
}

Básicamente, hay tres objetos que es necesario indicar: la cámara, el terrain (ambos aparecen al principio del script) y el GameObject vacío que sirve de instanciador.

Como el generador está anidado en la cámara (parentado en la jerarquía), se mueve con respecto a esta y toma como referencia de coordenadas también la misma, de modo que en el Transform del GameObject las variables de posición no cambian. Así, y dado que lo que hace el script es generar las baldosas a medida que el instanciador avanza, he de indicar en el if las coordenadas de la cámara puesto que las del GO están estáticas (sé que se podría aplicar un script a la cámara diciéndole que crease en ese punto los terrains directamente, pero ya habrá tiempo para los arreglos cuando esto esté resuelto).
Además, he añadido al final un Debug.Log para recibir las notificaciones pertinentes por consola (lo eliminaré cuando por fin funcione).

El problema es que perfecto, genera la primera baldosa, la consola reporta el incremento de i (lo que significa también que el script reconoce la condición del if como correcta)... y ya está. No crea más terrains. Es como si el Generate solo se quisiera activar una vez.

Las dos posibles soluciones que soy capaz de intuir (que no de aplicar completamente, como este post evidencia jajaja) son:
-o que hay algo mal indicado en, probablemente, la función Generate,
-o que no he incluido la función correctamente en Start, Update o donde sea (tampoco acabo de comprender del todo las aplicaciones prácticas de cada una, conozco la teoría y lo que hacen a nivel de concepto pero luego me cuesta aplicarlo sin ayuda en algunos casos). Supongo que será en FixedUpdate (así es como está escrito, de hecho), pero no estoy del todo seguro.

Agradecería muchísimo ayuda de cualquier tipo, porque llevo ya varios días dándole vueltas, probando, buscando información y preguntando por ahí y nada. Todo iba rodado (más o menos jeje) hasta aquí, y veo que lo que tengo que hacer a continuación también es más sencillo, así que este bache me tiene "jodío".

¡Saludos!





Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.