Jump to content
UnitySpain

Search the Community

Showing results for tags 'c sharp'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Inicio
    • Proyectos
    • Offtopic
    • Unity Feeds
    • Website
  • Mesa de ayuda
    • Unity
    • Arte
    • Otras Especialidades
    • Builds & Dispositivos
  • Aportes de la Comunidad
    • Recursos
    • Eventos
    • Buenas Prácticas
  • Bolsa de trabajo & Colaboraciones
    • Ofertas y Demandas
  • Post Antiguos
    • General (Antiguo)

Blogs

  • byGui

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Especialidad

Found 11 results

  1. Buenas, he vuelto a trastear Unity desde hace mucho tiempo, con objetivo de hacer una app para recolección de ciertos datos agrícolas. He pensado en hacerlo todo con UI . El primer problema que me he encontrado es el siguiente: tengo una serie de textbox a la izquierda, con los nombres de los Traits que quiero tomar, y una serie de inputfileds a la derecha de cada uno, para introducir los datos recolectados. El caso es que dependiendo de la longitud del texto de los textbox, quisiera que los inputfileds se muevan hacia la derecha. (La idea es que puedas cambiar el texto del textbox desde la app) Lo que se me ha ocurrido es crear un script para acceder al componente rect transform y ampliarlo dependiendo del contenido del textbox, aunque no se como acceder al rect transform desde el script, y no se tampoco si puedo saber desde el script la longitud que ocupa el texto para dársela al textbox. Entiendo que si consigo hacer esto primero, bastaría con guardar la diferencia entre el tamaño inicial del textbox y el tamaño final, y sumar esa diferencia a la posición del inputfield. Bueno, quizás haya otra forma más sencilla de hacer esto, y estoy planteándolo de forma errónea. Cualquier orientación al respecto me vendría genial. Muchas gracias!!
  2. Saludos por acá, soy algo nuevo en esto, y estoy practicando para ir dominando poco a poco el C#. Pero mientras estaba haciendo un código me surgió una duda. Lo que sucede es que estoy haciendo como una especie de reproductor de música y entonces según la canción que esté tocando le pido que cargue una imagen para el fondo. Lo que me gustaría saber es si el código se podría optimizar más, para ir aprendiendo y ver como quedaría de una manera más profesional, porque me parece que en el modo que lo hice estoy consumiendo recursos en vano. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class MusicPlayer : MonoBehaviour { private int index = 0; public Image Wallpaper; // Use this for initialization void Start() { } // Update is called once per frame void Update() { // WALLPAPER CHECK switch (index % songs.Length) { case 0: Wallpaper.sprite = Resources.Load<Sprite>("Images/wallpaper_0"); break; case 1: Wallpaper.sprite = Resources.Load<Sprite>("Images/wallpaper_1"); break; case 2: Wallpaper.sprite = Resources.Load<Sprite>("Images/wallpaper_2"); break; } } } La cuestión es que creo que de este metodo estoy cargando "la misma imagen" una y otra y otra vez. O sea gastando memoria cargando el recurso una y otra vez. ¿Alguna recomendación que me puedan brindar? Si conociera la forma me gustaría de alguna manera "Cargar" todos los fondos una primera vez y luego solo decirle que cuando suene "X" canción se reemplace la imagen. Pero bueno, lo dejo a criterio de ustedes que tienen más experiencia. Saludos
  3. Hola, buenas a todos, sobre la duda que tengo es un poco “rara” de explicar, así que lo haré por guiones para que quede más esquemático: 1) Tengo en la escena un UI image, que está situado en el punto A de la foto adjunta 1 y 2 2) De donde he pulsado con el ratón en la UI image (punto A), a donde se encuentre el ratón manteniendo pulsado (punto B), me forma un vector. Este vector juntamente con el horizontal (AC), forman un ángulo, que es el que yo busco. 3) Hay que tener en cuenta que la UI image puede tener diferentes ángulos, y por eso el vector horizontal AC es respecto a la UI image y no respecto al escenario 2D (ejemplo foto 1 y 2) He hecho varios intentos, y con el que me he acercado más ha sido con que adjunto. Lo que he hecho ha sido crear una variable “coordRaton” que es el punto B de la foto. La variable “coordRatonPulsado” pretende guardar las coordenadas de donde se ha pulsado encima de la UI image (punto A). Para que me calcule el ángulo una vez he pulsado encima de la UI image estando encima de esta o no, he creado la variable “pulsado”. Para finalizar, dentro del condicional pulsado == 1, he cargado a la consola el valor del ángulo entre el vector AB (vectRadio) y AC (vectHorizontal). Pero no da el resultado deseado. Como se ve en la tercera imagen, cuando estoy en la izquierda marca 0º y a medida que voy trazando un semicírculo hacia arriba llego a 90º y después a 180º. El problema está en que cuando empiezo a descender el ratón, me marca los valores que están en rojo, y no los que están en negro que son los que quiero. Así pues, ¿cómo puedo hacer que me vaya de 0º hasta 360º, en vez de 0º a 180º y de 180º a 0º? Adjunto también un pequeño gif para acabar de aclarar la idea de la foto 3. Por favor, si alguien puede ayudarme se lo agradecería mucho, he hecho muchas pruebas y he buscado en muchos sitios, pero no he dado con la solución. Y si me he complicado mucho la vida con la idea o con el script proponedme otra alternativa más sencilla por favor. Muchas gracias por su tiempo y ayuda Vector2 coordRaton; Vector2 coordRatonPulsado; int pulsado; // 0 no pulsado y 1 sí pulsado void Update() { coordRaton = Input.mousePosition; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Debug.DrawRay(ray.origin, ray.direction * 100, Color.green); RaycastHit hit; if (Input.GetMouseButton(0) && Physics.Raycast(ray, out hit) == true) { if (hit.collider.name == "Image") { coordRatonPulsado = Input.mousePosition; pulsado = 1; } } if (Input.GetMouseButtonUp(0)) { pulsado = 0; } if (pulsado == 1) { Vector2 vectRadio = new Vector2(coordRatonPulsado.x - coordRaton.x, coordRatonPulsado.y - coordRaton.y); Vector2 vectHorizontal = new Vector2(coordRatonPulsado.x, 0); float grados = Vector2.Angle(vectRadio, vectHorizontal); Debug.Log(grados); } }
  4. Con este código creo una esfera al momento de ejecutarlo, como hago para que en el entorno 3D con un botón elimine esa esfera o cualquier cosa que este en ese momento en el entorno, gracias por su ayuda
  5. Hola. <3 Necesito resetear cada nivel, nose como hacerlo, conosco que existe la libreria "UnityEngine.SceneManagement", se como reiniciar una Scena mas omenos facilongo, pero necesito algo mas complejo... Cada ves que me caigo me reinicio PERO tengo que reiniciar mis plataformas, placas, Player,puntos, y algunas que otras cositas, MENOS la camara y la variable de rotacion de los puntos. Basicamente resetear determinadas cosas(GameObjects) de una scena. Para que?? Necesito mantener la fluides de mi camara, por ende no necesita ser reiniciada su pocision. - idem - de mi rotacion del score, reiniciando la posicion de los score(puntos), pero no la rotacion. Respuestas? Si puede haber. Saludos? Si hay. Abrazo? Tambien Espero respuestas Att: enelmenu Firma Oficial (R)
  6. Hola amigos, me interesa mucho su comunidad y ojala pueda ser un usuario activo para ofrecerles mi ayuda en cuanto a programacion, diseño y redaccion de historias ya que esta son las tres principales cosas que mas me gustan a eso tambien a organizar equipos ya que me gusta la Ing En Sistemas, espero poder ser de ayuda a ustedes y viceversa sin mas nada que decir los quiero <3 Saludos!
  7. Crear Plugins/Mods/Extensiones para tus juego de Unity Hola a todos, Quería compartir con todos la forma de crear plugins para sus juegos una vez ya acabados. No me liare mucho ya que es algo complejo y necesitas tiempo. Lo primero tienen que saber que esto no es añadir el sistema y ale! magia! ya pueden crear cualquier plugin..., Ustedes tienen que crear despues una Api con acceso a vuestro juego para que se pueda expandir. (Este sistema solo lo he probado en windows, esta claro que un *.dll no funcionara en otro sistema), También decir que no explicare que son los delegados ni ninguna clase que utilize, para aprender a programar ya hay otros tutoriales. Introducción: Haré una pequeña introducción de cómo funciona para comprender lo que hay que hacer. Crearemos un .dll que se incluirá dentro de unity antes de compilar el juego. (Sera el que cargue los demás .dll, Este será nuestra API también) Añadiremos un script para que llamen a ese dll anterior en el juego. Haremos una pequeña compilación de una escena para que veamos como funciona. Por último crearemos un plugin para añadir al juego. Creando la API y el cargador de plugins: Usaremos Visual Studio (La versión no importa yo uso 2015), con el lenguaje de programación C#. Creamos un nuevo proyecto con esta configuracion, ¡Recordar que los nombres son como vosotros querais, los mios seran orientativos, el nombre de los namespaces y los class y etc...! Tambien decir que todas las explicaciones estaran por comentarios en codigo (asi no tengo que estar cambiando ventana entre esto y los programas) Añadimos la referencia a la libreria de UnityEngine Para añadir una referencia Menu Visual Studio->Project->Add reference... La ruta de UnityEngine.dll: %Unity_Install_Path%\Editor\Data\Managed\UnityEngine.dll Vale Ahora crearemos Otra clase: Llamada Loader dentro de un nombre de espacios llamado APILoader using System; using System.Reflection; namespace APILoader { public static class Loader { } } Esta clase sera para cargar los scripts, luego haremos la clase API, con funciones publicas para llamarlas desde los plugins creados. using System; using System.Reflection; using System.IO; using System.Collections.Generic; namespace APILoader { /*Dentro de cada plugin podra habra dos funciones obligatorias que seran llamadas al inicio del juego y en cada frame * igual que haces en unity en void Start y void Update, nosotros haremos lo mismo con nuestros plugins */ public delegate void FunctionAtStart();//Creamos los delegados para añadir esas funciones y llamarlas cuando queramos. public delegate void FunctionAtUpdate(); public static class Loader { public static FunctionAtStart callAtStart;//Instanciamos los delegados public static FunctionAtUpdate callAtUpdate; //Ruta de la carpeta donde guardaremos los plugins en este caso es: donde se ejecute el programa + \Plugins\ public static string _PATH = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\Plugins\\"; public static void LoadExternalAssembled() { foreach (var eAssemb in Directory.GetFiles(_PATH)) //Hacemos un bucle para cargar todos los plugins de la carpeta { Assembly _current = Assembly.LoadFile(eAssemb);//Cargamos el plugin Type _typeof = _current.GetType("Plugin.External"); //Donde Plugin es el nombre el namespace del plugin y //external es la clase del plugin que cargaremos nosotros _typeof.GetMethod("load").Invoke(Activator.CreateInstance(_typeof), null); //Cargaremos la funcion load dentro del plugin, para que este se añada a los delegados y asi se ejecute segun corresponda } } } } Crearemos ahora otra clase llamada Functions dentro de un nombre de espacios llamado API using System; using UnityEngine; namespace API { class Functions { } } Aqui crearemos las funciones que el plugin podra usar. Yo haré solo unas pocas para que veais el funcionamiento. using System; using System.Collections.Generic; using UnityEngine; namespace API { public static class Functions { public static List<GameObject> reference; //Imaginaros que quereis hacer que el jugador tenga funciones en api //Lo añadiriamos desde unity aqui, para que cualquier plugin pueda hacerle //referencia. (Hare una funcion como ejemplo) public static GameObject getReference(string name) //retornara el gameobject segun un nombre si existe en la lista. { return reference.Find(g => g.name == name); } public static void changeColorOfMaterial(GameObject go, Color newColor) { go.GetComponent<Renderer>().material.color = newColor; //Esta funcion la usaremos para buscar un objeto en la lista "reference" y cambiarle el color. } public static void IntegerPlusPlus(ref int i) { i++; //Esta funcion incrementa 1 a la variable que le pasemos, la llamaremos dentro del update del plugin para //que veamos como se ejecuta. } public static string sayHelloWord() { return @"Hello World from APi"; //Esta es sencilla, solo retorna ese string. } } } Como veis es sencillo, Ya tenemos creado el Loader y la API. ¡Facíl! Preparando Unity: Ahora en Unity crearemos una carpeta llamada Plugins No nos confundamos ahora, esta carpeta sera para los plugins de Unity, como el ultimo que hemos creado, pero nosotros queremos hacer Plugins para nuestro juego y crearlos despues de compilar. Desde Visual Stuido compilaremos el proyecto antes creado, y lo arrastraremos a la carpeta que acabamos de crear, os tiene que quedar asi. Ese archivo es el .dll que generamos con Visual Studio. Ahora crearemos el script que cargar y ejecutara nuestros plugins. yo lo llamare pluginsLoader Aqui el codigo. using UnityEngine; using APILoader; //AQUI ESTOY LLAMANDO AL DLL QUE HEMOS CREADO!!!!!!!!!!!!!!!!!!!!!!!!!!!!! public class pluginsLoader : MonoBehaviour { void Awake () { Loader.LoadExternalAssembled(); //Llamamos a nuestra funcion creada dentro del dll para que cargue los plugins. } void Start () { Loader.callAtStart(); //Aqui estamos llamando a las funciones de los plugins start. } void Update () { Loader.callAtUpdate(); //Aqui llamamos a las funciones de los plugins update. } } Y no tiene mas misterio!, Esto lo añadimos a un object de la escena y listo. Ahora creamos Un objeto, en mi caso sera un cubo, para añadirlo a los objetos de referencia que pueden ser llamados desde la API (tendremos que modificar este ultimo script) using UnityEngine; using System.Collections.Generic; using APILoader; //AQUI ESTOY LLAMANDO AL DLL QUE HEMOS CREADO!!!!!!!!!!!!!!!!!!!!!!!!!!!!! using API; public class pluginsLoader : MonoBehaviour { public GameObject[] prefabsToReference; void Awake () { Loader.LoadExternalAssembled(); //Llamamos a nuestra funcion creada dentro del dll para que cargue los plugins. Functions.reference = new List<GameObject>(); Functions.reference.AddRange(prefabsToReference); } void Start () { Loader.callAtStart(); //Aqui estamos llamando a las funciones de los plugins start. } void Update () { Loader.callAtUpdate(); //Aqui llamamos a las funciones de los plugins update. } } Asi quedaria el script! Ahora creamos nuestro cubo y lo añadimos al Array de GameObjects que hemos creado. como el cubo se llama cubito, desde los plugins habra que buscar "cubito" vale, Por la parte de Unity ya esta!, Ahora crearemos nuestro plugin. Primero compilaremos este proyecto. Por un momento pense que no compilaria... ;) Creando un Plugin Para el juego: Lo primero que hay que hacer es: crear una carpeta dentro de: executable_Data\Managed\ llamada Plugins (para incluir nuestros plugins), executable_Data por que yo lo llame asi, cambiar segun el nombre que pusieron. Asi deberia quedar: Ahora volveremos a Visual Studio para hacer nuestro plugin. Crearemos un nuevo Proyecto, igual que el anterior pero con otro nombre Ahora pasare el codigo comentado para que vean como es, y FIN! (Veo que en vez de First puse Firs, menudo programador...) Recordar tambien añadir al proyecto de plugin la referencia de UnityEngine, y del DLL que habiamos creado llamado API! Aqui el codigo de nuestro plugin, como vereis este llama a las funciones de la API que habiamos creado. using API; using APILoader; using UnityEngine; namespace Plugin //Si recuerdan en el primer DLL para unity, dijimos que el nombre de espacios seria Plugin, y la clase External {//Si ustedes quieren cambiar estos datos, para que el nombre de espacios sea otro, tambien tienen que cambiarlo en la DLL de API public class External { static int i; public static void load()//Esta funcion es llamada desde el juego. { APILoader.Loader.callAtStart += start; //Y aqui añadimos las funciones a los delegados de nuestra api para que puedan ser APILoader.Loader.callAtUpdate += update;// llamadas a su momento. } static void start()//PONEMOS EN STATIC!! { API.Functions.changeColorOfMaterial(API.Functions.getReference("cubito"), Color.red); //Al comienzo de la escena, cambiara el color de cubito a rojo, si recordais, añadimos cubito a la referencia de objetos de la api } static void update() { i++; if(i>100)//Pasados 100 frames el cubo sera azul! API.Functions.changeColorOfMaterial(API.Functions.getReference("cubito"), Color.blue); } } } Una vez creado el DLL (compliado el plugin) lo añadiremos a la carpeta Plugins que hemos creado anteriormente. Subire el Proyecto ya compilado para que veais que funciona -> https://mega.nz/#!kBYEnBJb -Creo que soy el unico que no utiliza una pagina de publicidad en un link ;) Si os da algun error, antes de preguntarme aqui en el post, podeis mirar si es esto: Seleccion de diferente Framework en los DLL. Error en algun nombre. Error de seleccion de plataforma, en un sitio poneis para x64 en otro para x32 etc... Un Saludo a todos y espero que os sirva de ayuda!
  8. Buenas a todos, llevo unos días leyendo en el foro, viendo proyectos de usuarios, aportaciones, etc... Yo he hecho un tutorial de: Aprende C# creando un juego en Unity 5: de cero a experto, el curso para alguien como yo que tengo 0 de idea de programación está bien. Pero estoy a 7 clases de terminar y bueno... sé que tengo que poner de mi parte para aprender más. Alguien sabe alguna manera efectiva para aprender?, estuve buscando algún libro de C Sharp pero no veo nada interesante, espero sus consejos. Un saludo a todos
  9. Me encuentro bloqueado a la hora de ejecutar acciones tras un determinado tiempo. En este caso querría cambiar de escena tras cinco segundos de haber finalizado la partida, pero me ocurren varios problemas. Si pongo la velocidad a cero para que la bola no se mueva, desaparece el objeto por lo que desaparece el script y no llama a la siguiente escena. Y probando con la función Time.timeScale no parece hacer nada. Me gustaría saber la forma correcta de pausar el juego para después llamar a una función después de un tiempo específico. using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Threading; using UnityEngine.SceneManagement; public class Ball : MonoBehaviour { public float speed = 15; public int scoreFinal = 5; public Text scoreLeft; public Text scoreRight; public Text resultFinal; public int segundosAumentarVelocidad = 10; public AudioSource[] AudioClips = null; private float contadorSegundos = ; // Use this for initialization void Start () { AudioClips = GetComponents<AudioSource>(); GetComponent<Rigidbody2D>().velocity = Vector2.right * speed; } void FixedUpdate() { contadorSegundos += Time.smoothDeltaTime; //Aumentar la velocidad de la bola cada x segundos if(contadorSegundos >= segundosAumentarVelocidad) { speed = speed + 1; contadorSegundos = ; } } void OnCollisionEnter2D(Collision2D col) { //Golpea la pala izquierda if(col.gameObject.name == "RacketLeft") { //Se calcula el hitFactor float y = hitFactor(transform.position, col.transform.position, col.collider.bounds.size.y); //Calcular dirección Vector2 dir = new Vector2(1, y).normalized; //Asignar velocidad GetComponent<Rigidbody2D>().velocity = dir * speed; //Activar sonido //sonidoPala.Play(); AudioClips[].Play(); } //Golpea la pala derecha if (col.gameObject.name == "RacketRight") { //Se calcula el hitFactor float y = hitFactor(transform.position, col.transform.position, col.collider.bounds.size.y); //Calcular dirección Vector2 dir = new Vector2(-1, y).normalized; //Asignar velocidad GetComponent<Rigidbody2D>().velocity = dir * speed; //Activar sonido //sonidoPala.Play(); AudioClips[].Play(); } //Golpea las paredes arriba y abajo if (col.gameObject.name == "WallTop" || col.gameObject.name == "WallBottom") { //Activar sonido //sonidoPared.Play(); AudioClips[1].Play(); } //Golpea las paredes izquierda y derecha if (col.gameObject.name == "WallLeft" || col.gameObject.name == "WallRight") { //Activar sonido //sonidoPared.Play(); AudioClips[2].Play(); //Sumar puntos if(col.gameObject.name == "WallLeft") { scoreRight.text = (int.Parse(scoreRight.text) + 1).ToString(); if(int.Parse(scoreRight.text) == scoreFinal) { resultFinal.text = "El jugador " + 2 + " ha ganado"; //GetComponent<Rigidbody2D>().velocity = Vector2.right * 0; //speed = 0; Time.timeScale = ; //Al pasar cinco segundos salta a la escena de créditos //StartCoroutine(cambiarEscena()); //Invoke("cambiarEscena", 0.5f); Invoke("cambiarEscena", 5); } } else { scoreLeft.text = (int.Parse(scoreLeft.text) + 1).ToString(); if(int.Parse(scoreLeft.text) == scoreFinal) { resultFinal.text = "El jugador " + 1 + " ha ganado"; //GetComponent<Rigidbody2D>().velocity = Vector2.right * 0; //speed = 0; Time.timeScale = ; //Al pasar cinco segundos salta a la escena de créditos //StartCoroutine(cambiarEscena()); //Invoke("cambiarEscena", 0.5f); Invoke("cambiarEscena", 5); } } } } float hitFactor(Vector2 ballPos, Vector2 racketPos, float racketHeight) { return (ballPos.y - racketPos.y) / racketHeight; } /*private IEnumerator cambiarEscena() { Debug.Log("pr"); yield return new WaitForSeconds(5); Debug.Log("pr2"); SceneManager.LoadScene("Credits"); }*/ void cambiarEscena() { Debug.Log("pr"); SceneManager.LoadScene("Credits"); } }
  10. Hola como ya sabrán mi nombre por el titulo de post , les comento que soy programador de unity hace 4 años , fui instructor de unity un par de años tanto en videotutoriales , como en convenciones en facultades de manera física. Doy tutoriales en la plataforma tutellus por si alguien le interesa , tengo un diplomado en dicha plataforma. Pero ese no es el objetivo de mi presentación , todas las personas que tengan bastante experiencia en la materia y quieran intercambiar conocimientos , no duden en contactarme. Aqui les dejo mi perfil de tutellus: http://bit.ly/TDanilo Y bueno quiero entrar a este foro con el fin de aprender mas y de ayudar a los que pueda ayudar. Saludos a todos
  11. Saludos a todos. Estoy con un proyecto con la intención de sacarlo para Android e iOS, y necesito ayuda con el siguiente tema: Para hacer un selector de niveles actualizable, necesito que se instancie un "selector" por cada mundo o nivel del juego; y como el juego se irá actualizando, se vayan generando automáticamente más paneles de selección según se incrementan los mundos o niveles. En resumen, intentar hacer un script en C# con el que, al actualizar el juego, se muestre el mismo número de paneles que de mundos haya en cada momento. Dicho esto, cada mundo irá en una carpeta, y dentro de ella lo necesario para cada nivel. Por ende, necesito saber por scripting cuántas carpetas exiten dentro de la carpeta de resources, guardarlo como un int, y que se instancien tantos paneles como el int indique. ¿Alguna solución al problema? No se como buscarlo en internet, ya que es complicado de explicar. Muchas gracias de antemano.
×
×
  • Create New...